@tomzer0/collections
Version:
Array collection functions
66 lines (54 loc) • 1.73 kB
JavaScript
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,
};