// TypeScript Version: 3.4 import { Iter, EP, FlatForInternalFn, ExtractPromise, AssociateMap, LiteralWrapper, } from './utils'; /** * No Document * * @param supply * @param iter */ export function firstOrGet(supply: () => (Y | Promise), iter: Iter>): Promise; export function firstOrGet(supply: () => Y, iter: Iter): Promise | EP>; export function firstOrGet(supply: Promise<() => (Y | Promise)>, iter: Iter>): Promise; export function firstOrGet(supply: Promise<() => Y>, iter: Iter): Promise | EP>; export function firstOrGet(supply: Y | Promise, iter: Iter>): Promise; export function firstOrGet(supply: Y, iter: Iter): Promise | EP>; export function firstOrGet, Y>(supply: () => (Y | Promise)): (iter: T) => Promise | EP>; export function firstOrGet, Y>(supply: Promise<() => (Y | Promise)>): (iter: T) => Promise | EP>; export function firstOrGet, Y>(supply: Y): (iter: T) => Promise | EP>; export function firstOrGet(supply: () => (Y | Promise)): (iter: Iter>) => Promise; export function firstOrGet(supply: () => Y): (iter: Iter) => Promise | EP>; export function firstOrGet(supply: Promise<() => (Y | Promise)>): (iter: Iter>) => Promise; export function firstOrGet(supply: Promise<() => Y>): (iter: Iter) => Promise | EP>; export function firstOrGet(supply: Y | Promise): (iter: Iter>) => Promise; export function firstOrGet(supply: Y): (iter: Iter) => Promise | EP>; /** * https://github.com/rudty/nodekell#emptythen * * @param supply * @param iter */ export function emptyThen(supply: () => (Iter> | Promise>>), iter: Iter>): AsyncIterableIterator; export function emptyThen(supply: () => (Iter | Promise>), iter: Iter): AsyncIterableIterator | EP>; export function emptyThen(supply: Promise<() => (Iter> | Promise>>)>, iter: Iter>): AsyncIterableIterator; export function emptyThen(supply: Promise<() => (Iter | Promise>)>, iter: Iter): AsyncIterableIterator | EP>; export function emptyThen(supply: Iter> | Promise>>, iter: Iter>): AsyncIterableIterator; export function emptyThen(supply: Iter | Promise>, iter: Iter): AsyncIterableIterator | EP>; export function emptyThen, Y extends Iter>(supply: () => (Y | Promise)): (iter: T) => AsyncIterableIterator | FlatForInternalFn>; export function emptyThen, Y extends Iter>(supply: Promise<() => (Y | Promise)>): (iter: T) => AsyncIterableIterator | FlatForInternalFn>; export function emptyThen, Y extends Iter>(supply: Y): (iter: T) => AsyncIterableIterator | FlatForInternalFn>; export function emptyThen(supply: () => (Iter> | Promise>>)): (iter: Iter>) => AsyncIterableIterator; export function emptyThen(supply: () => (Iter | Promise>)): (iter: Iter) => AsyncIterableIterator | EP>; export function emptyThen(supply: Promise<() => (Iter> | Promise>>)>): (iter: Iter>) => AsyncIterableIterator; export function emptyThen(supply: Promise<() => (Iter | Promise>)>): (iter: Iter) => AsyncIterableIterator | EP>; export function emptyThen(supply: Iter> | Promise>>): (iter: Iter>) => AsyncIterableIterator; export function emptyThen(supply: Iter | Promise>): (iter: Iter) => AsyncIterableIterator | EP>; /** * https://github.com/rudty/nodekell# * * @param iter */ // export function collect>(iter: T): Promise[]>; // export function collect(iter: Iter>): Promise; export function collect(iter: Iter): Promise[]>; /** * https://github.com/rudty/nodekell#collectmap * * **Note** * - if want you high quality type, use type assertion * ```ts * const a = [['a', 0], ['b', 1]] as [string, number][]; * const r = await collectMap(a); // Map * ``` * * @param iter */ export function collectMap(iter: Iter>): Promise>; // export function collectMap(iter: Iter<[K, V] | Promise<[K, V]>>): Promise>; /** * https://github.com/rudty/nodekell#collectset * * @param iter */ // export function collectSet(iter: Iter>): Promise>; export function collectSet(iter: Iter): Promise>>; /** * https://github.com/rudty/nodekell#collectobject * * @param iter */ export function collectObject(iter: Iter>): Promise; /** * https://github.com/rudty/nodekell#foreach * * @param f * @param iter */ export function forEach(f: (elem: T) => (R | Promise), iter: Iter>): Promise; // export function forEach(f: (elem: EP) => R, iter: Iter): Promise[]>; export function forEach, R>(f: (elem: FlatForInternalFn) => R, iter: T): Promise[]>; export function forEach, R>(f: (elem: FlatForInternalFn) => R): (iter: T) => Promise[]>; export function forEach(f: (elem: T) => (R | Promise)): (iter: Iter>) => Promise; // export function forEach(f: (elem: EP) => R): (iter: Iter) => Promise[]>; /** * https://github.com/rudty/nodekell#foreachindexed * * @param f * @param iter */ export function forEachIndexed(f: (idx: number, elem: T) => (R | Promise), iter: Iter>): Promise; export function forEachIndexed, R>(f: (idx: number, elem: FlatForInternalFn) => R, iter: T): Promise[]>; export function forEachIndexed, R>(f: (idx: number, elem: FlatForInternalFn) => R): (iter: T) => Promise[]>; export function forEachIndexed(f: (idx: number, elem: T) => (R | Promise)): (iter: Iter>) => Promise; /** * https://github.com/rudty/nodekell#distinctby * * @param f * @param iter */ export function distinctBy(f: (elem: T) => any, iter: Iter>): AsyncIterableIterator; // export function distinctBy(f: (elem: EP) => any, iter: Iter): AsyncIterableIterator>; export function distinctBy>(f: (elem: FlatForInternalFn) => any, iter: T): AsyncIterableIterator>; export function distinctBy>(f: (elem: FlatForInternalFn) => any): (iter: T) => AsyncIterableIterator>; export function distinctBy(f: (elem: T) => any): (iter: Iter>) => AsyncIterableIterator; // export function distinctBy(f: (elem: EP) => any): (iter: Iter) => AsyncIterableIterator>; /** * https://github.com/rudty/nodekell#distinct * * @param iter */ // export function distinct(iter: Iter>): AsyncIterableIterator; export function distinct(iter: Iter): AsyncIterableIterator>; /** * https://github.com/rudty/nodekell#some * * @param f * @param iter */ export function some(f: (elem: T) => (boolean | Promise), iter: Iter>): Promise; // export function some(f: (elem: EP) => (boolean | Promise), iter: Iter): Promise; export function some>(f: (elem: FlatForInternalFn) => (boolean | Promise), iter: T): Promise; export function some>(f: (elem: FlatForInternalFn) => (boolean | Promise)): (iter: T) => Promise; export function some(f: (elem: T) => (boolean | Promise)): (iter: Iter>) => Promise; // export function some(f: (elem: EP) => (boolean | Promise)): (iter: Iter) => Promise; /** * https://github.com/rudty/nodekell#every * * @param f * @param iter */ export function every(f: (elem: T) => (boolean | Promise), iter: Iter>): Promise; // export function every(f: (elem: EP) => (boolean | Promise), iter: Iter): Promise; export function every>(f: (elem: FlatForInternalFn) => (boolean | Promise), iter: T): Promise; export function every>(f: (elem: FlatForInternalFn) => (boolean | Promise)): (iter: T) => Promise; export function every(f: (elem: T) => (boolean | Promise)): (iter: Iter>) => Promise; // export function every(f: (elem: EP) => (boolean | Promise)): (iter: Iter) => Promise; /** * https://github.com/rudty/nodekell#maxby * * @param f * @param iter */ export function maxBy(f: (elem: T) => any, iter: Iter>): Promise; export function maxBy(f: (elem: T) => any): (iter: Iter>) => Promise; /** * https://github.com/rudty/nodekell#minby * * @param f * @param iter */ export function minBy(f: (elem: T) => any, iter: Iter>): Promise; export function minBy(f: (elem: T) => any): (iter: Iter>) => Promise; /** * https://github.com/rudty/nodekell#count * * @param iter */ export function count(iter: Iter): Promise; export function count(obj: object): Promise; /* about types of sum, max, min set type number or string, bug occurs so use generic */ /** * https://github.com/rudty/nodekell#sum * * **Note** * - please use can summed value * * @param iter */ export function sum(iter: Iter>): Promise; /** * https://github.com/rudty/nodekell#max * * **Note** * - please use can ordered value * * @param iter */ export function max(iter: Iter>): Promise; /** * https://github.com/rudty/nodekell#min * * **Note** * - please use can ordered value * * @param iter */ export function min(iter: Iter>): Promise; /** * https://github.com/rudty/nodekell#average * * @param iter */ export function average(iter: Iter>): Promise; /** * https://github.com/rudty/nodekell#splitby * * @param f * @param any */ export function splitBy(f: (t: T) => (Iter | Promise>), any: T): AsyncIterableIterator; // export function splitBy>(f: (t: T) => (R | Promise)): (any: T) => AsyncIterableIterator>; export function splitBy(f: (t: T) => (Iter | Promise>)): (any: T) => AsyncIterableIterator; /** * https://github.com/rudty/nodekell#then * * @param f * @param t */ export function then(f: (t: T) => R, t: T): R; export function then(f: (t: T) => R): (t: T) => R; /** * https://github.com/rudty/nodekell#tap * * @param f * @param t */ export function tap(f: (t: T) => any, t: T): Promise>; export function tap(f: (t: T) => any): (t: T) => Promise>; /** * https://github.com/rudty/nodekell#buffer * * @param supply * @param iter */ export function buffer(supply: number | Promise, iter: Iter>): AsyncIterableIterator; // export function buffer(supply: number | Promise, iter: Iter): AsyncIterableIterator[]>; export function buffer>(supply: number | Promise, iter: T): AsyncIterableIterator[]>; export function buffer>(supply: number | Promise): (iter: T) => AsyncIterableIterator[]>; export function buffer(supply: number | Promise): (iter: Iter>) => AsyncIterableIterator; // export function buffer(supply: number | Promise): (iter: Iter) => AsyncIterableIterator[]>; /** * * * @param f * @param iter */ export function find(f: (elem: T) => (boolean | Promise), iter: Iter>): Promise; // export function find(f: (elem: EP) => (boolean | Promise), iter: Iter): Promise | undefined>; export function find>(f: (elem: FlatForInternalFn) => (boolean | Promise), iter: T): Promise | undefined>; export function find>(f: (elem: FlatForInternalFn) => (boolean | Promise)): (iter: T) => Promise | undefined>; export function find(f: (elem: T) => (boolean | Promise)): (iter: Iter>) => Promise; // export function find(f: (elem: EP) => (boolean | Promise)): (iter: Iter>) => Promise | undefined>; /** * * * @param f * @param iter */ export function findLast(f: (elem: T) => (boolean | Promise), iter: Iter>): Promise; // export function findLast(f: (elem: EP) => (boolean | Promise), iter: Iter): Promise | undefined>; export function findLast>(f: (elem: FlatForInternalFn) => (boolean | Promise), iter: T): Promise | undefined>; export function findLast>(f: (elem: FlatForInternalFn) => (boolean | Promise)): (iter: T) => Promise | undefined>; export function findLast(f: (elem: T) => (boolean | Promise)): (iter: Iter>) => Promise; // export function findLast(f: (elem: EP) => (boolean | Promise)): (iter: Iter>) => Promise | undefined>; /** * https://github.com/rudty/nodekell#peek * * @param f * @param iter */ export function peek(f: (elem: T) => any, iter: Iter>): AsyncIterableIterator; export function peek>(f: (elem: FlatForInternalFn) => any, iter: T): AsyncIterableIterator>; export function peek>(f: (elem: FlatForInternalFn) => any): (iter: T) => AsyncIterableIterator>; export function peek(f: (elem: T) => any): (iter: Iter>) => AsyncIterableIterator; /** * https://github.com/rudty/nodekell#collectint8 * * @param iter iterator or async iterator */ export function collectInt8(iter: Iter>): Promise; /** * https://github.com/rudty/nodekell#collectint16 * * @param iter iterator or async iterator */ export function collectInt16(iter: Iter>): Promise; /** * https://github.com/rudty/nodekell#collectint32 * * @param iter iterator or async iterator */ export function collectInt32(iter: Iter>): Promise; /** * https://github.com/rudty/nodekell#collectuint8 * * @param iter iterator or async iterator */ export function collectUint8(iter: Iter>): Promise; /** * https://github.com/rudty/nodekell#collectuint16 * * @param iter iterator or async iterator */ export function collectUint16(iter: Iter>): Promise; /** * https://github.com/rudty/nodekell#collectuint32 * * @param iter iterator or async iterator */ export function collectUint32(iter: Iter>): Promise; /** * https://github.com/rudty/nodekell#collectuint8clamped * * @param iter iterator or async iterator */ export function collectUint8Clamped(iter: Iter>): Promise; /** * * https://github.com/rudty/nodekell#frequencies * * @param iter iterable or async iterable */ // export function frequencies(iter: Iter): Promise, number>>; export function frequencies>(iter: T): Promise, number>>; /** * * https://github.com/rudty/nodekell#frequenciesby * * @param f key function * @param iter iterable or async iterable */ export function frequenciesBy(f: (elem: T) => (K | Promise), iter: Iter>): Promise>; export function frequenciesBy>(f: (elem: FlatForInternalFn) => K, iter: T): Promise, number>>; export function frequenciesBy>(f: (elem: FlatForInternalFn) => K): (iter: T) => Promise, number>>; export function frequenciesBy(f: (elem: T) => (K | Promise)): (iter: Iter>) => Promise>; /** * https://github.com/rudty/nodekell#distinctuntilchangedby * * @param f * @param iter */ export function distinctUntilChangedBy(f: (elem: T) => any, iter: Iter>): AsyncIterableIterator; export function distinctUntilChangedBy>(f: (elem: FlatForInternalFn) => any, iter: T): AsyncIterableIterator>; export function distinctUntilChangedBy>(f: (elem: FlatForInternalFn) => any): (iter: T) => AsyncIterableIterator>; export function distinctUntilChangedBy(f: (elem: T) => any): (iter: Iter>) => AsyncIterableIterator; /** * https://github.com/rudty/nodekell#distinctuntilchangedby * * @param iter */ export function distinctUntilChanged(iter: Iter): AsyncIterableIterator>; /** * https://github.com/rudty/nodekell#associateby * * returns a Map using iterator. * when the function returns Array * it uses the first argument as key and the second argument as value. * when not in an array, the key and value are both return values. * * **Note** * - if want you high quality type, use type assertion * * @example * const arr0 = [1, 2, 3]; * const m0 = await F.associateBy(e => [e, e * 2], arr0); * console.log(m0); * // => Map { 1 => 2, 2 => 4, 3 => 6 } * * const arr1 = [1, 2, 3]; * const m1 = await F.associateBy(e => e + 1, arr1); * console.log(m1); * // => Map { 2 => 2, 3 => 3, 4 => 4 } * * @param fn convert function * @param iter any iterator */ export function associateBy(fn: (arg: T) => R, iter: Iter>): Promise>; export function associateBy, R>(fn: (arg: FlatForInternalFn) => R, iter: T): Promise>; export function associateBy, R>(fn: (arg: FlatForInternalFn) => R): (iter: T) => Promise>; /** * Use regular expression * return first matching in str * @example * const r = F.reFind(/H(\d)/, "H1ello H2World"); * console.log(r); // print H1 * * * * @param re find regex * @param str find String * @returns first matching string */ export function reFind(re: RegExp | string, str: string): string; export function reFind(re: RegExp | string): (str: string) => string; /** * Use regular expression * return first matching in str and groups * @example * const r = F.reFindSubmatch(/H(\d)/, "H1ello H2World"); * console.log(r[0]); // print H1 * console.log(r[1]); // print 1 * * * * @param re find regex * @param str find String * @returns Array matching strings and groups */ export function reFindSubmatch(re: RegExp | string, str: string): string[]; export function reFindSubmatch(re: RegExp | string): (str: string) => string[]; /** * Use regular expression * return all matching in str * @example * const r = F.reFindAll(/H(\d)/, "H1ello H2World"); * console.log(r); * //print ['H1', 'H2'] * * @param re find regex * @param str find String * @returns matching strings */ export function reFindAll(re: RegExp | string, str: string): string[]; export function reFindAll(re: RegExp | string): (str: string) => string[]; /** * Use regular expression * return all matching in str and groups * @example * const r = F.reFindAllSubmatch(/H(\d)/, "H1ello H2World"); * console.log(r[0][0]); // print H1 * console.log(r[0][1]); // print 1 * * console.log(r[1][0]); // print H2 * console.log(r[1][1]); // print 2 * * * @param re find regex * @param str find String * @returns Array> matching strings and groups */ export function reFindAllSubmatch(re: RegExp | string, str: string): string[][]; export function reFindAllSubmatch(re: RegExp | string): (str: string) => string[][]; /** * 1. await promise * 2. Fetch all the elements of type iterator. * When an element returns a promise, it waits for it to finish. * 3. Fetch all elements of async iterator type. * @example * const r = await F.run([1,2,3,4,5], * F.map(SomethingNetworkJob), * F.map(console.log), * F.block); */ export function block(...value: any[]): Promise; /** * Sort the values in ascending order. */ export function sort(iter: Iter>): Promise>>; /** * Sort the values by the return value of the function. * iterator or asyncIterator take all the values and sorts them. * * @example * const arr = [4, 3, 2, 5, 1]; * const res = await F.sortBy((a, b) => a - b, arr); * console.log(res); // print [1,2,3,4,5] * * @param comparator compareator function * @param iter any iterable * @returns new sorted array */ export function sortBy(comparator: (lhs: ExtractPromise, rhs: ExtractPromise) => number | Promise, iter: Iter>): Promise>>; export function sortBy(comparator: (lhs: T, rhs: T) => number | Promise): (iter: Iter>) => Promise>; /** * Can be used with sort function * @example * const cmp = F.comparator((a: number, b: number) => a < b); * console.log(cmp(1, 2)); // print -1 * * const cmp2 = F.comparator((a, b) => a < b); * console.log(cmp2(1, 2)); // print -1 * @see sort * @see sortBy */ export function comparator(fn: (lhs: any, rhs: any) => boolean): (lhs: any, rhs: any) => number; export function comparator(fn: (lhs: any, rhs: any) => Promise): (lhs: any, rhs: any) => Promise; export function comparator(fn: (lhs: ExtractPromise, rhs: ExtractPromise) => boolean, lhs: L, rhs: R): L extends Promise ? Promise : R extends Promise ? Promise: number; export function comparator(fn: (lhs: L, rhs: R) => boolean): (lhs: L, rhs: R) => number; export function comparator(fn: (lhs: L, rhs: R) => Promise): (lhs: L | Promise, rhs: R | Promise) => Promise; export function comparator(fn: (lhs: L, rhs: R) => Promise, lhs: L | Promise, rhs: R | Promise): Promise; export function comparator(fn: (lhs: ExtractPromise, rhs: R) => boolean, lhs: L): (rhs: R) => L extends Promise ? Promise: number; export function comparator(fn: (lhs: L, rhs: R) => Promise, lhs: L | Promise): (rhs: R | Promise) => Promise; /** * Add {iter} to the {index} position of {iter} received as an argument. * If {index} is greater than the length of {iter}, it is added to the end of {iter}. * @param value add value * @param index add index * @param iter any iterable */ export function insertAt(value: T | Promise, index: number, iter: Iter): AsyncIterableIterator; export function insertAt(value: T, index: number): (iter: Iter>) => AsyncIterableIterator>; export function insertAt(value: T): (index: number) => (iter: Iter>) => AsyncIterableIterator>; /** * Iterates through A and removes the first element that satisfies the condition. * * @example * for await (const e of F.removeFirst(1, [1,2,3,4])) { * console.log(e); * } * // print * // 2 * // 3 * // 4 * * const r = F.removeFirst((e) => e % 2 === 0, [1,2,3,4]); * for await (const e of r) { * console.log(e); * } * // print * // 1 * // 3 * // 4 * * @param x remove value or find function * @param iter any iterable */ export function removeFirst(predicate: (value: T) => boolean | Promise, iter: Iter>): AsyncIterableIterator; export function removeFirst(predicate: (value: T) => boolean | Promise): (iter: Iter>) => AsyncIterableIterator; export function removeFirst(predicate: Promise<(value: T) => boolean | Promise>, iter: Iter>): AsyncIterableIterator; export function removeFirst(predicate: Promise<(value: T) => boolean | Promise>): (iter: Iter>) => AsyncIterableIterator; export function removeFirst(value: T | Promise, iter: Iter>): AsyncIterableIterator; export function removeFirst(value: T | Promise): (iter: Iter>) => AsyncIterableIterator; /** * Update {iter} to the {index} position of {iter} received as an argument. * * @example * const arr = [1,2,3,4,5]; * const u = F.updateAt( * 99, // update value * 0, // index * arr // iterator * ); * for await (const e of u) { * console.log(e); * } * //print * // 99 * // 2 * // 3 * // 4 * // 5 * @param value add value * @param index add index * @param iter any iterable * @returns new AsyncIterator */ export function updateAt(value: T | Promise, index: number, iter: Iter): AsyncIterableIterator; export function updateAt(value: T, index: number): (iter: Iter>) => AsyncIterableIterator>; export function updateAt(value: T): (index: number) => (iter: Iter>) => AsyncIterableIterator>; /** * In {iter}, update the first value that matches {x} to {value}. * @example * const arr = [1, 2, 3]; * const r = F.updateFirst( * 99, // update value * 1, // find value * arr); * for await (const e of r) { * console.log(e); * } * // print * // 99 * // 2 * // 3 * * @param value update value * @param predicate update value or find function * @param iter any iterable */ export function updateFirst(value: LiteralWrapper | Promise>, predicate: (value: T) => boolean | Promise, iter: Iter>): AsyncIterableIterator; export function updateFirst(value: LiteralWrapper | Promise>, predicate: (value: T) => boolean | Promise): (iter: Iter>) => AsyncIterableIterator; export function updateFirst(value: LiteralWrapper | Promise>, predicate: Promise<(value: T) => boolean | Promise>, iter: Iter>): AsyncIterableIterator; export function updateFirst(value: LiteralWrapper | Promise>, predicate: Promise<(value: T) => boolean | Promise>): (iter: Iter>) => AsyncIterableIterator; export function updateFirst(value: LiteralWrapper | Promise>, predicate: T | Promise, iter: Iter>): AsyncIterableIterator; export function updateFirst(value: LiteralWrapper | Promise>, predicate: T | Promise): (iter: Iter>) => AsyncIterableIterator; export function updateFirst(value: LiteralWrapper): (predicate: ((value: T) => boolean | Promise) | Promise<(value: T) => boolean | Promise> | T | Promise) => (iter: Iter>) => AsyncIterableIterator;