Skip to content

Instantly share code, notes, and snippets.

@joshblack
Created April 17, 2016 07:42
Show Gist options
  • Save joshblack/130069d19c4bbe1729cbcf08621eb48b to your computer and use it in GitHub Desktop.
Save joshblack/130069d19c4bbe1729cbcf08621eb48b to your computer and use it in GitHub Desktop.
function * Producer() {
let number = 0;
while (true) {
yield number++;
}
}
function * takeWhile(iterator, predicate) {
let finished = false;
while (!finished) {
const { value, done } = iterator.next();
if (done) {
finished = true;
}
if (predicate(value)) {
yield value;
} else {
finished = true;
}
}
}
const lessThan = (number) => takeWhile(
Producer(),
(n) => n < number
);
function * head(iterable) {
const iterator = iterable[Symbol.iterator]();
const { value, done } = iterator.next();
yield value;
}
function * tail(iterable) {
const iterator = iterable[Symbol.iterator]();
iterator.next();
yield * iterator;
}
function * map(iterable, fn, context) {
const iterator = iterable[Symbol.iterator]();
for (let value of iterator) {
yield fn.call(context, value);
}
}
function * filter(iterable, fn, context) {
const iterator = iterable[Symbol.iterator]();
for (let value of iterator) {
if (fn.call(context, value)) {
yield value;
}
}
}
function * reduce(iterable, fn, initial, context) {
const iterator = iterable[Symbol.iterator]();
let accumulator = initial;
if (!accumulator) {
const { value } = iterator.next();
accumulator = value;
}
for (let value of iterator) {
yield accumulator = fn.call(context, accumulator, value);
}
}
const arr = [1, 2, 3, 4, 5];
const double = map(arr, (n) => n * 2);
const even = filter(arr, (n) => n % 2 === 0)
const sum = reduce(arr, (prev, curr) => prev + curr);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment