Created
November 8, 2014 16:36
-
-
Save boutell/59716a582da7c7f4884b to your computer and use it in GitHub Desktop.
Network generators in javascript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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