asyncObserve = initialize => {
let diff = 0;
let cache;
const change = value => {
if (diff >= 0) {
diff = 1;
cache = value;
} else {
diff = 0;
cache({ value, done: false });
}
};
const next = () => {
if (diff <= 0) {
diff = -1;
return new Promise(resolve => {
cache = resolve;
});
} else {
diff = 0;
return Promise.resolve({ value: cache, done: false });
}
};
const dispose = initialize(change);
const generator = {
throw: () => ({ done: true }),
return: () => (dispose && dispose(), { done: true }),
next,
[Symbol.asyncIterator]: () => generator
};
return generator;
}