/** * Reduce function for iterables. * * @see https://github.com/jb55/reduce-iterator * * @param xs * @param reducer * @param acc * @returns {*} */ function reduceIterator (xs, reducer, acc) { let first = true; let prev = acc; for (let x of xs) { if (first) { first = false; if (arguments.length < 3) { prev = x; continue; } } prev = reducer(prev, x) } return prev; } /** * Pipes an iterable through a variadric functions array. * * @param fns * @returns {function(*=): *} */ export const pipe = (...fns) => function (iterable) { return reduceIterator(fns, (result, fn) => fn(result), iterable); }; /** * Takes a number of elements from an iterable. * * @param {Number} n Number of elements * @returns {Function} Generator */ export const take = n => function* (iterable) { let i = 0; for (let item of iterable) { if (i < n) { yield item; } i++; } }; /** * Takes elements from an iterable that match the given predicate. * * @param {Function} predicate * @returns {Function} */ export const takeIf = predicate => function* (iterable) { for (let item of iterable) { if (predicate(item)) { yield item; } } }; /** * Skips a number of elements in an iterable and yields the rest. * * @param {Number} n Number of elements * @returns {Function} Generator */ export const skip = n => function* (iterable) { let i = 0; for (let item of iterable) { if (i >= n) { yield item; } i++; } }; /** * Skips items of an iterable that match the given predicate. * * @param {Function} predicate * @returns {Function} Generator */ export const skipIf = predicate => function* (iterable) { for (let item of iterable) { if (!predicate(item)) { yield item; } } };