Public
Edited
Sep 18, 2022
Importers
13 stars
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
genFunction = n =>
Generators.observe(change => {
let i = 0;
const timer = setInterval(_ => change(++i), n*1000);
return () => clearInterval(timer);
})
Insert cell
Insert cell
genFunction(1)
Insert cell
Insert cell
genFunction(1)[Symbol.iterator]
Insert cell
Insert cell
genFunction(1).next
Insert cell
Insert cell
Insert cell
Insert cell
syncObserve = initialize => {
let diff = 0;
let cache;

// producer pushes a new value
const change = value => {
if (diff >= 0) {
diff = 1;
cache = value; // if producer already ahead: possible value loss
} else {
diff = 0;
cache(value); // return to sync
}
};

// consumer requests a value
const next = () => {
if (diff <= 0) {
diff = -1;
return {
value: new Promise(resolve => {
cache = resolve;
}), // if consumer already ahead: possible forever pending promise
done: false
};
} else {
diff = 0;
return {
value: Promise.resolve(cache),
done: false
}; // return to sync
}
};

const dispose = initialize(change);

const generator = {
throw: () => ({ done: true }),
return: () => (dispose && dispose(), { done: true }),
next,
[Symbol.iterator]: () => generator
};

return generator;
}
Insert cell
syncObserve(change => {
let i = 0;
const timer = setInterval(_ => change(++i), 1000);
return () => clearInterval(timer);
})
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
asyncObserve = initialize => {
let diff = 0;
let cache;

const change = value => {
if (diff >= 0) {
diff = 1;
cache = value; // possible value loss
} else {
diff = 0;
cache({ value, done: false }); // cache is a promise resolver
}
};

const next = () => {
if (diff <= 0) {
diff = -1;
return new Promise(resolve => {
cache = resolve;
});
} else {
diff = 0;
return Promise.resolve({ value: cache, done: false }); // cache is a value
}
};

const dispose = initialize(change);

const generator = {
throw: () => ({ done: true }),
return: () => (dispose && dispose(), { done: true }),
next,
[Symbol.asyncIterator]: () => generator
};

return generator;
}
Insert cell
asyncGenFunction = n =>
asyncObserve(change => {
let i = 0;
const timer = setInterval(_ => change(++i), n * 1000);
return () => clearInterval(timer);
})
Insert cell
Insert cell
asyncGenFunction(1)[Symbol.iterator]
Insert cell
Insert cell
asyncGenFunction(1)
.next()
.toString()
Insert cell
Insert cell
{
for await (const value of genFunction(1)) {
yield value;
}
}
Insert cell
Insert cell
Insert cell
syncToAsync = async function*(iterator) {
for (const value of iterator) {
await Promises.delay(0);
yield value;
}
}
Insert cell
asyncToSync = function*(asyncIterator) {
while (true) {
yield new Promise(resolve => {
asyncIterator.next().then(result => resolve(result.value));
});
}
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more