Last active
March 4, 2019 19:06
-
-
Save highercomve/47df274e628ed593edd228391371d100 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const compose = (fn, ...funcs) => { | |
return (...args) => { | |
return funcs.reduce((acc, func) => func(acc), fn(...args)) | |
} | |
} | |
const generate = (fn, dependency = LazyIterable, descriptor) => { | |
return Object.create( | |
Object.assign({ [Symbol.iterator]: fn }, dependency), | |
descriptor | |
) | |
} | |
const map = (fn, iterable) => { | |
return generate(() => { | |
const iterator = iterable[Symbol.iterator]() | |
return { | |
next: () => { | |
const { done, value } = iterator.next() | |
return ({ done, value: done ? undefined : fn(value) }) | |
} | |
} | |
}) | |
} | |
const reduce = (fn, seed, iterable) => { | |
const iterator = iterable[Symbol.iterator]() | |
let iterationResult | |
let accumulator = seed | |
do { | |
iterationResult = iterator.next() | |
accumulator = iterationResult.done ? accumulator : fn(accumulator, iterationResult.value) | |
} while (!iterationResult.done) | |
return accumulator | |
} | |
const filter = (fn, iterable) => { | |
return generate(() => { | |
const iterator = iterable[Symbol.iterator]() | |
return { | |
next: () => { | |
do { | |
var { done, value } = iterator.next() | |
} while (!done && !fn(value)) | |
return { done, value } | |
} | |
} | |
}) | |
} | |
const until = (fn, iterable) => { | |
return generate(() => { | |
const iterator = iterable[Symbol.iterator]() | |
return { | |
next: () => { | |
let { done, value } = iterator.next() | |
done = done || fn(value) | |
return ({ done, value: done ? undefined : value }) | |
} | |
} | |
}) | |
} | |
const first = (iterable) => { | |
return iterable[Symbol.iterator]().next().value | |
} | |
const rest = (iterable) => { | |
return generate(() => { | |
const iterator = iterable[Symbol.iterator]() | |
iterator.next() | |
return iterator | |
}) | |
} | |
const take = (numberToTake, iterable) => { | |
return generate(() => { | |
const iterator = iterable[Symbol.iterator]() | |
let remainingElements = numberToTake | |
return { | |
next: () => { | |
let { done, value } = iterator.next() | |
done = done || remainingElements-- <= 0 | |
return ({ done, value: done ? undefined : value }) | |
} | |
} | |
}) | |
} | |
const getValue = function (iterable) { | |
return Array.from(iterable) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment