Skip to content

Instantly share code, notes, and snippets.

@srolel
Last active December 14, 2015 18:21
Show Gist options
  • Save srolel/ba3b517f684915fb2145 to your computer and use it in GitHub Desktop.
Save srolel/ba3b517f684915fb2145 to your computer and use it in GitHub Desktop.
const applyMapFn = (fn, {value}, thisArg) => fn.apply(null, value.reverse());
const generators = {
*filter([map, iteratee, thisArg]) {
const iterator = map.entries();
let nextItem = iterator.next();
while (!nextItem.done) {
const {value} = nextItem;
const result = iteratee.call(thisArg, value[1], value[0], map);
if (result) {
yield nextItem.value;
}
nextItem = iterator.next();
};
},
*map([map, iteratee, thisArg]) {
const iterator = map.entries();
let nextItem = iterator.next();
while (!nextItem.done) {
const {value} = nextItem;
yield iteratee.call(thisArg, value[1], value[0], map);
nextItem = iterator.next();
}
},
*reduce([map, iteratee, initialValue, thisArg]) {
const iterator = map.entries();
let nextItem = iterator.next();
let reducedValue = initialValue;
while (!nextItem.done) {
const {value} = nextItem;
reducedValue = iteratee.call(thisArg, value, value[1], value[0], map);
nextItem = iterator.next();
}
yield reducedValue;
}
};
export default ['filter', 'map', 'reduce'].reduce((obj, fnName) => {
obj[fnName] = function() {
return new Map(generators[fnName](arguments));
};
return obj;
}, {});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment