All files / array/operator allCombinations.ts

100% Statements 11/11
100% Branches 4/4
100% Functions 4/4
100% Lines 11/11

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 271x 1x 1x                       1x 17x 1x   16x 27x 126x 15x 16x        
import {allPairs} from './allPairs';
import {map} from './map';
import {pipe} from 'fnxt/pipe';
 
export function allCombinations(): [];
export function allCombinations<A>(a: A[]): [A][];
export function allCombinations<A, B>(a: A[], b: B[]): [A, B][];
export function allCombinations<A, B, C>(a: A[], b: B[], c: C[]): [A, B, C][];
export function allCombinations<A, B, C, D>(a: A[], b: B[], c: C[], d: D[]): [A, B, C, D][];
export function allCombinations<A, B, C, D, E>(a: A[], b: B[], c: C[], d: D[], e: E[]): [A, B, C, D, E][];
export function allCombinations<A, B, C, D, E, F>(a: A[], b: B[], c: C[], d: D[], e: E[], f: F[]): [A, B, C, D, E, F][];
export function allCombinations<A, B, C, D, E, F, G>(a: A[], b: B[], c: C[], d: D[], e: E[], f: F[], g: G[]): [A, B, C, D, E, F, G][];
export function allCombinations<A, B, C, D, E, F, G, H>(a: A[], b: B[], c: C[], d: D[], e: E[], f: F[], g: G[], h: H[]): [A, B, C, D, E, F, G, H][];
 
export function allCombinations(...arrays: unknown[][]): unknown[][] {
  if (arrays.length === 0) {
    return [];
  }
  const fn = ([head, ...tail]: unknown[][]): unknown[][] =>
    tail.length
      ? pipe(fn, allPairs(head), map(([h, t]) => [h, ...t]))(tail)
      : head.map(e => [e]);
  return fn(arrays);
 
}