UNPKG

@tomzer0/collections

Version:

Array collection functions

66 lines (54 loc) 1.73 kB
const identity = i => i; const last = arr => arr[arr.length-1]; const also = (it, fn) => { fn(it); return it; } const flatten = arr => arr.reduce((acc, n) => { if (Array.isArray(n)) return acc.concat(flatten(n)); return acc.concat(n); }, []); const associate = (arr, keySelector, valueSelector=identity, initial={}) => arr.reduce((acc, n) => Object.assign({ [keySelector(n)]: valueSelector(n) }, acc), initial); const chunked = (arr, size, transform=identity) => arr.reduce((acc, n) => { if (last(acc).length < size) return also(acc, it => last(acc).push(n)); return also(acc, it => { it.push(transform(it.pop())); it.push([n]) }); }, [[]]); const union = (...arrs) => arrs.reduce((res, n) => [...new Set([...res, ...n])], []); const distinct = arr => [...new Set(arr)]; const drop = (arr, amt) => arr.slice(amt); const dropWhile = (arr, pred, curr=0) => pred(arr[curr]) ? dropWhile(arr.slice(1), pred, curr+1) : arr; const take = (arr, amt) => arr.slice(0, amt); const takeWhile = (arr, pred, curr=0, acc=[]) => pred(arr[curr]) ? takeWhile(arr, pred, curr+1, [...acc, arr[curr]]) : acc; const group = (arr, keySelector) => Object.values(arr.reduce((acc, n) => { const key = keySelector(n); return also(acc, it => (it[key] = [...(it[key] || []), n]) ); }, {})); const partition = (arr, pred=identity) => arr.reduce((acc, n) => also(acc, it => it[+!!pred(n)].push(n)), [ [], [] ]); const zip = (a, b) => Array.from(Array(Math.max(a.length, b.length))).reduce((acc, _, i) => also(acc, it => (it[i] = [a[i], b[i]])), []); module.exports = { last, also, flatten, associate, chunked, union, distinct, drop, dropWhile, take, takeWhile, group, partition, zip, };