@nkisi/util v1.0.0-dev.20210630
Nkisi Util Library
The Nkisi Util library provides interfaces and implementations for ordering, equality, hashing, type conversions, iterators, builders, key-value maps, caches, and assertions.
Overview
Ordering, equality, and hashing
Nkisi Util exports Comparable, Equals, and HashCode interfaces that can
be implemented by ordered, equatable, and hashable classes, respectively.
export interface Comparable<T> {
compareTo(that: T): number;
}
export interface Equals {
equals(that: unknown): boolean;
}
export interface HashCode extends Equals {
hashCode(): number;
}The exported Objects object supports generic comparison, equality testing,
and hashing of arbitrary JavaScript values, including primitives, arrays, and
objects.
Objects.compare(x: unknown, y: unknown): 0 | 1 | -1 returns the relative
sort order of two comparable values. If x implements Comparable, then
Objects.compare delegates to x's compareTo method. If x and y are
both numbers, or both strings, they are compared lexicographically. If x
and y are both arrays, then each corresponding element is compared, in turn,
using Objects.compare. If x and y are both objects, then each entry is
compared first by key, then by value, using Objects.compare. Values of
incompatible types sort in a deterministic order based on type.
Objects.equal(x: unknown, y: unknown): boolean returns true if two values
are equivalent. If x implements Equals, then Objects.equal delegates to
x's equals method. If x and y are both primitives, then they are
compared by value. If x and y are both arrays, then each corresponding
element is tested for equality, in turn, using Objects.equal. If x and y
are both objects, then each entry is tested for equality furst by key, then by
value, using Objects.equal.
Objects.hash(x: unknown): number returns a consistent hash code for x.
If x implements HashCode, then Objects.hash delegate's to x's
hashCode method. If x is a primitive, it is hashed using the Murmur3
hashing algorithm. If x is an array, each element is hashed individually
using Objects.hash, and the hash codes of all elements get mixed together.
If x is an object, each entry has its key and value hashed using
Objects.hash, and the hash codes of all entries get mixed together.
The exported Murmur3 object implements the 32-bit
MurmurHash algorithm, version 3.
Type conversions
Nkisi Util provides two generic interfaces for converting between loosely
JavaScript values, and strongly typed TypeScript values, called FromAny and
ToAny.
export interface FromAny<T, U = T> {
fromAny(value: T | U): T;
}
export interface ToAny<T> {
toAny(): T;
}FromAny is implicitly implemented by classes that have a static fromAny
method that converts a loosely typed JavaScript value into a strongly typed
TypeScript value.
ToAny is implemented by classes that have a tonAny method that returns a
loosely typed JavaScript value. ToAny is used to abstract over the
conversion of strongly typed values to loosely typed values.
Iterator interfaces
Nkisi Util exports an ES6-compatible Iterator interface, as well as a
Cursor base class for positioned iterators.
export interface Iterator<T> {
next(): {value?: T, done: boolean};
}Builder interfaces
The exported Builder interface abstracts over construction of collections.
And the PairBuilder interface abstracts over construction of key-value maps,
and other pair-containing collections.
export interface Builder<I, O> {
push(...inputs: I[]): void;
bind(): O;
}
export interface PairBuilder<K, V, O> {
add(key: K, value: V): void;
bind(): O;
}Map interfaces
Nkisi Util defines three key-value map interfaces: an ES6-compatible Map
interface, as well as an OrderedMap interface, and a ReducedMap interface.
An OrderedMap has its entries sorted by key order. A ReducedMap is an
OrderedMap that memoizes partial combinations of sub-elements to support
efficient, incremental reduction of continuously mutating datasets.
Cache implementations
HashGenCacheMap and HashGenCacheSet implement efficient hashed generational
caches that discard the least recently used value with the worst hit rate per
hash bucket.
Assertions
The exported Assert interface provides a common API for constraint testing
and contract enforcement. The exported assert singleton provides a default
Assert implementation that throws AssertException on assert failure.
4 years ago