import {composeTransitions} from './compose'; import {ComposedTransition, VariantsMap} from '../application/contracts'; export const permutations = (variants: VariantsMap): Map => { const options: {[variant: string]: Array} = {}; for (const k of Object.keys(variants)) { options[k] = Array.from(variants[k].values); } const combinations = recursivePermutations(options); const tuples = combinations.map( variant => <[V, ComposedTransition]> [variant, composeTransitions(variants, variant)]); return new Map(tuples); }; const recursivePermutations = (options: {[key: string]: Array}): Array => { const keys = Object.keys(options); if (keys.length === 0) { return new Array(); } const state: V = {}; const transformer = (index: number) => { const reducer = (p: Array, c: V) => { state[keys[index]] = c; if (index + 1 < keys.length) { return p.concat(...transformer(index + 1)); } return p.concat(Object.assign({}, state)); } return options[keys[index]].reduce(reducer, new Array()); }; return transformer(0); };