Skip to content

Instantly share code, notes, and snippets.

@franciscotln
Last active December 3, 2018 12:54
Show Gist options
  • Save franciscotln/ab54d8d204084e8158ebb6514a92eae4 to your computer and use it in GitHub Desktop.
Save franciscotln/ab54d8d204084e8158ebb6514a92eae4 to your computer and use it in GitHub Desktop.
Setter-setter and setter
const LIMIT = 10000;
let sinkRef, sending, completed, sourceDisposed;
const source = (type, data) => {
if (sourceDisposed || completed) {
return;
}
if (type === 0) {
sinkRef = data;
return;
}
if (typeof sinkRef !== 'function') {
// make sure the source is greeted before sending 1/2 signals
return;
}
if (type === 1) {
// Avoid stackoverflow errors
while (sending = !sending) {
if (data < LIMIT) {
sinkRef(1, data++); // setter
} else {
completed = true;
sinkRef(2); // setter
}
}
return;
}
if (type === 2) {
sourceDisposed = true;
}
};
let sourceRef, sinkDisposed;
const sink = (type, data) => {
if (sinkDisposed) {
return;
}
if (type === 0) {
sourceRef = data;
return;
}
if (typeof sourceRef !== 'function') {
// make sure the sink is greeted before sending 1/2 signals
return;
}
if (type === 1) {
console.log(`Next(${data})`);
sourceRef(1, data); // setter
return;
}
if (type === 2) {
data == null ? console.log('Done()') : console.log(`Error(${data})`);
sinkDisposed = true;
}
};
// Handshake
source(0, sink); // Source: setter-setter, Sink: callback (listener)
sink(0, source); // Sink: setter-setter, Source: callback (listener)
// Start conversation
source(1, 0); // Source: setter
/*
Logs:
Next(0)
Next(1)
...
Next(9999)
Done()
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment