UNPKG

autonomy

Version:

Lightweight functional utility library complementing ES6

103 lines (90 loc) 2.93 kB
var $ = {}; // --------------------------------------------- // Functional Helpers // --------------------------------------------- $.id = (x) => x; $.noop = function () {}; $.not = (fn) => (x) => !fn(x); $.all = (fn) => (xs) => xs.every(fn); $.any = (fn) => (xs) => xs.some(fn); $.none = (fn) => (xs) => !xs.some(fn); $.elem = (xs) => (x) => xs.indexOf(x) >= 0; $.notElem = (xs) => (x) => xs.indexOf(x) < 0; $.extend = Object.assign; // --------------------------------------------- // Math // --------------------------------------------- $.gcd = function (a_, b_) { var a = Math.abs(a_); var b = Math.abs(b_); while (b) { var temp = b; b = a % b; a = temp; } return a; }; $.lcm = (a, b) => (!a || !b) ? 0 : Math.abs((a * b) / $.gcd(a, b)); $.even = (n) => n % 2 === 0; $.odd = (n) => n % 2 === 1; // --------------------------------------------- // Property accessors // --------------------------------------------- $.pluck = (prop, xs) => xs.map((x) => x[prop]); $.first = (xs) => xs[0]; $.last = (xs) => xs[xs.length - 1]; $.firstBy = function (fn, xs) { for (var i = 0, len = xs.length; i < len; i += 1) { if (fn(xs[i])) { return xs[i]; } } }; $.lastBy = function (fn, xs) { for (var i = xs.length - 1; i >= 0; i -= 1) { if (fn(xs[i])) { return xs[i]; } } }; // --------------------------------------------- // Higher order looping // --------------------------------------------- $.range = (length) => Array.from({length}, (v, k) => k + 1); $.interval = function (start, stop) { return Array.from({length: stop - start + 1}, (v, k) => start + k); }; $.replicate = (length, fn) => Array.from({length}, fn); $.iterate = function (times, init, fn) { var result = [init]; for (var i = 1; i < times; i += 1) { result.push(fn(result[i - 1])); } return result; }; $.zipWith2 = function (fn, xs, ys) { var length = Math.min(xs.length, ys.length); return Array.from({length}, (v, k) => fn(xs[k], ys[k])); }; $.zipWith3 = function (fn, xs, ys, zs) { var length = Math.min(xs.length, ys.length, zs.length); return Array.from({length}, (v, k) => fn(xs[k], ys[k], zs[k])); }; $.zipWith4 = function (fn, xs, ys, zs, ws) { var length = Math.min(xs.length, ys.length, zs.length, ws.length); return Array.from({length}, (v, k) => fn(xs[k], ys[k], zs[k], ws[k])); }; $.zip2 = (xs, ys) => $.zipWith2((x, y) => [x, y], xs, ys); $.zip3 = (xs, ys, zs) => $.zipWith3(((x, y, z) => [x, y, z]), xs, ys, zs); $.zip4 = (xs, ys, zs, ws) => $.zipWith4((x, y, z, w) => [x, y, z, w], xs, ys, zs, ws); // sensible defaults $.zipWith = $.zipWith2; $.zip = $.zip2; // --------------------------------------------- // Curried Prototype Accessors // --------------------------------------------- $.reduce = (fn, init) => (xs) => xs.reduce(fn, init); $.map = (fn) => (xs) => xs.map(fn); $.filter = (fn) => (xs) => xs.filter(fn); // end - export module.exports = $;