パッケージの詳細

@blackglory/structures

BlackGlory7.6kMIT0.14.10

Common structures.

readme

structures

Common structures.

Install

npm install --save @blackglory/structures
# or
yarn add @blackglory/structures

API

Box

class Box<T> {
  get [Symbol.toStringTag](): string

  constructor(value: T)

  get(): T
  set(value: T): void
}

Cons

convertConsToArray

function convertConsToArray<T>([value, next]: Cons<T>): T[]

convertArrayToCons

function convertArrayToCons<T>([value, ...next]: T[]): Cons<T>

Array

sliceArrayLeft

function sliceArrayLeft<T>(arr: readonly T[], num: number): T[]

sliceArrayRight

function sliceArrayRight<T>(arr: readonly T[], num: number): T[]

truncateArrayLeft

function truncateArrayLeft(arr: unknown[], num: number): void

truncateArrayRight

function truncateArrayRight(arr: unknown[], num: number): void

clearArray

function clearArray(arr: unknown[]): void

Emitter

type Listener<Args extends unknown[]> = (...args: Args) => void

class Emitter<
  EventToArgs extends Record<Event, unknown[]> = Record<
    string | number | symbol
  , unknown[]
  >
, Event extends string | number | symbol = keyof EventToArgs
> {
  get [Symbol.toStringTag](): string

  on<T extends Event>(event: T, listener: Listener<EventToArgs[T]>): () => void
  once<T extends Event>(event: T, listener: Listener<EventToArgs[T]>): () => void
  emit<T extends Event>(event: T, ...args: EventToArgs[T]): void
  removeAllListeners<T extends Event>(event: T): void
}

GeneratorEmitter

type Listener<Args extends unknown[], Yield, Next> = (...args: Args) =>
| void
| Generator<Yield, void, Next>

class GeneratorEmitter<
  EventToArgs extends Record<Event, unknown[]> = Record<
    string | number | symbol
  , unknown[]
  >
, Event extends string | number | symbol = keyof EventToArgs
, Yield = unknown
, Next = unknown
> {
  get [Symbol.toStringTag](): string

  on<T extends Event>(
    event: T
  , listener: Listener<EventToArgs[T], Yield, Next>
  ): () => void

  once<T extends Event>(
    event: T
  , listener: Listener<EventToArgs[T], Yield, Next>
  ): () => void

  emit<T extends Event>(
    event: T
  , ...args: EventToArgs[T]
  ): Generator<Yield, void, Next>

  removeAllListeners<T extends Event>(event: T): void
}

AsyncGeneratorEmitter

type Listener<Args extends unknown[], Yield, Next> = (...args: Args) =>
| void
| Generator<Yield, void, Next>
| AsyncGenerator<Yield, void, Next>

class AsyncGeneratorEmitter<
  EventToArgs extends Record<Event, unknown[]> = Record<
    string | number | symbol
  , unknown[]
  >
, Event extends string | number | symbol = keyof EventToArgs
, Yield = unknown
, Next = unknown
> {
  get [Symbol.toStringTag](): string

  on<T extends Event>(event: T
  , listener: Listener<EventToArgs[T], Yield, Next>
  ): () => void

  once<T extends Event>(
    event: T
  , listener: Listener<EventToArgs[T], Yield, Next>
  ): () => void

  emit<T extends Event>(
    event: T
  , ...args: EventToArgs[T]
  ): AsyncGenerator<Yield, void, Next>

  removeAllListeners<T extends Event>(event: T): void
}

BigMap

class BigMap<K, V> implements Iterable<[K, V]> {
  get [Symbol.toStringTag](): string

  get size(): number

  set(key: K, value: V): void
  has(key: K): boolean
  get(key: K): V | undefined
  delete(key: K): boolean
  clear(): void

  entries(): IterableIterator<[K, V]>
  keys(): IterableIterator<K>
  values(): IterableIterator<V>
}

The Map that supports unlimited elements.

Note that BigMap cannot preserve the insertion order of elements.

// Map
const map = new Map()
for (let i = 0; i < 100_000_000; i++) {
  map.set(i, null) // RangeError
}
console.log('Never')

// BigMap
const { BigMap } = require('.')
const map = new BigMap()
for (let i = 0; i < 100_000_000; i++) {
  map.set(i, null)
}
console.log('Done')

