Skip to content

Instantly share code, notes, and snippets.

@boutell
Created November 8, 2014 16:36
Show Gist options
  • Save boutell/59716a582da7c7f4884b to your computer and use it in GitHub Desktop.
Save boutell/59716a582da7c7f4884b to your computer and use it in GitHub Desktop.
Network generators in javascript
/* jshint node:true */
var generators = {};
function range(first, last) {
var c = {
first: first,
last: last,
now: first,
step: function(c) {
var result = c.now;
c.now++;
if (c.now >= c.last) {
c.now = c.last;
}
return result;
}
};
c.source = c.step.toString();
var fn = function() {
return c.step(c);
};
fn.generator = c;
label(fn);
return fn;
}
// Per Kyle
function label(object) {
setImmediate(function() {
for (var key in global) {
if (global[key] === object) {
generators[key] = object;
}
}
});
}
// If I use "var" here, "label" won't work. Apparently
// it's different in the console per Kyle
gen = range(1, 10);
// Yield so label can work
setImmediate(function() {
console.log('party A calls the generator 5 times');
while (true) {
var result = gen();
console.log(result);
if (result === 5) {
break;
}
}
// Send it "over the network"
var generatorsB = JSON.parse(JSON.stringify(generators, function(key, value) {
if ((typeof(value) === 'function') && (value.generator)) {
return { generator: value.generator };
}
return value;
}));
console.log('party B calls the generator 5 times');
// On a second actual browser I would merge these
// back into "window".
var gen2 = function() {
var gen = generatorsB.gen.generator;
if (!gen.step) {
// Have to wrap the function in parens for eval to
// like it for some reason
gen.step = eval('(' + gen.source + ')');
}
return gen.step(gen);
};
while (true) {
var result2 = gen2();
console.log(result2);
if (result2 === 10) {
break;
}
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment