// (C) 2007-2019 GoodData Corporation import { flatten } from "lodash"; export function cartesianProduct(arr: any[][]): any[][] { return arr.reduce( (result, b) => { return flatten( result.map(x => { return b.map(y => x.concat([y])); }), ); }, [[]], ); } export function rotatedCartesianProduct(arr: any[][]): any[][] { const cartesian = cartesianProduct(arr); const result = new Array(arr.length).fill(0).map(_ => []); cartesian.forEach(combination => { combination.forEach((header, idx) => { result[idx].push(header); }); }); return result; }