UNPKG

@ibrokethat/iter

Version:
954 lines (712 loc) 20 kB
"use strict"; var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; })(); function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } } const StopIteration = new Error(); const Sparse = {}; const GeneratorFunctionPrototype = Object.getPrototypeOf(function* () { yield 1; }); const GeneratorFunction = GeneratorFunctionPrototype.constructor; exports.GeneratorFunctionPrototype = GeneratorFunctionPrototype; exports.GeneratorFunction = GeneratorFunction; /** @description returns true if a === b @param {a} object @param {b} function @return {boolean} */ function eq(a, b) { return a === b; } function negate(fn, v, k) { return !fn(v, k); } function returns(o) { let genSet = function (v, k, type) { if (!r) { var _cache$get = cache.get(type || Array); var _cache$get2 = _slicedToArray(_cache$get, 2); r = _cache$get2[0]; set = _cache$get2[1]; } set(v, k); }; let cache = new WeakMap(); cache.set(Array, [[], function (v, k) { return r.push(v); }]); cache.set(Map, [new Map(), function (v, k) { return r.set(k, v); }]); cache.set(Set, [new Set(), function (v) { return r.add(v); }]); cache.set(Object, [{}, function (v, k) { return r[k] = v; }]); cache.set(GeneratorFunction, [null, genSet]); cache.set(GeneratorFunctionPrototype, [null, genSet]); var _cache$get3 = cache.get(o.constructor); var _cache$get4 = _slicedToArray(_cache$get3, 2); let r = _cache$get4[0]; let set = _cache$get4[1]; return { set: set, get: function () { return r; } }; } function curry(fn) { // ...args doesn't work for this return if we don't babel => as well return function () { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } switch (args.length) { case 0: throw new Error(fn.name + ': called with no arguments'); case 1: let fn1 = args[0]; return function () { for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } return fn.apply(undefined, args.concat([fn1])); }; default: return fn.apply(undefined, args); }; }; } function curry1(fn) { // ...args doesn't work for this return if we don't babel => as well return function () { for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } switch (args.length) { case 0: throw new Error(fn.name + ': called with no arguments'); default: return fn.apply(undefined, args); }; }; } /** @description creates an iterable object from another object @param {object} object @return {iterable} */ function iterator(object) { let o = typeof object === 'function' ? object() : object; switch (true) { case typeof o.entries === 'function': return o.entries(); case typeof o[Symbol.iterator] === 'function': return o[Symbol.iterator](); case typeof o.next === 'function': return o; default: return (function* () { let i = 0; let keys = Object.keys(o); let len = keys.length; while (i < len) { yield [keys[i], o[keys[i++]], Object]; } })(); } } exports.iterator = iterator; /** @descrption applies a function to each item in an object after selecting most appropriate method to perform the iteration @param {o} object @param {fn} function */ function _forEach(o, fn) { try { // fastpath if (typeof o !== 'function' && typeof o.length === 'number') { for (let i = 0, l = o.length; i < l; i++) { fn(o[i], i); } } else if (typeof o.entries === 'function') { for (let _ref of o.entries()) { var _ref2 = _slicedToArray(_ref, 2); let k = _ref2[0]; let v = _ref2[1]; fn(v, k); } } else if (typeof o[Symbol.iterator] === 'function') { for (let _ref3 of o) { var _ref4 = _slicedToArray(_ref3, 3); let k = _ref4[0]; let v = _ref4[1]; let type = _ref4[2]; k = type === Set ? v : k; fn(v, k, type); } } else if (typeof o === 'function') { for (let _ref5 of o()) { var _ref6 = _slicedToArray(_ref5, 3); let k = _ref6[0]; let v = _ref6[1]; let type = _ref6[2]; k = type === Set ? v : k; fn(v, k, type); } } else { let it = iterator(o); let data = it.next(); while (!data.done) { var _data$value = _slicedToArray(data.value, 3); let k = _data$value[0]; let v = _data$value[1]; let type = _data$value[2]; k = type === Set ? v : k; fn(v, k, type); data = it.next(); } } } catch (e) { if (e !== StopIteration) { throw e; } } } let forEach = exports.forEach = curry(_forEach); /** @description pulls all the data from an iterable object into the correct data structure @param {object} o @param {function} fn @return {iterable} */ function collect(o, type) { let r = returns(o); forEach(o, function (v, k, type) { return r.set(v, k, type); }); return r.get() || returns(type).get(); } /** @description creates an iterator filter @param {object} o @param {function} fn @return {iterable} */ function* _ifilter(o, fn) { let type = o.constructor; let iterable = iterator(o); let data = iterable.next(); while (!data.done) { var _data$value2 = _slicedToArray(data.value, 3); let k = _data$value2[0]; let v = _data$value2[1]; let t = _data$value2[2]; if (fn(v, k)) { yield [k, v, t || type]; } data = iterable.next(); } } let filter = exports.ifilter = curry(_ifilter); /** @descrption calls a function on each item in an object and returns the item if 'true' @param {o} object @param {fn} function */ function _filter(o, fn) { return collect(_ifilter(o, fn), o); } exports.filter = curry(_filter); /** @description creates an iterator map @param {object} o @param {function} fn @return {iterable} */ function* _imap() { for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { args[_key4] = arguments[_key4]; } if (args.length === 2) { let o = args[0]; let fn = args[1]; let iterable = iterator(o); let data = iterable.next(); let type = o.constructor; while (!data.done) { var _data$value3 = _slicedToArray(data.value, 3); let k = _data$value3[0]; let v = _data$value3[1]; let t = _data$value3[2]; yield [k, fn(v, k), t || type]; data = iterable.next(); } } else { let fn = args.pop(); let type = args[0].constructor; let iterables = map(args, iterator); let data = invoke(iterables, 'next'); while (_filter(data, function (v) { return v.done; }).length === 0) { var _data$0$value = _slicedToArray(data[0].value, 3); let k = _data$0$value[0]; let t = _data$0$value[2]; let v = fn.apply(undefined, _toConsumableArray(pluck(data, 'value.1'))); yield [k, v, t || type]; data = invoke(iterables, 'next'); } } } exports.imap = curry(_imap); /** @descrption calls a function on each item in an object and returns the result @param {o} object @param {fn} function @return {object|array} */ function _map() { for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { args[_key5] = arguments[_key5]; } if (args.length === 2) { let o = args[0]; let fn = args[1]; if (typeof o !== 'function' && typeof o.length === 'number') { let r = Array(o.length); _forEach(o, function (v, k) { return r[k] = fn(v, k); }); return r; } } return collect(_imap.apply(undefined, args), args[0]); } let map = exports.map = curry(_map); /* @description adds the value of each index from each object into an array @param {object} o @param {any} [ret] @return {number} */ function izip() { for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { args[_key6] = arguments[_key6]; } if (args.length === 1) { return args[0]; } // => doesn't work here - weird return _imap.apply(undefined, args.concat([function () { for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) { args[_key7] = arguments[_key7]; } return args; }])); } exports.izip = izip; /* @description adds the value of each index from each object into an array @param {object} o @param {any} [ret] @return {number} */ function zip() { return collect(izip.apply(undefined, arguments), arguments[0]); } exports.zip = zip; /** @description take while the predicate is true @param {o} object @param {fn} funtion @return {int|string} */ function* _itakeWhile(o, fn) { let iterable = iterator(o); let data = iterable.next(); while (!data.done) { var _data$value4 = _slicedToArray(data.value, 3); let k = _data$value4[0]; let v = _data$value4[1]; let type = _data$value4[2]; if (fn(v, k)) { yield [k, v, type]; } else { break; } data = iterable.next(); } } exports.itakeWhile = curry(_itakeWhile); /** @description take while the predicate is true @param {o} object @param {fn} funtion @return {int|string} */ function _takeWhile(o, fn) { return collect(_itakeWhile(o, fn), o); } exports.takeWhile = curry(_takeWhile); /** @description take while the predicate is true @param {o} object @param {fn} funtion @return {int|string} */ function _itake(o) { let n = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1]; return _itakeWhile(o, function (v, k) { return k < n; }); } exports.itake = curry1(_itake); function _take(o) { let n = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1]; return collect(_itake(o, n), o); } exports.take = curry1(_take); /** @description drop while the predicate is true @param {o} object @param {fn} funtion @return {int|string} */ function* _idropWhile(o, fn) { let iterable = iterator(o); let take = false; let data = iterable.next(); while (!data.done) { var _data$value5 = _slicedToArray(data.value, 3); let k = _data$value5[0]; let v = _data$value5[1]; let type = _data$value5[2]; take = take || !fn(v, k); if (take) { yield [k, v, type]; } data = iterable.next(); } } exports.idropWhile = curry(_idropWhile); /** @description ignore while the predicate is true @param {o} object @param {fn} function @return {int|string} */ function _dropWhile(o, fn) { return collect(_idropWhile(o, fn), o); } exports.dropWhile = curry(_dropWhile); function _idrop(o) { let n = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1]; return _idropWhile(o, function (v, k) { return k < n; }); } exports.idrop = curry1(_idrop); function _drop(o) { let n = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1]; return collect(_idrop(o, n), o); } exports.drop = curry1(_drop); function _groupBy(o, fn) { let type = o.constructor; let iterable = iterator(o); let data = iterable.next(); var _data$value6 = _slicedToArray(data.value, 3); let k = _data$value6[0]; let v = _data$value6[1]; let t = _data$value6[2]; let key = fn(v, k); let r = typeof key === 'number' ? [] : typeof key === 'string' ? {} : new Map(); while (!data.done) { var _data$value7 = _slicedToArray(data.value, 3); let k = _data$value7[0]; let v = _data$value7[1]; let t = _data$value7[2]; let key = fn(v, k); if (r.constructor === Map) { if (!r.has(key)) { r.set(key, returns(o)); } r.get(key).set(v, k, t || type); } else { if (!r[key]) { r[key] = returns(o); } r[key].set(v, k, t || type); } data = iterable.next(); } return map(r, function (v) { return v ? v.get() : null; }); } exports.groupBy = curry(_groupBy); function _indexBy(o, fn) { return _map(_igroupBy(o, fn), function (v, k, type) { return v; }); } exports.indexBy = curry(_indexBy); function _part(o, fn) { let iterable = iterator(o); let data = iterable.next(); let t = returns(o); let f = returns(o); while (!data.done) { var _data$value8 = _slicedToArray(data.value, 3); let k = _data$value8[0]; let v = _data$value8[1]; let type = _data$value8[2]; if (fn(v, k)) { t.set(v, k, type); } else { f.set(v, k, type); } data = iterable.next(); } return [t.get(), f.get()]; } exports.part = curry(_part); /** @description invokes the passed method on a collection of Objects and returns an Array of the values returned by each Object @param {object} items @param {string} method @param {any} [arg1, arg2, ..., argN] @return {array} */ function invoke(items, method) { let args = Array.prototype.slice.call(arguments, 2); let i = -1; let l = Array.isArray(items) ? items.length : 0; let res = []; while (++i < l) { res.push(items[i][method].apply(items[i], args)); } return res; } exports.invoke = invoke; /** @description pluck values from a collection of Objects @param {object} items @param {string} key @param {boolean} [only_existing] @return {array} */ function pluck(items, key, only_existing) { only_existing = only_existing === true; let U; let i = -1; let l = Array.isArray(items) ? items.length : 0; let res = []; let val; if (key.indexOf('.') > -1) { return reduce(key.split('.'), function (v, k) { return pluck(v, k, only_existing); }, items); } while (++i < l) { val = key in Object(items[i]) ? items[i][key] : U; if (only_existing !== true || val !== null && val !== U) { res.push(val); } } return res; } exports.pluck = pluck; function _first(o, fn) { let r; forEach(o, function (v, k) { if (fn(v, k)) { r = [v, k]; throw StopIteration; } }); return r; } let first = exports.first = curry(_first); function _last(o, fn) { let r; forEach(o, function (v, k) { if (fn(v, k)) { r = [v, k]; } }); return r; } let last = exports.last = curry(_last); /** @description returns true if any of the items evaluate to true else returns false @param {o} object @param {fn} function @param {object} [scope] @return {boolean} */ function _some(o, fn) { return !!first(o, fn); } exports.some = curry(_some); /** @description returns true if all of the items evaluate to true else returns false @param {o} object @param {fn} function @param {object} [scope] @return {boolean} */ function _every(o, fn) { return !!!first(o, negate.bind(null, fn)); } exports.every = curry(_every); /** @description returns the index of the first match @param {o} object @param {any} val @return {int|string} */ function _indexOf(o, el) { let r = first(o, eq.bind(null, el)); return r ? r[1] : -1; } exports.indexOf = curry(_indexOf); /** @description returns the index|key of the first item to match the predicate function @param {o} object @param {any} val @return {int|string} */ function _findIndex(o, fn) { let r = first(o, fn); return r ? r[1] : -1; } exports.findIndex = curry(_findIndex); /** @description returns the value of the first item to match the predicate function @param {o} object @param {any} val @return {int|string} */ function _find(o, fn) { let r = first(o, fn); return r ? r[0] : undefined; } exports.find = curry(_find); /** @description returns the index of the last match @param {o} object @param {any} val @return {int|string} */ function _lastIndexOf(o, el) { let r = last(o, eq.bind(null, el)); return r ? r[1] : -1; } exports.lastIndexOf = curry(_lastIndexOf); /** @description returns the index|key of the last item to match the predicate function @param {o} object @param {any} val @return {int|string} */ function _findLastIndex(o, fn) { let r = last(o, fn); return r ? r[1] : -1; } exports.findLastIndex = curry(_findLastIndex); /** @description returns the value of the first last to match the predicate function @param {o} object @param {any} val @return {int|string} */ function _findLast(o, fn) { let r = last(o, fn); return r ? r[0] : undefined; } exports.findLast = curry(_findLast); /** @description reduces the value of the object down to a single value @param {any} acc @param {object} o @param {function} fn @return {any} */ function reduce(o, fn, acc) { let noAcc = typeof acc === 'undefined'; let iterable; if (noAcc) { iterable = iterator(o); let data = iterable.next(); if (data.done) { throw new TypeError("reduce() of sequence with no initial value"); } else { acc = data.value[1]; } } else { iterable = o; } forEach(iterable, function (value, key) { acc = fn(acc, value, key); }); return acc; } exports.reduce = reduce; /** @description adds the values of the object @param {object} o @param {any} [ret] @return {number} */ function sum(o, acc) { return reduce(o, function (acc, a) { return acc + a; }, acc); } exports.sum = sum; function* chain() { for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { args[_key8] = arguments[_key8]; } if (args.length === 1) { return iterator(args[0]); } let iterables = map(args, iterator); let data = iterables[0].next(); while (true) { if (!data.done) { yield data.value; } else { if (iterables.length === 1) { break; } iterables.shift(); } data = iterables[0].next(); } } exports.chain = chain; /** @description creates a range iterable @param {number} start @param {number} stop @param {number} [step] @return {iterable} */ function* irange(start, stop) { let step = arguments.length <= 2 || arguments[2] === undefined ? 1 : arguments[2]; let i = 0; while (start <= stop) { yield [i++, start]; start = start + step; } } exports.irange = irange; //# sourceMappingURL=index.js.map