// ⭐ import
const Iterator = require('./Iterator.js'); // extend iterators
const integers = require('./integers.js'); // infinite generator
// ✅ test method chaining:
// Note:
// - each method returns a different generator
// (except for .forEach, which returns `undefined`)
integers() // 👔 generator: 0, 1, 2, ...
.filter(x => x > 0) // 👔 generator: 1, 2, 3, ...
.map(x => x * 2) // 👔 generator: 2, 4, 6, ...
.take(4) // 👔 generator: 2, 4, 6, 8
.forEach(x => console.log(x)) // 👔 console: 2, 4, 6, 8
;
// ⭐ prototype chain (of a String iterator)
let it = 'abc'[Symbol.iterator](); // iterator of String
let proto1 = Object.getPrototypeOf(it); // StringIteratorPrototype
let proto2 = Object.getPrototypeOf(proto1); // IteratorPrototype
let proto3 = Object.getPrototypeOf(proto2); // Object.prototype
let proto4 = Object.getPrototypeOf(proto3); // null
// log
[
// ⭐ iterator only iterates once❗
it.toArray(), // [ 'a', 'b', 'c' ]
it.toArray(), // [] ⭐ `it` is "exhausted"❗
// ✅ test prototype chain
it, // String iterator
it instanceof Iterator, // true
proto1, // StringIteratorPrototype
proto2 === Iterator.prototype, // true
proto3 === Object.prototype, // true
proto4 === null, // true
// ✅ test .take()
integers().take(5).toArray(), // [ 0, 1, 2, 3, 4 ]
// ✅ test .every(), .some()
integers() // 0, 1, 2, ...
.take(5) // 0, 1, 2, 3, 4
.every(x => x >= 0), // true
integers()
.take(5)
.every(x => x < 3), // false
integers()
.take(5)
.some(x => x < 3), // true
].forEach(x => { console.log(x) });