extra-iterable
Version:
An [iterable] is a sequence of values.<br>
880 lines (879 loc) • 36.3 kB
TypeScript
/** End of iterable. */ export declare const END: any;
/**
* 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 an iterable.
* @param v value in iterable
* @param i index of value in iterable
* @param x iterable containing the value
*/ export type ProcessFunction<T> = (v: T, i: number, x: Iterable<T>) => void;
/**
* Handle selection of values in an iterable.
* @param v value in iterable
* @param i index of value in iterable
* @param x iterable containing the value
* @returns selected?
*/ export type TestFunction<T> = (v: T, i: number, x: Iterable<T>) => boolean;
/**
* Handle transformation of a value to another.
* @param v value in iterable
* @param i index of value in iterable
* @param x iterable containing the value
* @returns transformed value
*/ export type MapFunction<T, U> = (v: T, i: number, x: Iterable<T> | null) => U;
/**
* Handle reduction of multiple values into a single value.
* @param acc accumulator (temporary result)
* @param v value in iterable
* @param i index of value in iterable
* @param x iterable containing the value
* @returns reduced value
*/ export type ReduceFunction<T, U> = (acc: U, v: T, i: number, x: Iterable<T>) => U;
/**
* Handle ending of a combined iterable.
* @param dones iᵗʰ iterable done?
* @returns combined iterable done?
*/ export type EndFunction = (dones: boolean[]) => boolean;
/**
* Check if value is an iterable.
* @param v a value
* @returns v is iterable?
*/ export declare function is(v: unknown): v is Iterable<unknown>;
/**
* Check if value is an iterator.
* @param v a value
* @returns v implements \{next(), return?(), throw?()\}?
*/ export declare function isIterator(v: unknown): v is Iterator<unknown>;
/**
* Check if value is a list (iterable & !string).
* @param v a value
* @returns v is list?
*/ export declare function isList<T>(v: Iterable<T>): boolean;
/**
* Get iterator of an iterable.
* @param x an iterable
* @returns x\[\<iterator\>\]()
*/ export declare function iterator<T>(x: Iterable<T>): Iterator<T>;
/**
* List all indices.
* @param x an iterable
* @returns 0, 1, ..., |x|-1
*/ export declare function keys<T>(x: Iterable<T>): IterableIterator<number>;
/**
* List all values.
* @param x an iterable
* @returns v₀, v₁, ... | vᵢ = x[i]
*/ export declare function values<T>(x: Iterable<T>): IterableIterator<T>;
export { values as toOnce };
/**
* List all index-value pairs.
* @param x an iterable
* @returns [0, v₀], [1, v₁], ... | vᵢ = x[i]
*/ export declare function entries<T>(x: Iterable<T>): IterableIterator<[number, T]>;
/**
* Convert an iterable-like to iterable.
* @param x an iterator/iterable
* @returns x as iterable
*/ export declare function from<T>(x: Iterator<T> | Iterable<T>): Iterable<T>;
/**
* Convert an iterator to iterable.
* @param x an iterator/iterable
* @returns x as iterable
*/ export declare function fromIterator<T>(x: Iterator<T>): Iterable<T>;
/**
* Generate iterable from given number range.
* @param v start number [0]
* @param V stop number, excluding [END]
* @param dv step size [1]
* @returns v, v+dv, v+2dv, ...
*/ export declare function fromRange(v?: number, V?: number, dv?: number): IterableIterator<number>;
/**
* Generate iterable from repeated function invocation.
* @param fn function (impure)
* @param args arguments
* @returns fn(...args), fn(...args), ...
*/ export declare function fromInvocation<T, A extends unknown[] = unknown[]>(fn: (...args: A) => T, ...args: A): IterableIterator<T>;
export { fromInvocation as fromCall };
/**
* Generate iterable from repeated function application.
* @param fm map function (v, i)
* @param v start value
* @returns v, fm(v), fm(fm(v)), ...
*/ export declare function fromApplication<T>(fm: MapFunction<T, T>, v: T): IterableIterator<T>;
export { fromApplication as fromApply };
/**
* Check if an iterable can iterated only once.
* @param x an iterable
* @returns x\[\<iterator\>\] = x?
*/ export declare function isOnce<T>(x: Iterable<T>): x is IterableIterator<T>;
/**
* Check if an iterable can be iterated many times.
* @param x an iterable
* @returns x\[\<iterator\>\] ≠ x?
*/ export declare function isMany<T>(x: Iterable<T>): x is Iterable<T>;
/**
* Convert a once-like iterable to many.
* @param x an iterable
* @param now consume immediately? [false]
* @returns x' | x' = x; x' can be iterated multiple times
*/ export declare function toMany<T>(x: Iterable<T>, now?: boolean): Iterable<T>;
export { toMany as many };
/**
* Generate a function that iterates over values upon invocation.
* @param x an iterable
* @returns fn | fn() → x[0], fn() → x[1], ...
*/ export declare function toInvokable<T>(x: Iterable<T>): () => T;
export { toInvokable as toCallable };
export { toInvokable as callable };
/**
* Check if an iterable is empty.
* @param x an iterable
* @returns |x| = 0?
*/ export declare function isEmpty<T>(x: Iterable<T>): boolean;
/**
* Find the length of an iterable.
* @param x an iterable
* @param i start index [0]
* @param I end index [END]
* @returns |x[i..I]|
*/ export declare function length<T>(x: Iterable<T>, i?: number, I?: number): number;
export { length as size };
/**
* Get zero-based index for element in iterable.
* @param x an iterable
* @param i index (-ve: from right)
* @returns i' | x[i'] = x[i]; i' ∈ [0, |x|]
*/ export declare function index<T>(x: Iterable<T>, i: number): number;
/**
* Get index range for part of iterable.
* @param x an iterable
* @param i start index (-ve: from right) [0]
* @param I end index (-ve: from right) [END]
* @returns [i', I'] | i' ≤ I'; i', I' ∈ [0, |x|]
*/ export declare function indexRange<T>(x: Iterable<T>, i?: number, I?: number): [number, number];
/**
* Compare two iterables.
* @param x an iterable
* @param y another iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns x<y: -1, x=y: 0, x>y: 1
*/ export declare function compare<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): number;
/**
* Check if two iterables are equal.
* @param x an iterable
* @param y another iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns x=y?
*/ export declare function isEqual<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): boolean;
/**
* Get value at index.
* @param x an iterable
* @param i index
* @returns x[i]
*/ export declare function get<T>(x: Iterable<T>, i: number): T | undefined;
/**
* Get values at indices.
* @param x an iterable
* @param is indices (sorted)
* @returns x[i₀], x[i₁], ... | [i₀, i₁, ...] = is
*/ export declare function getAll<T>(x: Iterable<T>, is: number[]): IterableIterator<T | undefined>;
/**
* Get value at path in a nested iterable.
* @param x a nested iterable
* @param p path
* @returns x[i₀][i₁][...] | [i₀, i₁, ...] = p
*/ export declare function getPath(x: Iterable<unknown>, p: number[]): unknown;
/**
* Check if nested iterable has a path.
* @param x a nested iterable
* @param p path
* @returns x[i₀][i₁][...] exists? | [i₀, i₁, ...] = p
*/ export declare function hasPath(x: Iterable<unknown>, p: number[]): boolean;
/**
* Set value at index.
* @param x an iterable
* @param i index
* @param v value
* @returns x' | x' = x; x'[i] = v
*/ export declare function set<T>(x: Iterable<T>, i: number, v: T): IterableIterator<T | undefined>;
/**
* Exchange two values.
* @param x an iterable
* @param i an index
* @param j another index
* @returns x' | x' = x; x'[i] = x[j]; x'[j] = x[i]
*/ export declare function swap<T>(x: Iterable<T>, i: number, j: number): IterableIterator<T | undefined>;
/**
* Remove value at index.
* @param x an iterable
* @param i index
* @returns x[0..i] ⧺ x[i+1..]
*/ export declare function remove<T>(x: Iterable<T>, i: number): IterableIterator<T>;
/**
* Count values which satisfy a test.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns Σtᵢ | tᵢ = 1 if ft(vᵢ) else 0; vᵢ ∈ x
*/ export declare function count<T>(x: Iterable<T>, ft: TestFunction<T>): number;
/**
* Count occurrences of values.
* @param x an array
* @param fm map function (v, i, x)
* @returns Map \{value ⇒ count\}
*/ export declare function countAs<T, U = T>(x: Iterable<T>, fm?: MapFunction<T, T | U> | null): Map<T | U, number>;
/**
* Find smallest value.
* @param x an iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns v | v ≤ vᵢ; vᵢ ∈ x
*/ export declare function min<T, U = T>(x: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): T | undefined;
/**
* Find largest value.
* @param x an iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns v | v ≥ vᵢ; vᵢ ∈ x
*/ export declare function max<T, U = T>(x: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): T | undefined;
/**
* Find smallest and largest values.
* @param x an iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns [min_value, max_value]
*/ export declare function range<T, U = T>(x: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): [T | undefined, T | undefined];
/**
* Find smallest entry.
* @param x an iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns [min_index, min_value]
*/ export declare function minEntry<T, U = T>(x: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): [number, T | undefined];
/**
* Find largest entry.
* @param x an iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns [max_index, max_value]
*/ export declare function maxEntry<T, U = T>(x: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): [number, T | undefined];
/**
* Find smallest and largest entries.
* @param x an iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns [min_entry, max_entry]
*/ export declare function rangeEntries<T, U = T>(x: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): [[number, T | undefined], [number, T | undefined]];
/**
* Get part of an iterable.
* @param x an iterable
* @param i start index (-ve: from right) [0]
* @param I end index (-ve: from right) [END]
* @returns x[i..I]
*/ export declare function slice<T>(x: Iterable<T>, i?: number, I?: number): IterableIterator<T>;
/**
* Get first value.
* @param x an iterable
* @param vd default value
* @returns x[0] || vd
*/ export declare function head<T>(x: Iterable<T>, vd?: T): T | undefined;
/**
* Get last value.
* @param x an iterable
* @param vd default value
* @returns x[|x|-1]
*/ export declare function last<T>(x: Iterable<T>, vd?: T): T | undefined;
/**
* Get values except first.
* @param x an iterable
* @returns x[1..|x|]
*/ export declare function tail<T>(x: Iterable<T>): IterableIterator<T>;
export { tail as shift };
/**
* Get values except last.
* @param x an iterable
* @returns x[0..|x|-1]
*/ export declare function init<T>(x: Iterable<T>): IterableIterator<T>;
export { init as pop };
/**
* Get values from left.
* @param x an iterable
* @param n number of values
* @returns x[0..n]
*/ export declare function left<T>(x: Iterable<T>, n: number): IterableIterator<T>;
/**
* Get values from right.
* @param x an iterable
* @param n number of values
* @returns x[-n..]
*/ export declare function right<T>(x: Iterable<T>, n: number): IterableIterator<T>;
/**
* Get values from middle.
* @param x an iterable
* @param i start index
* @param n number of values [1]
* @returns x[i..i+n]
*/ export declare function middle<T>(x: Iterable<T>, i: number, n?: number): IterableIterator<T>;
/**
* Keep first n values only.
* @param x an iterable
* @param n number of values [1]
* @returns x[0..n]
*/ export declare function take<T>(x: Iterable<T>, n?: number): IterableIterator<T>;
/**
* Keep last n values only.
* @param x an iterable
* @param n number of values [1]
* @returns x[-n..]
*/ export declare function takeRight<T>(x: Iterable<T>, n?: number): IterableIterator<T>;
/**
* Keep values from left, while a test passes.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns x[0..T-1] | ft(x[i]) = true ∀ i ∈ [0, T-1] & ft(x[T]) = false
*/ export declare function takeWhile<T>(x: Iterable<T>, ft: TestFunction<T>): IterableIterator<T>;
/**
* Keep values from right, while a test passes.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns x[T..] | ft(x[i]) = true ∀ i ∈ [T, |x|-1] & ft(x[T-1]) = false
*/ export declare function takeWhileRight<T>(x: Iterable<T>, ft: TestFunction<T>): IterableIterator<T>;
/**
* Discard first n values only.
* @param x an iterable
* @param n number of values [1]
* @returns x[n..]
*/ export declare function drop<T>(x: Iterable<T>, n?: number): IterableIterator<T>;
/**
* Discard last n values only.
* @param x an iterable
* @param n number of values [1]
* @returns x[0..-n]
*/ export declare function dropRight<T>(x: Iterable<T>, n?: number): IterableIterator<T>;
/**
* Discard values from left, while a test passes.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns x[T..] | ft(x[i]) = true ∀ i ∈ [0, T-1] & ft(x[T]) = false
*/ export declare function dropWhile<T>(x: Iterable<T>, ft: TestFunction<T>): IterableIterator<T>;
/**
* Discard values from right, while a test passes.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns x[0..T-1] | ft(x[i]) = true ∀ i ∈ [T, |x|-1] & ft(x[T-1]) = false
*/ export declare function dropWhileRight<T>(x: Iterable<T>, ft: TestFunction<T>): IterableIterator<T>;
/**
* Check if iterable has a value.
* @param x an iterable
* @param v search value
* @param i start index [0]
* @returns v ∈ x[i..]?
*/ export declare function includes<T>(x: Iterable<T>, v: T, i?: number): boolean;
/**
* Find first index of a value.
* @param x an iterable
* @param v search value
* @param i start index [0]
* @returns index of v in x[i..] if found else -1
*/ export declare function indexOf<T>(x: Iterable<T>, v: T, i?: number): number;
/**
* Find last index of a value.
* @param x an iterable
* @param v search value
* @param i start index [END-1]
* @returns last index of v in x[0..i] if found else -1
*/ export declare function lastIndexOf<T>(x: Iterable<T>, v: T, i?: number): number;
/**
* Find first value passing a test.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns first v | ft(v) = true; v ∈ x
*/ export declare function find<T>(x: Iterable<T>, ft: TestFunction<T>): T | undefined;
/**
* Find last value passing a test.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns last v | ft(v) = true; v ∈ x
*/ export declare function findRight<T>(x: Iterable<T>, ft: TestFunction<T>): T | undefined;
/**
* Scan from left, while a test passes.
* @param x an array
* @param ft test function (v, i, x)
* @returns first index where test fails
*/ export declare function scanWhile<T>(x: Iterable<T>, ft: TestFunction<T>): number;
/**
* Scan from right, while a test passes.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns first index where test passes till end
*/ export declare function scanWhileRight<T>(x: Iterable<T>, ft: TestFunction<T>): number;
/**
* Scan from left, until a test passes.
* @param x an array
* @param ft test function (v, i, x)
* @returns first index where test passes
*/ export declare function scanUntil<T>(x: Iterable<T>, ft: TestFunction<T>): number;
/**
* Scan from right, until a test passes.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns first index where test fails till end
*/ export declare function scanUntilRight<T>(x: Iterable<T>, ft: TestFunction<T>): number;
/**
* Find index of first value passing a test.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns first index of value, -1 if not found
*/ export declare function search<T>(x: Iterable<T>, ft: TestFunction<T>): number;
/**
* Find index of last value passing a test.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns last index of value, -1 if not found
*/ export declare function searchRight<T>(x: Iterable<T>, ft: TestFunction<T>): number;
/**
* Find indices of values passing a test.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns indices of value
*/ export declare function searchAll<T>(x: Iterable<T>, ft: TestFunction<T>): IterableIterator<number>;
/**
* Find first index of a value.
* @param x an iterable
* @param v search value
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns first index of value, -1 if not found
*/ export declare function searchValue<T, U = T>(x: Iterable<T>, v: T, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): number;
/**
* Find last index of a value.
* @param x an iterable
* @param v search value
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns last index of value, -1 if not found
*/ export declare function searchValueRight<T, U = T>(x: Iterable<T>, v: T, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): number;
/**
* Find indices of a value.
* @param x an iterable
* @param v search value
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns indices of value
*/ export declare function searchValueAll<T, U = T>(x: Iterable<T>, v: T, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): IterableIterator<number>;
/**
* Find first index of an infix.
* @param x an iterable
* @param y search infix
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns first i | x[i..i+|y|] = y else -1
*/ export declare function searchInfix<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): number;
/**
* Find last index of an infix.
* @param x an iterable
* @param y search infix
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns first i | x[i..i+|y|] = y else -1
*/ export declare function searchInfixRight<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): number;
/**
* Find indices of an infix.
* @param x an iterable
* @param y search infix
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns i₀, i₁, ... | x[j..j+|y|] = y; j ∈ [i₀, i₁, ...]
*/ export declare function searchInfixAll<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): IterableIterator<number>;
/**
* Find first index of a subsequence.
* @param x an iterable
* @param y search subsequence
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns start index of subsequence, -1 if not found
*/ export declare function searchSubsequence<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): number;
/**
* Check if iterable has a value.
* @param x an iterable
* @param v search value
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns v ∈ x?
*/ export declare function hasValue<T, U = T>(x: Iterable<T>, v: T, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): boolean;
/**
* Check if iterable starts with a prefix.
* @param x an iterable
* @param y search prefix
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns x[0..|y|] = y?
*/ export declare function hasPrefix<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): boolean;
/**
* Check if iterable ends with a suffix.
* @param x an iterable
* @param y seach suffix
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns x[|x|-|y|..] = y?
*/ export declare function hasSuffix<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): boolean;
/**
* Check if iterable contains an infix.
* @param x an iterable
* @param y search infix
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns x[i..I] = y for some i, I?
*/ export declare function hasInfix<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): boolean;
/**
* Check if iterable has a subsequence.
* @param x an iterable
* @param y search subsequence
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns x[i₀] ⧺ x[i₁] ⧺ ... = y, for some i₀, i₁, ...? | i₀ < i₁ < ...
*/ export declare function hasSubsequence<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): boolean;
/**
* Call a function for each value.
* @param x an iterable
* @param fp process function (v, i, x)
*/ export declare function forEach<T>(x: Iterable<T>, fp: ProcessFunction<T>): void;
/**
* Check if any value satisfies a test.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns true if ft(vᵢ) = true for some vᵢ ∈ x
*/ export declare function some<T>(x: Iterable<T>, ft?: TestFunction<T> | null): boolean;
/**
* Check if all values satisfy a test.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns true if ft(vᵢ) = true for all vᵢ ∈ x
*/ export declare function every<T>(x: Iterable<T>, ft?: TestFunction<T> | null): boolean;
/**
* Transform values of an iterable.
* @param x an iterable
* @param fm map function (v, i, x)
* @returns fm(v₀), fm(v₁), ... | vᵢ ∈ x
*/ export declare function map<T, U>(x: Iterable<T>, fm: MapFunction<T, U>): IterableIterator<U>;
/**
* Reduce values of iterable to a single value.
* @param x an iterable
* @param fr reduce function (acc, v, i, 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: Iterable<T>, fr: ReduceFunction<T, U>, acc?: U): U | undefined;
/**
* Keep the values which pass a test.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns v₀, v₁, ... | ft(vᵢ) = true; vᵢ ∈ x
*/ export declare function filter<T>(x: Iterable<T>, ft: TestFunction<T>): IterableIterator<T>;
export { filter as findAll };
/**
* Keep the values at given indices.
* @param x an iterable
* @param is indices (sorted)
* @returns v₀, v₁, ... | vᵢ = x[i]; i ∈ is
*/ export declare function filterAt<T>(x: Iterable<T>, is: number[]): IterableIterator<T>;
/**
* Discard the values which pass a test.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns v₀, v₁, ... | ft(vᵢ) = false; vᵢ ∈ x
*/ export declare function reject<T>(x: Iterable<T>, ft: TestFunction<T>): IterableIterator<T>;
/**
* Discard the values at given indices.
* @param x an iterable
* @param is indices (sorted)
* @returns v₀, v₁, ... | vᵢ = x[i]; i ∉ is
*/ export declare function rejectAt<T>(x: Iterable<T>, is: number[]): IterableIterator<T>;
/**
* Produce accumulating values.
* @param x an iterable
* @param fr reduce function (acc, v, i, x)
* @param acc initial value
* @returns fr(acc, v₀), fr(fr(acc, v₀), v₁), ... | fr(acc, v₀) = v₀ if acc not given
*/ export declare function accumulate<T, U = T>(x: Iterable<T>, fr: ReduceFunction<T, T | U>, acc?: T | U): IterableIterator<T | U>;
/**
* Flatten nested iterable to given depth.
* @param x a nested iterable
* @param n maximum depth (-1 ⇒ all)
* @param fm map function (v, i, x)
* @param ft flatten test (v, i, x) [isList]
* @returns flat iterable
*/ export declare function flat(x: Iterable<unknown>, n?: number, fm?: MapFunction<unknown, unknown> | null, ft?: TestFunction<unknown> | null): IterableIterator<unknown>;
/**
* Flatten nested iterable, based on map function.
* @param x a nested iterable
* @param fm map function (v, i, x)
* @param ft flatten test (v, i, x) [isList]
* @returns flat iterable
*/ export declare function flatMap(x: Iterable<unknown>, fm?: MapFunction<unknown, unknown> | null, ft?: TestFunction<unknown> | null): IterableIterator<unknown>;
/**
* Combine values from iterables.
* @param xs iterables
* @param fm map function (vs, i, xs)
* @param fe end function (dones) [some]
* @param vd default value
* @returns fm([x₀[0], x₁[0], ...]), fm([x₀[1], x₁[1], ...]), ...
*/ export declare function zip<T, U = T[]>(xs: Iterable<T>[], fm?: MapFunction<T[], T[] | U> | null, fe?: EndFunction | null, vd?: T): IterableIterator<T[] | U>;
/**
* Fill with given value.
* @param x an iterable
* @param v value
* @param i start index [0]
* @param I end index [END]
* @returns x' | x' = x; x'[i..I] = v
*/ export declare function fill<T>(x: Iterable<T>, v: T, i?: number, I?: number): IterableIterator<T>;
/**
* Add values to the end.
* @param x an iterable
* @param vs values to add
* @returns ...x, ...vs
*/ export declare function push<T>(x: Iterable<T>, ...vs: T[]): IterableIterator<T>;
/**
* Add values to the start.
* @param x an iterable
* @param vs values to add
* @returns ...vs, ...x
*/ export declare function unshift<T>(x: Iterable<T>, ...vs: T[]): IterableIterator<T>;
/**
* Copy part of iterable to another.
* @param x target iterable
* @param y source iterable
* @param j write index [0]
* @param i read start index [0]
* @param I read end index [END]
* @returns x[0..j] ⧺ y[i..I] ⧺ x[j+I-i..]
*/ export declare function copy<T>(x: Iterable<T>, y: Iterable<T>, j?: number, i?: number, I?: number): IterableIterator<T | undefined>;
/**
* Copy part of iterable within.
* @param x an iterable
* @param j write index [0]
* @param i read start index [0]
* @param I read end index [END]
* @returns x[0..j] ⧺ x[i..I] ⧺ x[j+I-i..]
*/ export declare function copyWithin<T>(x: Iterable<T>, j?: number, i?: number, I?: number): IterableIterator<T | undefined>;
/**
* Move part of iterable within.
* @param x an iterable
* @param j write index [0]
* @param i read start index [0]
* @param I read end index [END]
* @returns x[0..j] ⧺ x[i..I] ⧺ x[j..i] ⧺ x[I..]
*/ export declare function moveWithin<T>(x: Iterable<T>, j?: number, i?: number, I?: number): IterableIterator<T>;
/**
* Remove or replaces existing values.
* @param x an iterable
* @param i remove index [0]
* @param n number of values to remove [rest]
* @param vs values to insert
* @returns x[0..i] ⧺ vs ⧺ x[i+n..]
*/ export declare function splice<T>(x: Iterable<T>, i?: number, n?: number, ...vs: T[]): IterableIterator<T>;
/**
* Break iterable considering test as separator.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns x[j..k] ⧺ x[l..m] ⧺ ... | ft(x[i]) = true; i = 0..j / k..l / ...
*/ export declare function split<T>(x: Iterable<T>, ft: TestFunction<T>): IterableIterator<T[]>;
/**
* Break iterable considering indices as separator.
* @param x an iterable
* @param is indices (sorted)
* @returns x[j..k] ⧺ x[l..m] ⧺ ... | ft(x[i]) = true; i = 0..j / k..l / ...; i ∈ is
*/ export declare function splitAt<T>(x: Iterable<T>, is: number[]): IterableIterator<T[]>;
/**
* Break iterable when test passes.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns x[0..j] ⧺ x[j..k] ⧺ ... | ft(x[i]) = true; i = j, k, ...
*/ export declare function cut<T>(x: Iterable<T>, ft: TestFunction<T>): IterableIterator<T[]>;
/**
* Break iterable after test passes.
* @param x an iterable
* @param ft test function (v, i, x)
* @returns x[0..j+1] ⧺ x[j+1..k] ⧺ ... | ft(x[i]) = true; i = j, k, ...
*/ export declare function cutRight<T>(x: Iterable<T>, ft: TestFunction<T>): IterableIterator<T[]>;
/**
* Break iterable at given indices.
* @param x an iterable
* @param is split indices (sorted)
* @returns x[0..j] ⧺ x[j..k] ⧺ ... | ft(x[i]) = true; i = j, k, ...; i ∈ is
*/ export declare function cutAt<T>(x: Iterable<T>, is: Iterable<number>): IterableIterator<T[]>;
/**
* Break iterable after given indices.
* @param x an iterable
* @param is split indices (sorted)
* @returns x[0..j+1] ⧺ x[j+1..k] ⧺ ... | ft(x[i]) = true; i = j, k, ...; i ∈ is
*/ export declare function cutAtRight<T>(x: Iterable<T>, is: Iterable<number>): IterableIterator<T[]>;
/**
* Keep similar values together and in order.
* @param x an iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns x[0..k], x[k..l], ... | fc(x[i], x[j]) = 0; i, j = 0..k / k..l / ...
*/ export declare function group<T, U = T>(x: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): IterableIterator<T[]>;
/**
* Segregate values by test result.
* @param x an array
* @param ft test function (v, i, x)
* @returns [satisfies, doesnt]
*/ export declare function partition<T>(x: Iterable<T>, ft: TestFunction<T>): [T[], T[]];
/**
* Segregate values by similarity.
* @param x an array
* @param fm map function (v, i, x)
* @returns Map \{key ⇒ values\}
*/ export declare function partitionAs<T, U = T>(x: Iterable<T>, fm?: MapFunction<T, T | U> | null): Map<T | U, T[]>;
/**
* Break iterable into chunks of given size.
* @param x an iterable
* @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: Iterable<T>, n?: number, s?: number): IterableIterator<T[]>;
/**
* Obtain values that cycle through an iterable.
* @param x an iterable
* @param i start index [0]
* @param n number of values [-1 ⇒ Inf]
* @returns x[i..] ⧺ x ⧺ x ⧺ ... with upto n values
*/ export declare function cycle<T>(x: Iterable<T>, i?: number, n?: number): IterableIterator<T>;
/**
* Repeat an iterable given times.
* @param x an iterable
* @param n times [-1 ⇒ Inf]
* @returns ...x, ...x, ...(n times)
*/ export declare function repeat<T>(x: Iterable<T>, n?: number): IterableIterator<T>;
/**
* Reverse the values.
* @param x an iterable
* @returns x[|x|-1], x[|x|-2], ..., x[1], x[0]
*/ export declare function reverse<T>(x: Iterable<T>): IterableIterator<T>;
/**
* Rotate values in iterable.
* @param x an iterable
* @param n rotate amount (+ve: left, -ve: right) [0]
* @returns x[n..] ⧺ x[0..n]
*/ export declare function rotate<T>(x: Iterable<T>, n?: number): IterableIterator<T>;
/**
* Place a separator between every value.
* @param x an iterable
* @param v separator
* @returns x[0], v, x[1], v, ..., x[|x|-1]
*/ export declare function intersperse<T>(x: Iterable<T>, v: T): IterableIterator<T>;
/**
* Estimate new values between existing ones.
* @param x an iterable
* @param fc combine function (a, b)
* @returns x[0], fc(x[0], x[1]), x[1], fc(x[1], x[2]), ..., x[|x|-1]
*/ export declare function interpolate<T>(x: Iterable<T>, fc: CombineFunction<T>): IterableIterator<T>;
/**
* Place values of an iterable between another.
* @param x an iterable
* @param y another iterable
* @param m number of values from x [1]
* @param n number of values from y [1]
* @param s step size for x [m]
* @param t step size for y [n]
* @returns x[0..m], y[0..n], x[s..s+m], y[t..t+n], ..., x[k*s..|x|-1] | k ∈ W
*/ export declare function intermix<T>(x: Iterable<T>, y: Iterable<T>, m?: number, n?: number, s?: number, t?: number): IterableIterator<T>;
/**
* Place values from iterables alternately.
* @param xs iterables
* @returns x₀[0], x₁[0], ..., x₀[1], x₁[0], ... | [x₀, x₁, ...] = xs
*/ export declare function interleave<T>(xs: Iterable<T>[]): IterableIterator<T>;
/**
* Append values from iterables.
* @param xs iterables
* @returns ...x₀, ...x₁, ... | [x₀, x₁, ...] = xs
*/ export declare function concat<T>(...xs: Iterable<T>[]): IterableIterator<T>;
/**
* Merge values from sorted iterables.
* @param xs iterables
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns sort(concat(...xs))
*/ export declare function merge<T, U = T>(xs: Iterable<T>[], fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): IterableIterator<T>;
/**
* Join values together into a string.
* @param x an iterable
* @param sep separator [,]
* @returns "$\{v₀\}$\{sep\}$\{v₁\}..." | vᵢ ∈ x
*/ export declare function join<T>(x: Iterable<T>, sep?: string): string;
/**
* Check if there are no duplicate values.
* @param x an array
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns ∀ vᵢ, vⱼ ∈ x, is vᵢ ≠ vⱼ?
*/ export declare function isUnique<T, U = T>(x: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): boolean;
/**
* Checks if arrays have no value in common.
* @param x an array
* @param y another array
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns x ∩ y = Φ?
*/ export declare function isDisjoint<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): boolean;
/**
* Remove duplicate values.
* @param x an iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns v₀, v₁, ... | vᵢ ∈ x; vᵢ ≠ vⱼ ∀ i, j
*/ export declare function unique<T, U = T>(x: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): IterableIterator<T>;
/**
* Obtain values present in any iterable.
* @param x an iterable
* @param y another iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns x ∪ y = \{v | v ∈ x or v ∈ y\}
*/ export declare function union<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): IterableIterator<T>;
/**
* Obtain values present in both iterables.
* @param x an iterable
* @param y another iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns x ∩ y = \{v | v ∈ x, v ∈ y\}
*/ export declare function intersection<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): IterableIterator<T>;
/**
* Obtain values not present in another iterable.
* @param x an iterable
* @param y another iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns x - y = \{v | v ∈ x, v ∉ y\}
*/ export declare function difference<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): IterableIterator<T>;
/**
* Obtain values not present in both iterables.
* @param x an iterable
* @param y another iterable
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns x-y ∪ y-x
*/ export declare function symmetricDifference<T, U = T>(x: Iterable<T>, y: Iterable<T>, fc?: CompareFunction<T | U> | null, fm?: MapFunction<T, T | U> | null): IterableIterator<T>;
/**
* List cartesian product of iterables.
* @param xs iterables
* @param fm map function (vs, i)
* @returns x₀ × x₁ × ... = \{[v₀, v₁, ...] | v₀ ∈ x₀, v₁ ∈ x₁, ...] \}
*/ export declare function cartesianProduct<T, U = T>(xs: Iterable<T>[], fm?: MapFunction<T[], T[] | U> | null): IterableIterator<T[] | U>;