// TypeScript Version: 3.4 import { Iter, EP, ExtractMap, CurriedFunction2, FlatForInternalFn, OuterJoinMap, InnerJoinObject, OuterJoinObject, InnerJoinMap, PairRepeat, } from './utils'; /** * https://github.com/rudty/nodekell#groupby * * @param f * @param iter */ export function groupBy(f: (elem: V) => (K | Promise), iter: Iter>): Promise>; // export function groupBy(f: (elem: EP) => K, iter: Iter): Promise, EP[]>>; export function groupBy>(f: (elem: FlatForInternalFn) => K, iter: V): Promise, FlatForInternalFn[]>>; export function groupBy>(f: (elem: FlatForInternalFn) => K): (iter: V) => Promise, FlatForInternalFn[]>>; export function groupBy(f: (elem: V) => (K | Promise)): (iter: Iter>) => Promise>; // export function groupBy(f: (elem: EP) => K): (iter: Iter) => Promise, EP[]>>; /** * https://github.com/rudty/nodekell#concat * * @param iter1 * @param iter2 */ export function concat(iter1: Iter>, iter2: Iter>): AsyncIterableIterator; // export function concat(iter1: Iter, iter2: Iter): AsyncIterableIterator | EP>; export function concat, Y extends Iter>(iter1: T, iter2: Y): AsyncIterableIterator | FlatForInternalFn>; export function concat, Y extends Iter>(iter1: T): (iter2: Y) => AsyncIterableIterator | FlatForInternalFn>; export function concat(iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator; // export function concat(iter1: Iter): (iter2: Iter) => AsyncIterableIterator | EP>; /** * https://github.com/rudty/nodekell#union * * @param iter1 * @param iter2 */ export function union(iter1: Iter>, iter2: Iter>): AsyncIterableIterator; // export function union(iter1: Iter, iter2: Iter): AsyncIterableIterator | EP>; export function union, Y extends Iter>(iter1: T, iter2: Y): AsyncIterableIterator | FlatForInternalFn>; export function union, Y extends Iter>(iter1: T): (iter2: Y) => AsyncIterableIterator | FlatForInternalFn>; export function union(iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator; // export function union(iter1: Iter): (iter2: Iter) => AsyncIterableIterator | EP>; export type CompareFn = (a: T, b: T) => 1 | 0 | -1 | number; export type OrderType = 'ASC' | 'DESC' | 'asc' | 'desc'; /** * ascending compare function * * @param a * @param b */ export function asc(a: T, b: T): 1 | 0 | -1; /** * descending compare function * * @param a * @param b */ export function desc(a: T, b: T): 1 | 0 | -1; /** * https://github.com/rudty/nodekell#orderby * * @param f * @param order * @param iter */ export function orderBy(f: (e: T) => (S | Promise), order: OrderType | CompareFn, iter: Iter>): AsyncIterableIterator; export function orderBy(f: (e: T) => (S | Promise), order: OrderType | CompareFn): (iter: Iter>) => AsyncIterableIterator; export function orderBy(f: (e: T) => (S | Promise)): CurriedFunction2, Iter>, AsyncIterableIterator>; /** * https://github.com/rudty/nodekell#order * * ```ts * F.order(F.asc, iter); * // same as * F.orderBy(e => e, F.asc, iter); * ``` * * @param order * @param iter */ export function order(order: OrderType | CompareFn>, iter: Iter): AsyncIterableIterator>; export function order(order: OrderType | CompareFn>): (iter: Iter) => AsyncIterableIterator>; /** * https://github.com/rudty/nodekell#innerjoin * * @param f * @param iter1 * @param iter2 */ export function innerJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem1: T1 | Promise, elem2: T2 | Promise) => (boolean | Promise), iter1: Iter>, iter2: Iter>): AsyncIterableIterator>; export function innerJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem1: T1 | Promise, elem2: T2 | Promise) => (boolean | Promise), iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator>; export function innerJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem1: T1 | Promise, elem2: T2 | Promise) => (boolean | Promise)): CurriedFunction2>, Iter>, AsyncIterableIterator>>; export function innerJoin(f: (elem1: T1, elem2: T2) => (boolean | Promise), iter1: Iter>, iter2: Iter>): AsyncIterableIterator>; export function innerJoin(f: (elem1: T1, elem2: T2) => (boolean | Promise), iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator>; export function innerJoin(f: (elem1: T2, elem2: T2) => (boolean | Promise)): CurriedFunction2>, Iter>, AsyncIterableIterator>>; /** * https://github.com/rudty/nodekell#leftinnerjoin * * as innerJoin * * @param f * @param iter1 * @param iter2 */ export function leftInnerJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem1: T1 | Promise, elem2: T2 | Promise) => (boolean | Promise), iter1: Iter>, iter2: Iter>): AsyncIterableIterator>; export function leftInnerJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem1: T1 | Promise, elem2: T2 | Promise) => (boolean | Promise), iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator>; export function leftInnerJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem1: T1 | Promise, elem2: T2 | Promise) => (boolean | Promise)): CurriedFunction2>, Iter>, AsyncIterableIterator>>; export function leftInnerJoin(f: (elem1: T1, elem2: T2) => (boolean | Promise), iter1: Iter>, iter2: Iter>): AsyncIterableIterator>; export function leftInnerJoin(f: (elem1: T1, elem2: T2) => (boolean | Promise), iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator>; export function leftInnerJoin(f: (elem1: T2, elem2: T2) => (boolean | Promise)): CurriedFunction2>, Iter>, AsyncIterableIterator>>; /** * https://github.com/rudty/nodekell#rightinnerjoin * * @param f * @param iter1 * @param iter2 */ export function rightInnerJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem2: T2 | Promise, elem1: T1 | Promise) => (boolean | Promise), iter1: Iter>, iter2: Iter>): AsyncIterableIterator>; export function rightInnerJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem2: T2 | Promise, elem1: T1 | Promise) => (boolean | Promise), iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator>; export function rightInnerJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem2: T2 | Promise, elem1: T1 | Promise) => (boolean | Promise)): CurriedFunction2>, Iter>, AsyncIterableIterator>>; export function rightInnerJoin(f: (elem2: T2, elem1: T1) => (boolean | Promise), iter1: Iter>, iter2: Iter>): AsyncIterableIterator>; export function rightInnerJoin(f: (elem2: T2, elem1: T1) => (boolean | Promise), iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator>; export function rightInnerJoin(f: (elem2: T2, elem1: T1) => (boolean | Promise)): CurriedFunction2>, Iter>, AsyncIterableIterator>>; /** * https://github.com/rudty/nodekell#outerjoin * * @param f * @param iter1 * @param iter2 */ export function outerJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem1: T1, elem2: T2) => (boolean | Promise), iter1: Iter>, iter2: Iter>): AsyncIterableIterator>; export function outerJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem1: T1, elem2: T2) => (boolean | Promise), iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator>; export function outerJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem1: T1, elem2: T2) => (boolean | Promise)): CurriedFunction2>, Iter>, AsyncIterableIterator>>; export function outerJoin(f: (elem1: T1, elem2: T2) => (boolean | Promise), iter1: Iter>, iter2: Iter>): AsyncIterableIterator>; export function outerJoin(f: (elem1: T1, elem2: T2) => (boolean | Promise), iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator>; export function outerJoin(f: (elem1: T1, elem2: T2) => (boolean | Promise)): CurriedFunction2>, Iter>, AsyncIterableIterator>>; /** * https://github.com/rudty/nodekell#leftouterjoin * * as outerJoin * * @param f * @param iter1 * @param iter2 */ export function leftOuterJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem1: T1, elem2: T2) => (boolean | Promise), iter1: Iter>, iter2: Iter>): AsyncIterableIterator>; export function leftOuterJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem1: T1, elem2: T2) => (boolean | Promise), iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator>; export function leftOuterJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem1: T1, elem2: T2) => (boolean | Promise)): CurriedFunction2>, Iter>, AsyncIterableIterator>>; export function leftOuterJoin(f: (elem1: T1, elem2: T2) => (boolean | Promise), iter1: Iter>, iter2: Iter>): AsyncIterableIterator>; export function leftOuterJoin(f: (elem1: T1, elem2: T2) => (boolean | Promise), iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator>; export function leftOuterJoin(f: (elem1: T1, elem2: T2) => (boolean | Promise)): CurriedFunction2>, Iter>, AsyncIterableIterator>>; /** * https://github.com/rudty/nodekell#rightouterjoin * * @param f * @param iter1 * @param iter2 */ export function rightOuterJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem2: T2, elem1: T1) => (boolean | Promise), iter1: Iter>, iter2: Iter>): AsyncIterableIterator>; export function rightOuterJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem2: T2, elem1: T1) => (boolean | Promise), iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator>; export function rightOuterJoin[0], ExtractMap[1]>, T2 extends Map[0], ExtractMap[1]>>(f: (elem2: T2, elem1: T1) => (boolean | Promise)): CurriedFunction2>, Iter>, AsyncIterableIterator>>; export function rightOuterJoin(f: (elem2: T2, elem1: T1) => (boolean | Promise), iter1: Iter>, iter2: Iter>): AsyncIterableIterator>; export function rightOuterJoin(f: (elem2: T2, elem1: T1) => (boolean | Promise), iter1: Iter>): (iter2: Iter>) => AsyncIterableIterator>; export function rightOuterJoin(f: (elem2: T2, elem1: T1) => (boolean | Promise)): CurriedFunction2>, Iter>, AsyncIterableIterator>>; /** * combine elements from two iterables based on the related elements between them. * works like TSQL * --------------------- * create table Orders( * orderID int, * customerID int, * info varchar(30) * ); * * create table Customers( * customerID int, * customerName varchar(30) * ); * * insert into Orders values(1,1,'t1'); * insert into Orders values(2,1,'t2'); * insert into Orders values(3,1,'t3'); * insert into Orders values(4,2,'t4'); * insert into Orders values(5,3,'t5'); * insert into Orders values(6,4,'t6'); * * insert into Customers values(1, 'ana'); * insert into Customers values(2, 'cdn'); * insert into Customers values(3, 'krw'); * --------------------- * select (*) * from Customers C * join Orders O * on C.customerID = O.customerID * --------------------- * customerID, customerName, orderID, customerID, info * '1','ana','1','1','t1' * '1','ana','2','1','t2' * '1','ana','3','1','t3' * '2','cdn','4','2','t4' * '3','krw','5','3','t5' * --------------------- * * @param fn (elem1, elem2): bool | Promise * @param xs iterable * @param ys iterable */ export function innerJoin2(joinFunc: (l: T1, r: T2) => boolean | Promise, left: Iter>, right: Iter>): Promise>>; export function innerJoin2(joinFunc: (l: T1, r: T2) => boolean | Promise, left: Iter>): (right: Iter>) => Promise>>; export function innerJoin2(joinFunc: (l: T1, r: T2) => boolean | Promise): (left: Iter>) => (right: Iter>) => Promise>>;