foop
Version:
interfaces that describe their intentions.
99 lines (88 loc) • 9.85 kB
JavaScript
var isNil = require('../../is/nullOrUndefined')
var isFunction = require('../../is/function')
var hasOwnProperty = require('../../util/hasOwnProperty')
var symIterator = require('../../symbols/iterator')
var isArrayLike = require('../../is/arrayLike')
var bind = require('../../fp/bind')
var ON_INIT = '@@transducer/init'
var ON_STEP = '@@transducer/step'
var ON_REDUCED = '@@transducer/reduced'
var ON_VALUE = '@@transducer/value'
var ON_RESULT = '@@transducer/result'
var FANTASY_LAND_REDUCE = 'fantasy-land/reduce'
var _xwrap = (function() {
function XWrap(fn) {
this.f = fn
}
XWrap.prototype[ON_INIT] = function() {
throw new Error('init not implemented on XWrap')
}
XWrap.prototype[ON_RESULT] = function(acc) { return acc }
XWrap.prototype[ON_STEP] = function(acc, x) {
return this.f(acc, x)
}
// @TODO construct?
return function _xwrap(fn) {
return new XWrap(fn)
}
})()
/**
* @name _reduce
* @since 5.0.0-beta.6
* @memberOf loop
* @return {Function}
*/
// list aka functor
var reduce = (function() {
function _arrayReduce(xf, acc, list) {
var idx = 0
var len = list.length
while (idx < len) {
acc = xf[ON_STEP](acc, list[idx])
if (acc && acc[ON_REDUCED]) {
acc = acc[ON_VALUE]
break
}
idx += 1
}
return xf[ON_RESULT](acc)
}
function _iterableReduce(xf, acc, iter) {
var step = iter.next()
while (!step.done) {
acc = xf[ON_STEP](acc, step.value)
if (hasOwnProperty(acc, ON_REDUCED)) {
acc = acc[ON_VALUE]
break
}
step = iter.next()
}
return xf[ON_RESULT](acc)
}
function _methodReduce(xf, acc, obj, methodName) {
return xf[ON_RESULT](obj[methodName](bind(xf[ON_STEP], xf), acc))
}
return function _reduce(fn, acc, list) {
if (isFunction(fn)) {
fn = _xwrap(fn)
}
if (isArrayLike(list)) {
return _arrayReduce(fn, acc, list)
}
else if (isFunction(list[FANTASY_LAND_REDUCE])) {
return _methodReduce(fn, acc, list, FANTASY_LAND_REDUCE)
}
else if (!isNil(list[symIterator])) {
return _iterableReduce(fn, acc, list[symIterator]())
}
else if (isFunction(list.next)) {
return _iterableReduce(fn, acc, list)
}
else if (isFunction(list.reduce)) {
return _methodReduce(fn, acc, list, 'reduce')
}
throw new TypeError('reduce: list must be array or iterable')
}
})()
module.exports = reduce
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JlZHVjZS5qcyIsInNvdXJjZXMiOlsiX3JlZHVjZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBpc05pbCA9IHJlcXVpcmUoJy4uLy4uL2lzL251bGxPclVuZGVmaW5lZCcpXG5jb25zdCBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi4vLi4vaXMvZnVuY3Rpb24nKVxuY29uc3QgaGFzT3duUHJvcGVydHkgPSByZXF1aXJlKCcuLi8uLi91dGlsL2hhc093blByb3BlcnR5JylcbmNvbnN0IHN5bUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vLi4vc3ltYm9scy9pdGVyYXRvcicpXG5jb25zdCBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4uLy4uL2lzL2FycmF5TGlrZScpXG5jb25zdCBiaW5kID0gcmVxdWlyZSgnLi4vLi4vZnAvYmluZCcpXG5cbmNvbnN0IE9OX0lOSVQgPSAnQEB0cmFuc2R1Y2VyL2luaXQnXG5jb25zdCBPTl9TVEVQID0gJ0BAdHJhbnNkdWNlci9zdGVwJ1xuY29uc3QgT05fUkVEVUNFRCA9ICdAQHRyYW5zZHVjZXIvcmVkdWNlZCdcbmNvbnN0IE9OX1ZBTFVFID0gJ0BAdHJhbnNkdWNlci92YWx1ZSdcbmNvbnN0IE9OX1JFU1VMVCA9ICdAQHRyYW5zZHVjZXIvcmVzdWx0J1xuY29uc3QgRkFOVEFTWV9MQU5EX1JFRFVDRSA9ICdmYW50YXN5LWxhbmQvcmVkdWNlJ1xuXG52YXIgX3h3cmFwID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBYV3JhcChmbikge1xuICAgIHRoaXMuZiA9IGZuXG4gIH1cbiAgWFdyYXAucHJvdG90eXBlW09OX0lOSVRdID0gZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbml0IG5vdCBpbXBsZW1lbnRlZCBvbiBYV3JhcCcpXG4gIH1cbiAgWFdyYXAucHJvdG90eXBlW09OX1JFU1VMVF0gPSBmdW5jdGlvbihhY2MpIHsgcmV0dXJuIGFjYyB9XG4gIFhXcmFwLnByb3RvdHlwZVtPTl9TVEVQXSA9IGZ1bmN0aW9uKGFjYywgeCkge1xuICAgIHJldHVybiB0aGlzLmYoYWNjLCB4KVxuICB9XG5cbiAgLy8gQFRPRE8gY29uc3RydWN0P1xuICByZXR1cm4gZnVuY3Rpb24gX3h3cmFwKGZuKSB7XG4gICAgcmV0dXJuIG5ldyBYV3JhcChmbilcbiAgfVxufSkoKVxuXG4vKipcbiAqIEBuYW1lIF9yZWR1Y2VcbiAqIEBzaW5jZSA1LjAuMC1iZXRhLjZcbiAqIEBtZW1iZXJPZiBsb29wXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuLy8gbGlzdCBha2EgZnVuY3RvclxuY29uc3QgcmVkdWNlID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBfYXJyYXlSZWR1Y2UoeGYsIGFjYywgbGlzdCkge1xuICAgIGxldCBpZHggPSAwXG4gICAgY29uc3QgbGVuID0gbGlzdC5sZW5ndGhcbiAgICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgICBhY2MgPSB4ZltPTl9TVEVQXShhY2MsIGxpc3RbaWR4XSlcbiAgICAgIGlmIChhY2MgJiYgYWNjW09OX1JFRFVDRURdKSB7XG4gICAgICAgIGFjYyA9IGFjY1tPTl9WQUxVRV1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGlkeCArPSAxXG4gICAgfVxuICAgIHJldHVybiB4ZltPTl9SRVNVTFRdKGFjYylcbiAgfVxuXG4gIGZ1bmN0aW9uIF9pdGVyYWJsZVJlZHVjZSh4ZiwgYWNjLCBpdGVyKSB7XG4gICAgbGV0IHN0ZXAgPSBpdGVyLm5leHQoKVxuICAgIHdoaWxlICghc3RlcC5kb25lKSB7XG4gICAgICBhY2MgPSB4ZltPTl9TVEVQXShhY2MsIHN0ZXAudmFsdWUpXG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkoYWNjLCBPTl9SRURVQ0VEKSkge1xuICAgICAgICBhY2MgPSBhY2NbT05fVkFMVUVdXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBzdGVwID0gaXRlci5uZXh0KClcbiAgICB9XG4gICAgcmV0dXJuIHhmW09OX1JFU1VMVF0oYWNjKVxuICB9XG5cbiAgZnVuY3Rpb24gX21ldGhvZFJlZHVjZSh4ZiwgYWNjLCBvYmosIG1ldGhvZE5hbWUpIHtcbiAgICByZXR1cm4geGZbT05fUkVTVUxUXShvYmpbbWV0aG9kTmFtZV0oYmluZCh4ZltPTl9TVEVQXSwgeGYpLCBhY2MpKVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIF9yZWR1Y2UoZm4sIGFjYywgbGlzdCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgZm4gPSBfeHdyYXAoZm4pXG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXlMaWtlKGxpc3QpKSB7XG4gICAgICByZXR1cm4gX2FycmF5UmVkdWNlKGZuLCBhY2MsIGxpc3QpXG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRnVuY3Rpb24obGlzdFtGQU5UQVNZX0xBTkRfUkVEVUNFXSkpIHtcbiAgICAgIHJldHVybiBfbWV0aG9kUmVkdWNlKGZuLCBhY2MsIGxpc3QsIEZBTlRBU1lfTEFORF9SRURVQ0UpXG4gICAgfVxuICAgIGVsc2UgaWYgKCFpc05pbChsaXN0W3N5bUl0ZXJhdG9yXSkpIHtcbiAgICAgIHJldHVybiBfaXRlcmFibGVSZWR1Y2UoZm4sIGFjYywgbGlzdFtzeW1JdGVyYXRvcl0oKSlcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNGdW5jdGlvbihsaXN0Lm5leHQpKSB7XG4gICAgICByZXR1cm4gX2l0ZXJhYmxlUmVkdWNlKGZuLCBhY2MsIGxpc3QpXG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRnVuY3Rpb24obGlzdC5yZWR1Y2UpKSB7XG4gICAgICByZXR1cm4gX21ldGhvZFJlZHVjZShmbiwgYWNjLCBsaXN0LCAncmVkdWNlJylcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWR1Y2U6IGxpc3QgbXVzdCBiZSBhcnJheSBvciBpdGVyYWJsZScpXG4gIH1cbn0pKClcblxubW9kdWxlLmV4cG9ydHMgPSByZWR1Y2VcbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCJdLCJtYXBwaW5ncyI6IkFB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