moltres-utils
Version:
Utils for Moltres apps
84 lines (64 loc) • 2.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _isResolvable = _interopRequireDefault(require("../saga/isResolvable"));
var _resolveWith = _interopRequireDefault(require("../saga/resolveWith"));
var _getProp = _interopRequireDefault(require("./getProp"));
var _iterator = _interopRequireDefault(require("./iterator"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const getDone = (0, _getProp.default)('done');
const getValue = (0, _getProp.default)('value');
const resolveNext = (next, fn, iter, recur) => (0, _resolveWith.default)(resolvedNext => {
if (getDone(resolvedNext)) {
return getValue(resolvedNext);
}
return recur(fn, iter);
}, next);
const doSeriesIteration = (fn, iter) => {
while (true) {
let next = iter.next();
if ((0, _isResolvable.default)(next)) {
return (0, _resolveWith.default)(resolvedNext => {
next = fn(resolvedNext);
if ((0, _isResolvable.default)(next)) {
return resolveNext(next, fn, iter, doSeriesIteration);
}
if (getDone(next)) {
return getValue(next);
}
return doSeriesIteration(fn, iter);
}, next);
}
next = fn(next);
if ((0, _isResolvable.default)(next)) {
return resolveNext(next, fn, iter, doSeriesIteration);
}
if (getDone(next)) {
return getValue(next);
}
}
};
/**
* This method iterates over the given collection or iterator in series. If the iterate method Returns
* done: true then the iteration will complete
*
* @func
* @param {Function} fn The iteratee Function
* @param {*} collection The collection or iterator to iterate over
* @returns {*} the final value returned when the iteratee returns done or undefined
* @example
*
* iterate((value, kdx) => {
* if (value === 'b') {
* return { done: true, value: kdx }
* }
* return { done: false }
* }, ['a', 'b', 'c'])
* //=> 1
*/
const iterate = (fn, collection) => doSeriesIteration(fn, (0, _iterator.default)(collection));
var _default = iterate;
exports.default = _default;
//# sourceMappingURL=iterate.js.map