extra-set
Version:
A pack of functions for working with Sets.<br>
420 lines (419 loc) • 15.5 kB
TypeScript
import type { MapFunction as IterableMapFunction } from "@nodef/extra-iterable";
/**
* Handle reading of a single value.
* @returns value
*/ export type ReadFunction<T> = () => T;
/**
* Handle combining of two values.
* @param a a value
* @param b another value
* @returns combined value
*/ export type CombineFunction<T> = (a: T, b: T) => T;
/**
* Handle comparison of two values.
* @param a a value
* @param b another value
* @returns a<b: -ve, a=b: 0, a>b: +ve
*/ export type CompareFunction<T> = (a: T, b: T) => number;
/**
* Handle processing of values in a set.
* @param v value in set
* @param k key of value in set (= value)
* @param x set containing the value
*/ export type ProcessFunction<T> = (v: T, k: T, x: Set<T>) => void;
/**
* Handle selection of values in a set.
* @param v value in set
* @param k key of value in set (= value)
* @param x set containing the value
* @returns selected?
*/ export type TestFunction<T> = (v: T, k: T, x: Set<T>) => boolean;
/**
* Handle transformation of a value to another.
* @param v value in set
* @param k key of value in set (= value)
* @param x set containing the value
* @returns transformed value
*/ export type MapFunction<T, U> = (v: T, k: T, x: Set<T> | null) => U;
/**
* Handle reduction of multiple values into a single value.
* @param acc accumulator (temporary result)
* @param v value in set
* @param k key of value in set (= value)
* @param x set containing the value
* @returns reduced value
*/ export type ReduceFunction<T, U> = (acc: U, v: T, k: T, x: Set<T>) => U;
/**
* Handle ending of a combined set.
* @param dones iᵗʰ set done?
* @returns combined set done?
*/ export type EndFunction = (dones: boolean[]) => boolean;
/**
* Check if value is a set.
* @param v a value
* @returns v is a set?
*/ export declare function is(v: unknown): v is Set<unknown>;
/**
* List all values.
* @param x a set
* @returns v₀, v₁, ... | vᵢ ∈ x
*/ export declare function values<T>(x: Set<T>): IterableIterator<T>;
export { values as keys };
/**
* List all value-value pairs.
* @param x a set
* @returns [v₀, v₀], [v₁, v₁], ... | vᵢ ∈ x
*/ export declare function entries<T>(x: Set<T>): IterableIterator<[T, T]>;
/**
* Convert an iterable to set.
* @param x an iterable
* @param fm map function (v, i, x)
* @returns x as set
*/ export declare function from<T, U = T>(x: Iterable<T>, fm?: IterableMapFunction<T, U> | null): Set<T | U>;
/**
* Convert an iterable to set.
* @param x an iterable (updatable if set!)
* @returns x as set
*/ export declare function from$<T>(x: Iterable<T>): Set<T>;
/**
* Compare two sets.
* @param x a set
* @param y another set
* @returns x=y: 0, otherwise: -ve/+ve
*/ export declare function compare<T>(x: Set<T>, y: Set<T>): number;
/**
* Check if two sets are equal.
* @param x a set
* @param y another set
* @returns x = y?
*/ export declare function isEqual<T>(x: Set<T>, y: Set<T>): boolean;
/**
* Find the size of a set.
* @param x a set
* @returns |x|
*/ export declare function size<T>(x: Set<T>): number;
export { size as length };
/**
* Check if a set is empty.
* @param x a set
* @returns |x| = 0?
*/ export declare function isEmpty<T>(x: Set<T>): boolean;
/**
* Add a value to set.
* @param x a set
* @param v value
* @returns x ∪ \{v\}
*/ export declare function add<T>(x: Set<T>, v: T): Set<T>;
/**
* Add a value to set.
* @param x a set (updated)
* @param v value
* @returns x = x ∪ \{v\}
*/ export declare function add$<T>(x: Set<T>, v: T): Set<T>;
/**
* Delete a value from set.
* @param x a set
* @param v value
* @returns x \\ \{v\}
*/ export declare function remove<T>(x: Set<T>, v: T): Set<T>;
/**
* Delete a value from set.
* @param x a set (updated)
* @param v value
* @returns x = x \\ \{v\}
*/ export declare function remove$<T>(x: Set<T>, v: T): Set<T>;
/**
* Count values which satisfy a test.
* @param x a set
* @param ft test function (v, v, x)
* @returns Σtᵢ | tᵢ = 1 if ft(vᵢ) else 0; vᵢ ∈ x
*/ export declare function count<T>(x: Set<T>, ft: TestFunction<T>): number;
/**
* Count occurrences of values.
* @param x a set
* @param fm map function (v, v, x)
* @returns Map \{value ⇒ count\}
*/ export declare function countAs<T, U = T>(x: Set<T>, fm: MapFunction<T, T | U>): Map<T | U, number>;
/**
* Find smallest value.
* @param x a set
* @param fc compare function (a, b)
* @param fm map function (v, v, x)
* @returns v | v ≤ vᵢ; vᵢ ∈ x
*/ export declare function min<T, U = T>(x: Set<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): T | undefined;
/**
* Find largest value.
* @param x a set
* @param fc compare function (a, b)
* @param fm map function (v, v, x)
* @returns v | v ≥ vᵢ; vᵢ ∈ x
*/ export declare function max<T, U = T>(x: Set<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): T | undefined;
/**
* Find smallest and largest entries.
* @param x a set
* @param fc compare function (a, b)
* @param fm map function (v, v, x)
* @returns [min_value, max_value]
*/ export declare function range<T, U = T>(x: Set<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): [T | undefined, T | undefined];
/**
* Get first value from set (default order).
* @param x a set
* @param vd default value
* @returns v₀ if x ≠ Φ else vd | v₀ ∈ x
*/ export declare function head<T>(x: Set<T>, vd?: T): T | undefined;
/**
* Get a set without its first value (default order).
* @param x a set
* @returns x \\ \{v₀\} if x ≠ Φ else x | v₀ ∈ x
*/ export declare function tail<T>(x: Set<T>): Set<T>;
/**
* Keep first n values only (default order).
* @param x a set
* @param n number of values [1]
* @returns \{v₀, v₁, ...\} | vᵢ ∈ x and |\{v₀, v₁, ...\}| ≤ n
*/ export declare function take<T>(x: Iterable<T>, n?: number): Set<T>;
/**
* Keep first n values only (default order).
* @param x a set (updated)
* @param n number of values [1]
* @returns x = \{v₀, v₁, ...\} | vᵢ ∈ x and |\{v₀, v₁, ...\}| ≤ n
*/ export declare function take$<T>(x: Set<T>, n?: number): Set<T>;
/**
* Remove first n values (default order).
* @param x a set
* @param n number of values [1]
* @returns \{vₙ, vₙ₊₁, ...\} | vᵢ ∈ x and |\{vₙ, vₙ₊₁, ...\}| ≤ max(|x| - n, 0)
*/ export declare function drop<T>(x: Set<T>, n?: number): Set<T>;
/**
* Remove first n values (default order).
* @param x a set (updated)
* @param n number of values [1]
* @returns x = \{vₙ, vₙ₊₁, ...\} | vᵢ ∈ x and |\{vₙ, vₙ₊₁, ...\}| ≤ max(|x| - n, 0)
*/ export declare function drop$<T>(x: Set<T>, n?: number): Set<T>;
/**
* List all possible subsets.
* @param x a set
* @param n number of values [-1 ⇒ any]
* @returns elements selected by bit from 0..2^|x| if n<0; only of length n otherwise
*/ export declare function subsets<T>(x: Set<T>, n?: number): IterableIterator<Set<T>>;
/**
* Pick an arbitrary value.
* @param x a set
* @param fr random number generator ([0, 1))
* @returns vᵢ | vᵢ ∈ x
*/ export declare function randomValue<T>(x: Set<T>, fr?: ReadFunction<number>): T;
export { randomValue as randomKey };
export { randomValue as value };
export { randomValue as key };
/**
* Pick an arbitrary entry.
* @param x a set
* @param fr random number generator ([0, 1))
* @returns [vᵢ, vᵢ] | vᵢ ∈ x
*/ export declare function randomEntry<T>(x: Set<T>, fr?: ReadFunction<number>): [T, T];
export { randomEntry as entry };
/**
* Pick an arbitrary subset.
* @param x a set
* @param n number of values [-1 ⇒ any]
* @param fr random number generator ([0, 1))
* @returns \{vᵢ, vⱼ, ...\} | vᵢ, vⱼ, ... ∈ x; |\{vᵢ, vⱼ, ...\}| = |x| if n<0 else n
*/ export declare function randomSubset<T>(x: Set<T>, n?: number, fr?: ReadFunction<number>): Set<T>;
/**
* Checks if set has a subset.
* @param x a set
* @param y search subset
* @returns y ⊆ x?
*/ export declare function hasSubset<T>(x: Set<T>, y: Set<T>): boolean;
/**
* Check if set has a value.
* @param x a set
* @param v search value
* @returns v ∈ x?
*/ export declare function has<T>(x: Set<T>, v: T): boolean;
/**
* Find first value passing a test (default order).
* @param x a set
* @param ft test function (v, v, x)
* @returns first v | ft(v) = true; v ∈ x
*/ export declare function find<T>(x: Set<T>, ft: TestFunction<T>): T | undefined;
export { find as search };
/**
* Find all values passing a test.
* @param x a set
* @param ft test function (v, v, x)
* @returns [v₀, v₁, ...] | ft(vᵢ) = true; vᵢ ∈ x
*/ export declare function findAll<T>(x: Set<T>, ft: TestFunction<T>): T[];
export { findAll as searchAll };
/**
* Call a function for each value.
* @param x a set
* @param fp process function (v, v, x)
*/ export declare function forEach<T>(x: Set<T>, fp: ProcessFunction<T>): void;
/**
* Check if any value satisfies a test.
* @param x a set
* @param ft test function (v, v, x)
* @returns true if ft(vᵢ) = true for some vᵢ ∈ x
*/ export declare function some<T>(x: Set<T>, ft?: TestFunction<T> | null): boolean;
/**
* Check if all values satisfy a test.
* @param x a set
* @param ft test function (v, v, x)
* @returns true if ft(vᵢ) = true for all vᵢ ∈ x
*/ export declare function every<T>(x: Set<T>, ft?: TestFunction<T> | null): boolean;
/**
* Transform values of a set.
* @param x a set
* @param fm map function (v, v, x)
* @returns \{fm(v₀), fm(v₁), ...\} | vᵢ ∈ x
*/ export declare function map<T, U = T>(x: Set<T>, fm: MapFunction<T, T | U>): Set<T | U>;
/**
* Transform values of a set.
* @param x a set (updated)
* @param fm map function (v, v, x)
* @returns x = \{fm(v₀), fm(v₁), ...\} | vᵢ ∈ x
*/ export declare function map$<T>(x: Set<T>, fm: MapFunction<T, T>): Set<T>;
/**
* Reduce values of set to a single value.
* @param x a set
* @param fr reduce function (acc, v, v, x)
* @param acc initial value
* @returns fr(fr(acc, v₀), v₁)... | fr(acc, v₀) = v₀ if acc not given
*/ export declare function reduce<T, U = T>(x: Set<T>, fr: ReduceFunction<T, T | U>, acc?: T | U): T | U;
/**
* Keep values which pass a test.
* @param x a set
* @param ft test function (v, v, x)
* @returns \{v₀, v₁, ...\} | ft(vᵢ) = true; vᵢ ∈ x
*/ export declare function filter<T>(x: Set<T>, ft: TestFunction<T>): Set<T>;
/**
* Keep values which pass a test.
* @param x a set (updated)
* @param ft test function (v, v, x)
* @returns x = \{v₀, v₁, ...\} | ft(vᵢ) = true; vᵢ ∈ x
*/ export declare function filter$<T>(x: Set<T>, ft: TestFunction<T>): Set<T>;
/**
* Discard values which pass a test.
* @param x a set
* @param ft test function (v, v, x)
* @returns \{v₀, v₁, ...\} | ft(vᵢ) = false; vᵢ ∈ x
*/ export declare function reject<T>(x: Set<T>, ft: TestFunction<T>): Set<T>;
/**
* Discard values which pass a test.
* @param x a set (updated)
* @param ft test function (v, v, x)
* @returns x = \{v₀, v₁, ...\} | ft(vᵢ) = false; vᵢ ∈ x
*/ export declare function reject$<T>(x: Set<T>, ft: TestFunction<T>): Set<T>;
/**
* Flatten nested set to given depth.
* @param x a nested set
* @param n maximum depth [-1 ⇒ all]
* @param fm map function (v, v, x)
* @param ft flatten test function (v, v, x) [is]
* @returns flat set
*/ export declare function flat<T = unknown>(x: Set<T>, n?: number, fm?: MapFunction<T, unknown> | null, ft?: TestFunction<T> | null): Set<unknown>;
/**
* Flatten nested set, based on map function.
* @param x a nested set
* @param fm map function (v, v, x)
* @param ft flatten test function (v, v, x) [is]
* @returns flat set
*/ export declare function flatMap<T = unknown>(x: Set<T>, fm?: MapFunction<T, unknown> | null, ft?: TestFunction<T> | null): Set<unknown>;
/**
* Segregate values by test result.
* @param x a set
* @param ft test function (v, v, x)
* @returns [satisfies, doesnt]
*/ export declare function partition<T>(x: Set<T>, ft: TestFunction<T>): [Set<T>, Set<T>];
/**
* Segregates values by similarity.
* @param x a set
* @param fm map function (v, v, x)
* @returns Map \{key ⇒ values\}
*/ export declare function partitionAs<T, U = T>(x: Set<T>, fm: MapFunction<T, T | U>): Map<T | U, Set<T>>;
/**
* Break set into chunks of given size.
* @param x a set
* @param n chunk size [1]
* @param s chunk step [n]
* @returns [x[0..n], x[s..s+n], x[2s..2s+n], ...]
*/ export declare function chunk<T>(x: Set<T>, n?: number, s?: number): Set<T>[];
/**
* Append values from sets.
* @param xs sets
* @returns x₀ ∪ x₁ ∪ ... | [x₀, x₁, ...] = xs
*/ export declare function concat<T>(...xs: Set<T>[]): Set<T>;
/**
* Append values from sets.
* @param x a set (updated)
* @param ys other sets
* @returns x = x ∪ y₀ ∪ y₁ ∪ ... | [y₀, y₁, ...] = ys
*/ export declare function concat$<T>(x: Set<T>, ...ys: Iterable<T>[]): Set<T>;
/**
* Join values together into a string.
* @param x a set
* @param sep separator [,]
* @returns "$\{v₀\}$\{sep\}$\{v₁\}..." | vᵢ ∈ x
*/ export declare function join<T>(x: Set<T>, sep?: string): string;
/**
* Check if sets have no value in common.
* @param x a set
* @param y another set
* @returns x ∩ y = Φ?
*/ export declare function isDisjoint<T>(x: Set<T>, y: Iterable<T>): boolean;
/**
* Obtain values present in any set.
* @param x a set
* @param y another set
* @returns x ∪ y = \{v | v ∈ x or v ∈ y\}
*/ export declare function union<T>(x: Iterable<T>, y: Iterable<T>): Set<T>;
/**
* Obtain values present in any set.
* @param x a set (updated)
* @param y another set
* @returns x = x ∪ y = \{v | v ∈ x or v ∈ y\}
*/ export declare function union$<T>(x: Set<T>, y: Iterable<T>): Set<T>;
/**
* Obtain values present in both sets.
* @param x a set
* @param y another set
* @returns x ∩ y = \{v | v ∈ x, v ∈ y\}
*/ export declare function intersection<T>(x: Set<T>, y: Iterable<T>): Set<T>;
/**
* Obtain values present in both sets.
* @param x a set (updated)
* @param y another set
* @returns x = x ∩ y = \{v | v ∈ x, v ∈ y\}
*/ export declare function intersection$<T>(x: Set<T>, y: Set<T>): Set<T>;
/**
* Obtain values not present in another set.
* @param x a set
* @param y another set
* @returns x - y = \{v | v ∈ x, v ∉ y\}
*/ export declare function difference<T>(x: Set<T>, y: Set<T>): Set<T>;
/**
* Obtain values not present in another set.
* @param x a set (updated)
* @param y another set
* @returns x = x - y = \{v | v ∈ x, v ∉ y\}
*/ export declare function difference$<T>(x: Set<T>, y: Iterable<T>): Set<T>;
/**
* Obtain values not present in both sets.
* @param x a set
* @param y another set
* @returns x-y ∪ y-x
*/ export declare function symmetricDifference<T>(x: Set<T>, y: Set<T>): Set<T>;
/**
* Obtain values not present in both sets.
* @param x a set (updated)
* @param y another set
* @returns x = x-y ∪ y-x
*/ export declare function symmetricDifference$<T>(x: Set<T>, y: Iterable<T>): Set<T>;
/**
* List cartesian product of sets.
* @param xs sets
* @param fm map function (vs, vs)
* @returns x₀ × x₁ × ... = \{\{v₀, v₁, ...\} | v₀ ∈ x₀, v₁ ∈ x₁, ...]\}
*/ export declare function cartesianProduct<T, U = Set<T>>(xs: Set<T>[], fm?: MapFunction<Set<T>, Set<T> | U> | null): IterableIterator<Set<T> | U>;
export default cartesianProduct;