BigSet

class BigSet<T> implements Iterable<T> {
  get [Symbol.toStringTag]: string

  get size(): number

  add(value: T): this
  has(value: T): boolean
  delete(value: T): boolean
  clear(): void

  values(): IterableIterator<T>
}

The Set that supports unlimited elements.

Note that BigSet cannot preserve the insertion order of elements.

// Set
const set = new Set()
for (let i = 0; i < 100_000_000; i++) {
  set.add(i) // RangeError
}
console.log('Never')

// BigSet
const set = new BigSet()
for (let i = 0; i < 100_000_000; i++) {
  set.add(i)
}
console.log('Done')

HashMap

class HashMap<K, V, Hash = unknown> {
  get [Symbol.toStringTag](): string
  get size(): number

  constructor(hash: (key: K) => Hash)

  set(key: K, value: V): this
  has(key: K): boolean
  get(key: K): V | undefined
  delete(key: K): boolean
  clear(): void
}

HashSet

class HashSet<V, Hash = unknown> implements Iterable<V> {
  get [Symbol.toStringTag](): string
  get size(): number
  [Symbol.iterator](): IterableIterator<V>

  constructor(hash: (value: V) => Hash)

  add(value: V): this
  delete(value: V): boolean
  has(value: V): boolean
  get(value: V): V | undefined
  clear(): void
  keys(): IterableIterator<V>
  values(): IterableIterator<V>
}

LRUMap

class LRUMap<K, V> {
  get [Symbol.toStringTag](): string
  get size(): number

  constructor(limit: number)

  set(key: K, value: V): this
  has(key: K): boolean
  get(key: K): V | undefined
  delete(key: K): boolean
  clear(): void
}

ExpirableMap

class ExpirableMap<K, V> {
  get[Symbol.toStringTag](): string
  get size(): number

  constructor()

  set(key: K, value: V, timeToLive?: number = Infinity): this
  has(key: K): boolean
  get(key: K): V | undefined
  delete(key: K): boolean
  clear(): void
}

TLRUMap

class TLRUMap<K, V> {
  get[Symbol.toStringTag](): string
  get size(): number

  constructor(limit: number)

  set(key: K, value: V, timeToLive?: number = Infinity): this
  has(key: K): boolean
  get(key: K): V | undefined
  delete(key: K): boolean
  clear(): void
}

Queue

class Queue<T> {
  get [Symbol.toStringTag](): string
  get size(): number

  empty(): void
  enqueue(...items: T[]): void
  dequeue(): T | undefined
  remove(item: T): void
}

TrieMap

class TrieMap<K extends Iterable<T>, V, T = unknown> {
  get [Symbol.toStringTag](): string

  keys(): IterableIterator<T[]>
  values(): IterableIterator<V>
  entries(): IterableIterator<[key: T[], value: V]>

  set(key: K, value: V): this
  has(key: K): boolean
  get(key: K): V | undefined
  delete(key: K): boolean
}

Note that you might expect this data structure to be more space efficient than BigMap, but it doesn't. In V8, it can only store about 80% of data of BigMap.

StringTrieMap

class StringTrieMap<T> {
  get [Symbol.toStringTag](): string

  keys(): IterableIterator<string>
  values(): IterableIterator<T>
  entries(): IterableIterator<[key: string, value: T]>

  set(key: string, value: T): this
  has(key: string): boolean
  get(key: string): T | undefined
  delete(key: string): boolean
}

Note that you might expect this data structure to be more space efficient than BigMap, but it doesn't. In V8, it can only store about 80% of data of BigMap.

RadixTree

class RadixTree<K extends Iterable<T>, V, T = unknown> {
  get [Symbol.toStringTag](): string

  entries(): IterableIterator<[key: T[], value: V]>
  keys(): IterableIterator<T[]>
  values(): IterableIterator<V>

  set(key: K, value: V): this
  has(key: K): boolean
  get(key: K): V | undefined
  delete(key: K): boolean
}

Note that you might expect this data structure to be more space efficient than BigMap, but it doesn't. In V8, it can only store about 80% of data of BigMap.

StringRadixTree

class StringRadixTree<T> {
  get [Symbol.toStringTag](): string

