File size: 949 Bytes
bc20498 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
/**
* @returns {import('types').Deferred & { promise: Promise<any> }}}
*/
function defer() {
let fulfil;
let reject;
const promise = new Promise((f, r) => {
fulfil = f;
reject = r;
});
// @ts-expect-error
return { promise, fulfil, reject };
}
/**
* Create an async iterator and a function to push values into it
* @returns {{
* iterator: AsyncIterable<any>;
* push: (value: any) => void;
* done: () => void;
* }}
*/
export function create_async_iterator() {
const deferred = [defer()];
return {
iterator: {
[Symbol.asyncIterator]() {
return {
next: async () => {
const next = await deferred[0].promise;
if (!next.done) deferred.shift();
return next;
}
};
}
},
push: (value) => {
deferred[deferred.length - 1].fulfil({
value,
done: false
});
deferred.push(defer());
},
done: () => {
deferred[deferred.length - 1].fulfil({ done: true });
}
};
}
|