@virtualstate/examples
Version:
82 lines • 2.41 kB
JavaScript
import { deferred } from "./deferred.js";
/**
* Returns an async iterable that moves forward in value
* Whenever an iterator is added, it will start at the most recent value
* that was yielded, and continue from there
*/
export function queue(enabled) {
let done = false;
let current = deferred();
let value;
let error;
const q = {
value(nextValue) {
if (enabled !== false) {
value = nextValue;
const previous = current;
current = deferred();
previous.resolve({
next: current.promise,
value: nextValue,
done: false
});
}
return nextValue;
},
end() {
done = true;
if (enabled !== false) {
current.resolve({
value: undefined,
done: true,
next: current.promise
});
}
},
reject(nextError) {
if (done)
return;
done = true;
if (enabled !== false) {
error = nextError;
current.reject(nextError);
}
},
[Symbol.asyncIterator]() {
let initialValue = value;
let result = {
next: current.promise
};
return {
async next() {
if (typeof initialValue !== "undefined") {
const result = { value: initialValue, done: false };
initialValue = undefined;
return result;
}
result = await result.next;
return {
value: result.value,
done: result.done
};
}
};
},
async then(resolve, reject) {
if (error) {
return reject(error);
}
if (done) {
return resolve(value);
}
return wait().then(resolve, reject);
async function wait() {
let value;
for await (value of q) { }
return value;
}
}
};
return q;
}
//# sourceMappingURL=queue.js.map