  keys(): IterableIterator<string>
  values(): IterableIterator<T>
  entries(): IterableIterator<[key: string, value: T]>

  set(key: string, value: T): this
  has(key: string): boolean
  get(key: string): T | undefined
  delete(key: string): boolean
}

Note that you might expect this data structure to be more space efficient than BigMap, but it doesn't. In V8, it can only store about 80% of data of BigMap.

SparseSet

class SparseSet implements Iterable<number> {
  get [Symbol.toStringTag](): string
  get [Symbol.iterator](): IterableIterator<number>
  get size(): number

  constructor(array?: number[])

  values(): IterableIterator<number>

  has(value: number): boolean
  add(value: number): void
  delete(value: number): boolean
  clear(): void

  clone(): SparseSet
}

SparseMap

class SparseMap<T> {
  get [Symbol.toStringTag](): string
  get size(): number

  /**
   * `SparseMap` cannot respond to any operations on the internal array,
   * you must ensure that indexes accessed are less than the length of `SparseMap`.
   * 
   * Keys do not correspond to indexes of the array.
   */
  get internalArray(): T[]

  entries(): IterableIterator<[key: number, value: T]>
  keys(): IterableIterator<number>
  values(): IterableIterator<T>

  getInternalIndexOfKey(key: number): number | undefined

  has(key: number): boolean
  get(key: number): T | undefined
  set(key: number, value: T): void
  delete(key: number): void
  clear(): void
}

DynamicTypedArray

class DynamicTypedArray<T extends TypedArrayConstructor> {
  get [Symbol.toStringTag](): string
  get BYTES_PER_ELEMENT(): number
  get capacity(): number
  get length(): number
  readonly growthFactor: number

  /**
   * `DynamicTypedArray` cannot respond to any operations on the internal array,
   * you must ensure that indexes accessed are less than the length of `DynamicTypedArray`.
   */
  get internalTypedArray(): TypedArrayOfConstructor<T>

  constructor(
    typedArrayConstructor: T
  , options?: {
      capacity?: number = 0
      growthFactor?: number = 1.5
    }
  )

  set(index: number, value: number): void
  setValues(index: number, values: TypedArrayOfConstructor<T>): void
  get(index: number): number | undefined
  push(...values: number[]): void
  pop(): number | undefined
  clear(): void
  sort(compare?: (a: number, b: number) => number): void
}

TypedSparseSet

class TypedSparseSet<T extends UnsignedTypedArrayConstructor> {
  get [Symbol.toStringTag](): string
  get [Symbol.iterator](): IterableIterator<number>
  get size(): number

  constructor(array: DynamicTypedArray<T>)

  values(): IterableIterator<number>

  has(value: number): boolean
  add(value: number): void
  delete(value: number): boolean
  clear(): void
}

TypedSparseMap

class TypedSparseMap<T extends TypedArrayConstructor> {
  get [Symbol.toStringTag](): string
  get size(): number

  /**
   * `SparseMap` cannot respond to any operations on the internal array,
   * you must ensure that indexes accessed are less than the length of `SparseMap`.
   * 
   * Keys do not correspond to indexes of the array.
   */
  get internalTypedArray(): TypedArrayOfConstructor<T>

  constructor(array: DynamicTypedArray<T>)

  entries(): IterableIterator<[key: number, value: number]>
  keys(): IterableIterator<number>
  values(): IterableIterator<number>

  getInternalIndexOfKey(key: number): number | undefined

  has(key: number): boolean
  get(key: number): T | undefined
  set(key: number, value: number): void
  delete(key: number): void
  clear(): void
}

SortedSet

class SortedSet<T> {
  get [Symbol.toStringTag](): string
  [Symbol.iterator](): IterableIterator<T>

  constructor(compare: (a: T, b: T) => number)

  values(): IterableIterator<T>
  has(value: T): boolean
  add(value: T): void
  delete(value: T): void
}

BitSet

class BitSet {
  get [Symbol.toStringTag](): string
  get size(): number
  [Symbol.iterator](): IterableIterator<number>

  constructor(bitsPerElement: number = 8)

  values(): IterableIterator<number>

  has(value: number): boolean
  add(value: number): boolean
  delete(value: number): boolean
  clear(): void

  clone(): BitSet
}

Due to the length of arrays supported by JavaScript, BitSet cannot support very large values.

