JSFiddle - React, Tailwind, and code Playground
JavaScript
class LazyArray {
constructor (generate) {
this.generate = generate || function* () {}
}
static fromArray (array) {
return new LazyArray(function* () {
for (let item of array) {
yield item
}
})
}
static fromSlice (start, end, step=1) {
return new LazyArray(function* () {
let item = start
if (end === null || end === Infinity) {
while (true) {
yield item
item += step
}
} else {
while (item < end) {
yield item
item += step
}
}
})
}
toArray () {
const value = []
const generator = this.generate()
let next
while (true) {
next = generator.next()
if (next.done) {
break
}
value.push(next.value)
}
return value
}
map (fn) {
const me = this
return new LazyArray(function* () {
const generator = me.generate()
let next
while (true) {
next = generator.next()
if (next.done) {
break
}
yield fn(next.value)
}
})
}
filter (fn) {
const me = this
return new LazyArray(function* () {
const generator = me.generate()
let next
while (true) {
next = generator.next()
if (next.done) {
break
}
if (fn(next.value)) {
yield next.value
}
}
})
}
reduce (fn, initial) {
let value = initial
const generator = this.generate()
let next
while (true) {
next = generator.next()
if (next.done) {
break
}
value = fn(value, next.value)
}
return value
}
takeWhile (cond) {
const me = this
return new LazyArray(function* () {
const generator = me.generate()
let next
while (true) {
next = generator.next()
if (next.done) {
break
}
if (!cond(next.value)) {
break
}
...