src/types/function-types/combine-join-function.ts
import { AnyIterable, Mapper } from 'augmentative-iterable';
import {
AsyncItemType,
FluentAsyncIterable,
FluentIterable,
IsAnyOrUnknown,
ItemType,
} from '../base';
export interface CombineJoinFunctionContract<T> {
/**
* Combines all the sub iterables, returning a new iterable with the inner matching combinations
*/
(): FluentIterable<T[]>;
/**
* Combines all the sub iterables, returning a new iterable with the inner matching combinations
* @param key A mapper that returns the key map value from the iterables
*/
<K>(key: Mapper<T, K>): FluentIterable<T[]>;
/**
* Combines all the sub iterables, returning a new iterable with the inner matching combinations
* @param key A property name with value will be used as for comparison with the key of the iterables
*/
(key: keyof T): FluentIterable<T[]>;
}
export type CombineJoinFunction<T> =
T extends Iterable<any>
? CombineJoinFunctionContract<ItemType<T>>
: IsAnyOrUnknown<T> extends true
? CombineJoinFunctionContract<ItemType<T>>
: {};
export interface AsyncCombineJoinFunctionContract<T> {
/**
* Combines all the sub iterables, returning a new iterable with the inner matching combinations
*/
(): FluentAsyncIterable<T[]>;
/**
* Combines all the sub iterables, returning a new iterable with the inner matching combinations
* @param key A mapper that returns the key map value from the iterables
*/
<K>(key: Mapper<T, K>): FluentAsyncIterable<T[]>;
/**
* Combines all the sub iterables, returning a new iterable with the inner matching combinations
* @param key A property name with value will be used as for comparison with the key of the iterables
*/
(key: keyof T): FluentAsyncIterable<T[]>;
}
export type AsyncCombineJoinFunction<T> =
T extends AnyIterable<any>
? AsyncCombineJoinFunctionContract<AsyncItemType<T>>
: IsAnyOrUnknown<T> extends true
? AsyncCombineJoinFunctionContract<AsyncItemType<T>>
: never;