iterable

export function range(start: number, end: number) {
  if (start > end) throw new RangeError()
  let i = start

  return {
    [Symbol.iterator]() {
      return this
    },
    next() {
      if (i > end) return { done: true }

      return { value: i++, done: false }
    },
  }
}

for (const v of range(1, 3)) {
  console.log(v) // 1,2,3
}
// 等价于
const it = range(1, 3)
for (let v, res; (res = it.next()) && !res.done; ) {
  v = res.value
  console.log(v) // 1,2,3
}