Skip to content

Instantly share code, notes, and snippets.

@creationix
Created May 8, 2013 22:02
Show Gist options
  • Save creationix/5544019 to your computer and use it in GitHub Desktop.
Save creationix/5544019 to your computer and use it in GitHub Desktop.

Revisions

  1. creationix created this gist May 8, 2013.
    6 changes: 6 additions & 0 deletions output.log
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,6 @@
    tim@touchsmart:~/Code$ nvm use v0.11.2-generators
    Now using node v0.11.2-generators
    tim@touchsmart:~/Code$ node --harmony testgen.js
    <Buffer 76 61 72 20 66 73 20 3d 20 72 65 71 75 69 72 65 28 27 66 73 27 29 3b 0a 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 46 69 6c 65 28 70 61 74 68 2c 20 65 6e 63 ...>
    Sleeping for 2000ms...
    Done
    50 changes: 50 additions & 0 deletions testgen.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,50 @@
    var fs = require('fs');
    function readFile(path, encoding) {
    return function (callback) {
    fs.readFile(path, encoding, callback);
    };
    }

    function sleep(ms) {
    return function (callback) {
    setTimeout(callback, ms);
    };
    }

    function run(makeGenerator) {
    return function () {
    var generator = makeGenerator.apply(this, arguments);
    var continuable, sync, value;

    next();
    function next() {
    while (!(continuable = generator.send(value)).done) {
    continuable = continuable.value;
    sync = undefined;
    continuable(callback);
    if (sync === undefined) {
    sync = false;
    break;
    }
    }
    }
    function callback(err, val) {
    if (err) return generator.throw(err);
    value = val;
    if (sync === undefined) {
    sync = true;
    }
    else {
    next();
    }
    }
    }
    }


    run(function* () {
    console.log(yield readFile(__filename));
    console.log("Sleeping for 2000ms...");
    yield sleep(2000);
    console.log("Done");
    })();