Skip to content

Instantly share code, notes, and snippets.

@jed

jed/iterator.js

Last active Jan 21, 2021
Embed
What would you like to do?
Turning callbacks into async iterators, with a React hook-like API.
// Example usage:
//
// void async function() {
// let [clicks, onclick] = iterator()
// document.querySelector('button').addEventListener('click', onclick)
// for await (let click of clicks) console.log(click)
// }()
export default function iterator() {
let done = false
let events = []
let resolve
let promise
defer()
return [read(), write, end]
function defer() {
promise = new Promise(r => resolve = r)
}
async function* read() {
await promise
yield* events.splice(0)
if (!done) yield* read()
}
function write(event) {
events.push(event)
resolve()
defer()
}
function end() {
done = true
resolve()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment