JSFiddle - React, Tailwind, and code Playground

HTML

<div id='output'/>

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
        }
       ...