From ea844221b787479f13e3780206d2f212d978e86a Mon Sep 17 00:00:00 2001 From: Eugene Date: Thu, 3 Apr 2025 19:18:00 +0300 Subject: [PATCH] Little DX upgrade. Now .range() can return VOID. It means that user don't need to always return `true` to continue iteration, but user can break the iterations by returning `false`. --- src/bitmap.test.ts | 1 - src/bitmap.ts | 4 ++-- src/types.ts | 18 +++++++++++++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/bitmap.test.ts b/src/bitmap.test.ts index 6f88aff..9b21d43 100644 --- a/src/bitmap.test.ts +++ b/src/bitmap.test.ts @@ -68,7 +68,6 @@ describe("Bitmap", () => { bitmap.range((x) => { results.push(x); - return true; }); expect(results).toEqual([2, 4, 6, 8]); diff --git a/src/bitmap.ts b/src/bitmap.ts index f90fcb7..84591e6 100644 --- a/src/bitmap.ts +++ b/src/bitmap.ts @@ -100,14 +100,14 @@ export class Bitmap implements IBitmap { return result; } - public range(fn: (x: number) => boolean): void { + public range(fn: (x: number) => boolean | void): void { let needContinueIterating = true; for (let i = 0; i < this.bits.length; i++) { let x = this.bits[i]; for (let j = 0; j < 8; j++) { const bit = (x >> j) & 1; if (bit === 0) continue; - needContinueIterating = fn(i * 8 + j); + needContinueIterating = fn(i * 8 + j) ?? true; if (!needContinueIterating) break; } if (!needContinueIterating) break; diff --git a/src/types.ts b/src/types.ts index e195e0f..03aafab 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,19 +1,35 @@ export interface IBitmap { grow(x: number): void; + set(x: number): void; + remove(x: number): void; + contains(x: number): boolean; + count(): number; + and(bitmap: IBitmap): IBitmap; + andNot(bitmap: IBitmap): IBitmap; + or(bitmap: IBitmap): IBitmap; + xor(bitmap: IBitmap): IBitmap; - range(fn: (x: number) => boolean): void; + + range(fn: (x: number) => boolean | void): void; + filter(fn: (x: number) => boolean): void; + clear(): void; + clone(): IBitmap; + min(): number; + max(): number; + minZero(): number; + maxZero(): number; }