import { Buffer } from 'buffer'; export default class BitArray { private readonly byteArray: Uint8Array; constructor(input?: Buffer | number) { if (!input) { this.byteArray = new Uint8Array(); return; } if (typeof input === 'number') { this.byteArray = new Uint8Array(input); return; } this.byteArray = new Uint8Array(input); } set(index: number, value?: number): void { const bytePosition = Math.floor(index / 8); const bitPosition = index % 8; // eslint-disable-next-line no-bitwise const byteMask = 128 >> bitPosition; const byteValue = this.byteArray[bytePosition]; // eslint-disable-next-line no-bitwise this.byteArray[bytePosition] = byteMask | byteValue; } unset(index: number): void { const bytePosition = Math.floor(index / 8); const bitPosition = index % 8; const byteMask = 128 >> bitPosition; this.byteArray[bytePosition] = this.byteArray[bytePosition] & ~byteMask; } get(index: number): number { const bytePosition = Math.floor(index / 8); const bitPosition = index % 8; const byteValue = this.byteArray[bytePosition]; const bit = byteValue.toString(2).padStart(8, '0').at(bitPosition); return parseInt(bit, 10); } toArray(): Uint8Array { return this.byteArray; } }