Skip to content

Pool

Main class for managing collections of data with metadata.

Constructor

typescript
const pool = new Pool<T>();

CRUD Operations

add()

Adds an entry to the pool.

typescript
pool.add(data: T, meta?: Record<string, any>): PoolEntry<T>

Example:

typescript
pool.add({ id: '1', name: 'test' }, { active: true });

addBatch()

Adds multiple entries at once.

typescript
pool.addBatch(entries: Array<{ data: T; meta?: Record<string, any> }>): void

Example:

typescript
pool.addBatch([
  { data: { id: '1', name: 'test1' } },
  { data: { id: '2', name: 'test2' } },
]);

remove()

Removes entries matching a predicate.

typescript
pool.remove(predicate: (data: T) => boolean): T[]

Example:

typescript
const removed = pool.remove(data => data.id === '1');

removeBatch()

Removes multiple entries using multiple predicates.

typescript
pool.removeBatch(predicates: Array<(data: T) => boolean>): T[]

Map-like Operations

get()

Gets an entry by field value or predicate.

typescript
pool.get(key: keyof T, value: any): T | null
pool.get(predicate: (entry: PoolEntry<T>) => boolean): T | null

Examples:

typescript
// By field
const user = pool.get('id', 'user123');

// By predicate
const admin = pool.get(({ data }) => data.role === 'admin');

has()

Checks if an entry exists.

typescript
pool.has(key: keyof T, value: any): boolean
pool.has(predicate: (entry: PoolEntry<T>) => boolean): boolean

Examples:

typescript
if (pool.has('id', 'user123')) {
  console.log('User exists');
}

set()

Updates an existing entry or adds a new one.

typescript
pool.set(key: keyof T, value: any, data: T, meta?: Record<string, any>): PoolEntry<T>

Example:

typescript
pool.set('id', 'user123', { id: 'user123', name: 'Updated' });

delete()

Removes an entry and returns true if found.

typescript
pool.delete(key: keyof T, value: any): boolean

Example:

typescript
const deleted = pool.delete('id', 'user123');

Iteration Methods

forEach()

Iterates over all entries.

typescript
pool.forEach(fn: (entry: PoolEntry<T>, index: number) => void): void

map()

Maps entries to a new array.

typescript
pool.map<U>(fn: (entry: PoolEntry<T>, index: number) => U): U[]

filter()

Filters entries.

typescript
pool.filter(fn: (entry: PoolEntry<T>, index: number) => boolean): PoolEntry<T>[]

reduce()

Reduces entries to a single value.

typescript
pool.reduce<U>(fn: (accumulator: U, entry: PoolEntry<T>, index: number) => U, initialValue: U): U

some()

Tests if any entry matches.

typescript
pool.some(fn: (entry: PoolEntry<T>, index: number) => boolean): boolean

every()

Tests if all entries match.

typescript
pool.every(fn: (entry: PoolEntry<T>, index: number) => boolean): boolean

find()

Finds the first matching entry.

typescript
pool.find(fn: (entry: PoolEntry<T>, index: number) => boolean): PoolEntry<T> | undefined

findIndex()

Finds the index of the first matching entry.

typescript
pool.findIndex(fn: (entry: PoolEntry<T>, index: number) => boolean): number

Query API

query()

Creates a query builder.

typescript
pool.query(): PoolQuery<T>

See PoolQuery for details.

Combining Pools

merge()

Merges another pool into this one.

typescript
pool.merge(other: Pool<T>): void

mergeUnique()

Merges with deduplication.

typescript
pool.mergeUnique(other: Pool<T>, key: keyof T | ((data: T) => any)): void

union()

Combines pools without duplicates.

typescript
pool.union(other: Pool<T>, compareFn: (a: T, b: T) => boolean): void

intersect()

Keeps only common elements.

typescript
pool.intersect(other: Pool<T>, compareFn: (a: T, b: T) => boolean): void

difference()

Removes common elements.

typescript
pool.difference(other: Pool<T>, compareFn: (a: T, b: T) => boolean): void

deduplicate()

Removes duplicates.

typescript
pool.deduplicate(key: keyof T | ((data: T) => any)): void

Transformations

clone()

Creates a copy of the pool.

typescript
pool.clone(): Pool<T>

partition()

Splits pool into two based on predicate.

typescript
pool.partition(predicate: (entry: PoolEntry<T>) => boolean): [Pool<T>, Pool<T>]

sample()

Returns random sample of entries.

typescript
pool.sample(count: number): Pool<T>

shuffle()

Shuffles entries in place.

typescript
pool.shuffle(): void

groupBy()

Groups entries by field or function.

typescript
pool.groupBy(key: keyof T | ((data: T) => any)): Map<any, Pool<T>>

Static Methods

Pool.merge()

Merges multiple pools.

typescript
Pool.merge<T>(...pools: Pool<T>[]): Pool<T>

Pool.mergeUnique()

Merges with deduplication.

typescript
Pool.mergeUnique<T>(pools: Pool<T>[], key: keyof T | ((data: T) => any)): Pool<T>

Pool.mergeUniqueWith()

Merges with custom conflict resolution.

typescript
Pool.mergeUniqueWith<T>(
  pools: Pool<T>[],
  key: keyof T | ((data: T) => any),
  resolver: (existing: PoolEntry<T>, duplicate: PoolEntry<T>) => PoolEntry<T>
): Pool<T>

Pool.intersect()

Finds common elements between two pools.

typescript
Pool.intersect<T>(pool1: Pool<T>, pool2: Pool<T>, compareFn: (a: T, b: T) => boolean): Pool<T>

Events

on()

Registers an event handler.

typescript
pool.on(event: string, handler: Function): void

Events:

  • 'add' - When entry is added
  • 'remove' - When entry is removed
  • 'get' - When entry is retrieved
  • 'set' - When entry is updated/added via set()
  • 'batchAdd' - When multiple entries are added
  • 'batchRemove' - When multiple entries are removed
  • 'beforeSelect' - Before selector is applied
  • 'afterSelect' - After selector is applied

Example:

typescript
pool.on('get', (entry) => {
  entry.meta.usedCount++;
  entry.meta.lastUsed = new Date();
});

off()

Unregisters an event handler.

typescript
pool.off(event: string, handler: Function): void

Properties

size

Number of entries in the pool.

typescript
pool.size: number

all

Array of all data objects.

typescript
pool.all: T[]

allEntries

Array of all pool entries.

typescript
pool.allEntries: PoolEntry<T>[]

Method Wrapping

wrap()

Wraps a method with custom behavior.

typescript
pool.wrap<K extends keyof Pool<T>>(
  method: K,
  wrapper: (original: Function, ...args: any[]) => any
): void

Example:

typescript
pool.wrap('add', (original, data, meta) => {
  console.log('Before add');
  const result = original(data, meta);
  console.log('After add');
  return result;
});