Skip to content

Instantly share code, notes, and snippets.

@CMCDragonkai
Last active October 10, 2021 09:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CMCDragonkai/d431401b761066750275ba286debc954 to your computer and use it in GitHub Desktop.
Save CMCDragonkai/d431401b761066750275ba286debc954 to your computer and use it in GitHub Desktop.
Generators and Iterators in JavaScript #javascript #typescript
function* range(start: number, stop?: number, step = 1): Generator<number> {
if (stop == null) {
stop = start;
start = 0;
}
for (let i = start; step > 0 ? i < stop : i > stop; i += step) {
yield i;
}
}
console.log([...range(0, 10)]);
function *take<T>(g: Iterator<T>, l: number): Generator<T> {
for (let i = 0; i < l; i++) {
const item = g.next();
if (item.done) return;
yield item.value;
}
}
console.log([...take(range(0, 10), 3)]);
/**
* Take n items from asynchronous iterator
*/
async function *takeAsync<T>(g: AsyncIterator<T>, l: number): AsyncGenerator<T> {
for (let i = 0; i < l; i++) {
const item = await g.next();
if (item.done) return;
yield item.value;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment