import {copy, Map} from 'tsfun'; import {reduce} from 'tsfun/associative'; /** * source: ['c','d'] * target: {} * f: a => [a, a + a] * -> * { c: 'cc', d: 'dd'} */ export function assocReduce(f: (a: A, i?: number|string) => [number, T], target: Array) : (source: Array|Map) => Array; export function assocReduce(f: (a: A, i?: number|string) => [string, T], target: Map) : (source: Array|Map) => Map; export function assocReduce(f: (a: A, i?: number|string) => [string|number, T], target: Map|Array) { return reduce((copied: Map, a: A, i: number|string) => { const [k1, v1] = f(a, i); copied[k1] = v1; return copied; }, /* we do not modify target in place */ copy(target as any) as any) as (source: Array|Map) => Map; }