Skip to content

Instantly share code, notes, and snippets.

@highercomve
Last active March 4, 2019 19:06
Show Gist options
  • Save highercomve/47df274e628ed593edd228391371d100 to your computer and use it in GitHub Desktop.
Save highercomve/47df274e628ed593edd228391371d100 to your computer and use it in GitHub Desktop.
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