TypedBitSet

class TypedBitSet<T extends UnsignedTypedArrayConstructor> {
  get [Symbol.toStringTag](): string
  get size(): number
  [Symbol.iterator](): IterableIterator<number>

  constructor(array: DynamicTypedArray<T>)

  values(): IterableIterator<number>

  has(value: number): boolean
  add(value: number): boolean
  delete(value: number): boolean
  clear(): void
}

Due to the length of arrays supported by JavaScript, TypedBitSit cannot support very large values.

DisjointSet

class DisjointSet {
  has(value: number): boolean
  sets(): number[][]

  makeSet(value: number): number
  union(a: number, b: number): void
  find(value: number): number
}

更新履歴

Changelog

All notable changes to this project will be documented in this file. See standard-version for commit guidelines.

0.14.10 (2025-01-05)

Features

0.14.9 (2024-09-23)

Features

  • hash-set: add get method (6055ced)

0.14.8 (2024-09-23)

Features

  • hash-set: add keys to implement ReadonlySetLike<V> (0053ba3)

0.14.7 (2024-09-04)

0.14.6 (2024-09-04)

Features

  • sparse-set: add clone method (1b93d7f)

0.14.5 (2024-09-04)

Features

  • bit-set: add clone method (b67796a)

0.14.4 (2024-08-28)

Features

0.14.3 (2024-05-01)

Features

0.14.2 (2024-04-17)

0.14.1 (2024-04-17)

Features

  • add GeneratorEmitter, AsyncGeneratorEmitter (43a4952)

0.14.0 (2024-02-15)

⚠ BREAKING CHANGES

  • Node.js v16 => Node.js v18.17

  • upgrade dependencies (c9f8137)

0.13.4 (2023-06-11)

Bug Fixes

0.13.3 (2023-03-18)

Features

  • emitter: add removeAllListeners method (280f193)

0.13.2 (2023-03-18)

0.13.1 (2023-01-22)

0.13.0 (2023-01-21)

⚠ BREAKING CHANGES

  • CommonJS => ESM

  • commonjs => esm (ac144c4)

0.12.3 (2023-01-21)

0.12.2 (2022-12-29)

Bug Fixes

  • BitSet#clear, TypedBitSet#clear (ba0dc39)

0.12.1 (2022-12-29)

0.12.0 (2022-12-29)

⚠ BREAKING CHANGES

  • The minimal version of Node.js is 16

Features

0.11.8 (2022-12-27)

Features

  • add DynamicTypedArray#setValues (64efeb8)

0.11.7 (2022-12-25)

Features

0.11.6 (2022-12-10)

0.11.5 (2022-11-29)

Features

0.11.4 (2022-11-03)

0.11.3 (2022-09-24)

0.11.2 (2022-09-24)

0.11.1 (2022-09-24)

Features

  • add isAdded as return values of add() methods (afcf19c)

0.11.0 (2022-09-24)

⚠ BREAKING CHANGES

  • Removed FiniteStateMachine, ObservableFiniteStateMachine

  • remove FiniteStateMachine, ObservableFiniteStateMachine (d88c373)

0.10.22 (2022-09-21)

Bug Fixes

0.10.21 (2022-09-21)

Bug Fixes

  • the range of bitsPerElement (ced54f8)

0.10.20 (2022-09-21)

Bug Fixes

  • the parameters bitsPerElement of BitSet and TypedBitSet (008dc5b)

0.10.19 (2022-09-20)

0.10.18 (2022-09-20)

Bug Fixes

  • BitSet.size, TypedBitSet.size (3d87222)

0.10.17 (2022-09-20)

0.10.16 (2022-09-20)

0.10.15 (2022-09-16)

Features

0.10.14 (2022-08-26)

Features

0.10.13 (2022-08-24)

Bug Fixes

0.10.12 (2022-08-24)

Features

  • add getInternalIndexOfKey methods (a556464)

0.10.11 (2022-08-23)

Features

  • add internalArray, internalTypedArray (e98c32c)

0.10.10 (2022-08-23)

Features

0.10.9 (2022-08-22)

Features

0.10.8 (2022-08-22)

Features

  • add return values for delete methods (01fc914)

0.10.7 (2022-08-22)

Features

  • add a return value for delete (a84b0b7)

0.10.6 (2022-08-22)

0.10.5 (2022-08-22)

0.10.4 (2022-08-21)

Features

0.10.3 (2022-08-21)

Features

0.10.2 (2022-08-21)

0.10.1 (2022-08-21)

Features

0.10.0 (2022-08-20)

⚠ BREAKING CHANGES

  • Changed constructor of TypedSparseMap
  • Changed constructor of TypedSparseSet

Features

0.9.0 (2022-08-20)

⚠ BREAKING CHANGES

  • SparseSet => TypedSparseSet SparseMap => TypedSparseMap

Features

  • add old SparseMap, SparseSet back (c583440)

0.8.0 (2022-08-20)

⚠ BREAKING CHANGES

  • Changed constructor of SparseMap
  • Changed constructor of SparseSet

Features

  • add options (d2711d3)
  • add typedArrayConstructor support (d2ed5d1)
  • add typedArrayConstructor support (ec0d078)

0.7.0 (2022-08-20)

⚠ BREAKING CHANGES

  • Rewrited SparseMap
  • SparseSet.remove => SparseSet.delete

Features

  • rename remove to delete (c8a1a65)
  • replace Array with DynamicTypedArray (db8859d)

0.6.10 (2022-08-19)

Bug Fixes

0.6.9 (2022-08-18)

0.6.8 (2022-08-18)

0.6.7 (2022-08-16)

Features

  • add internalTypedArray getter (30e1d29)

0.6.6 (2022-08-16)

Features

0.6.5 (2022-08-16)

Features

0.6.4 (2022-08-15)

0.6.3 (2022-08-15)

Features

0.6.2 (2022-07-31)

Features

0.6.1 (2022-07-31)

Features

  • add entries, keys, values for TrieMap (9e7396c)

0.6.0 (2022-06-08)

⚠ BREAKING CHANGES

  • Emitter was rewritten.

Features

0.5.1 (2022-05-15)

0.5.0 (2022-05-15)

⚠ BREAKING CHANGES

  • types of Emitter changed

Features

  • improve types of Emitter (680ff61)

0.4.0 (2022-05-10)

⚠ BREAKING CHANGES

  • InstanceManager removed

Features

  • remove InstanceManager (deb689c)
  • InstanceManager: add removeInstance (23c5fa7)

0.3.7 (2022-05-08)

Bug Fixes

0.3.6 (2022-05-08)

Features

0.3.5 (2022-03-19)

0.3.4 (2022-02-15)

Features

  • add FiniteStateMachine#can (43a3f5f)

0.3.3 (2022-01-30)

0.3.2 (2022-01-05)

0.3.1 (2021-12-13)

Bug Fixes

  • add iterable-operator to dependencies (b6887a8)

0.3.0 (2021-12-13)

⚠ BREAKING CHANGES

  • Replace ObervableFiniteStateMachine.stateChangedObservable with observeStateChanges()

  • replace stateChangedObservable with observeStateChanges (9708384)

0.2.8 (2021-12-13)

Features

  • add FiniteStateMachine (219d440)
  • add ObservableFiniteStateMachine (49e3b97)

0.2.7 (2021-12-13)

Features

0.2.6 (2021-10-14)

0.2.5 (2021-09-16)

Features

0.2.4 (2021-09-15)

Bug Fixes

0.2.3 (2021-07-28)

Features

0.2.2 (2021-07-04)

0.2.1 (2021-05-16)

0.2.0 (2021-05-16)

⚠ BREAKING CHANGES

  • rewrite
  • rename LRU to LRUMap

Features

Bug Fixes

0.1.15 (2021-05-15)

Features

0.1.14 (2021-03-16)

Features

0.1.13 (2021-02-28)

Features

0.1.12 (2021-02-04)

0.1.11 (2021-02-03)

Bug Fixes

0.1.10 (2021-02-03)

0.1.9 (2021-01-20)

0.1.8 (2021-01-15)

Bug Fixes

0.1.7 (2021-01-15)

0.1.6 (2021-01-05)

Features

0.1.5 (2021-01-04)

Bug Fixes

0.1.4 (2021-01-03)

0.1.3 (2020-12-19)

Features

0.1.2 (2020-12-19)

Features

0.1.1 (2020-12-19)

Features

0.1.0 (2020-12-19)

Features