mirror of
https://github.com/robonen/tools.git
synced 2026-03-20 19:04:46 +00:00
refactor: change separate tools by category
This commit is contained in:
26
core/stdlib/src/bits/flags/index.test.ts
Normal file
26
core/stdlib/src/bits/flags/index.test.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { flagsGenerator } from '.';
|
||||
|
||||
describe('flagsGenerator', () => {
|
||||
it('generate unique flags', () => {
|
||||
const generateFlag = flagsGenerator();
|
||||
|
||||
const flag1 = generateFlag();
|
||||
const flag2 = generateFlag();
|
||||
const flag3 = generateFlag();
|
||||
|
||||
expect(flag1).toBe(1);
|
||||
expect(flag2).toBe(2);
|
||||
expect(flag3).toBe(4);
|
||||
});
|
||||
|
||||
it('throw an error if more than 31 flags are created', () => {
|
||||
const generateFlag = flagsGenerator();
|
||||
|
||||
for (let i = 0; i < 31; i++) {
|
||||
generateFlag();
|
||||
}
|
||||
|
||||
expect(() => generateFlag()).toThrow(new RangeError('Cannot create more than 31 flags'));
|
||||
});
|
||||
});
|
||||
22
core/stdlib/src/bits/flags/index.ts
Normal file
22
core/stdlib/src/bits/flags/index.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* @name flagsGenerator
|
||||
* @category Bits
|
||||
* @description Create a function that generates unique flags
|
||||
*
|
||||
* @returns {Function} A function that generates unique flags
|
||||
* @throws {RangeError} If more than 31 flags are created
|
||||
*
|
||||
* @since 0.0.2
|
||||
*/
|
||||
export function flagsGenerator() {
|
||||
let lastFlag = 0;
|
||||
|
||||
return () => {
|
||||
// 31 flags is the maximum number of flags that can be created
|
||||
// (without zero) because of the 32-bit integer limit in bitwise operations
|
||||
if (lastFlag & 0x40000000)
|
||||
throw new RangeError('Cannot create more than 31 flags');
|
||||
|
||||
return (lastFlag = lastFlag === 0 ? 1 : lastFlag << 1);
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user