@wormss/fixtake
v1.0.1
Published
iterator::take closes the original generator, this removes the ability but adds back a manual way to do it
Readme
@wormss/fixtake
A utility to prevent Iterator.prototype.take() (and other consumers) from automatically closing your generators.
The Problem
In modern JavaScript, using the new Iterator helpers like .take(n) or using a break inside a for...of loop will automatically call .return() on the underlying generator. This makes it impossible to partially consume a generator and then continue using it elsewhere.
function* numbers() {
yield 1; yield 2; yield 3;
}
const gen = numbers();
const taken = Array.from(gen.take(2)); // [1, 2]
// gen is now CLOSED because .take() called .return()
console.log(gen.next()); // { value: undefined, done: true }The Solution
fixTake "fixes" the generator by hiding its .return() method from consumers while exposing it as .close() for when you actually want to terminate it manually.
import { fixTake } from '@wormss/fixtake';
function* numbers() {
yield 1; yield 2; yield 3; yield 4;
}
const gen = fixTake(numbers());
const firstTwo = Array.from(gen.take(2)); // [1, 2]
// gen is STILL OPEN!
console.log(gen.next().value); // 3
const lastOne = Array.from(gen.take(1)); // [4]
// gen is still open (but exhausted)Installation
npm install @wormss/fixtakeUsage
Basic Example
import { fixTake } from '@wormss/fixtake';
function* source() {
yield 'a';
yield 'b';
yield 'c';
}
const gen = fixTake(source());
// This would normally close 'gen'
for (const item of gen.take(1)) {
console.log(item); // 'a'
}
// But with fixTake, we can keep going!
console.log(gen.next().value); // 'b'Manual Closing
If you need to trigger finally blocks or terminate the generator early, use the added .close() method:
const gen = fixTake(someGenerator());
// ... do work ...
gen.close(); // Equivalent to the original .return()API
fixTake(generator)
- Arguments: A standard
Generatorobject. - Returns: A
CloseableGeneratorwhich is the same generator but with.returnset toundefinedand the original.returnmoved to.close.
License
ISC
