node.jsで使える非同期コントロールフローライブラリ nue その2

asyncblock(https://github.com/scriby/asyncblock)というnode-fiberを使ったライブラリがあります。こちらのREADMEの後半に、pure node版、async版、asyncblock版の比較コードが載っていますが、同等の処理を行うnue版も作ってみました。
次のものです。

var nue = require('nue');
var flow = nue.flow;
var parallel = nue.parallel;
var fs = require('fs');

flow(
  parallel(
    function () {
      fs.readFile('path1', 'utf-8', this.async());
    }, 
    function () {
      fs.readFile('path2', 'utf-8', this.async());    
    }
  ),
  function (results) {
    fs.writeFile('path3', results[0] + results[1], this.async());
  },
  function () {
    fs.readFile('path3', 'utf-8', this.async());
  },
  function (data) {
    if (this.err) throw this.err;
    console.log(data);
    console.log('all done');
    this.next();
  }
)();


やっていることとしては、path1とpath2からファイルを同時に読み、両方が読み終わったら連結してpath3に書き込んでいます。書き込みが終わったら読み込んでコンソールに出力しています。


pure node版、async版よりは明らかに簡潔に書けていると思います。でも、asyncblock版と比較するとどうだろう?
asyncblock版のコードをasyncblockのREADMEよりコピペ。

var asyncblock = require('asyncblock');

asyncblock(function(flow){
    var first = fs.readFile('path1', 'utf8').defer();
    var second = fs.readFile('path2', 'utf8').defer();

    fs.writeFile('path3', first + second).sync();

    var third = fs.readFile('path3', 'utf8').defer();

    console.log(third);
    console.log('all done');
});


うーん、正直なところ負けているような。。fiberというものを使うと、こんな風にかけるんですね。特に、Using asyncblock + source transformationのすっきりさ加減には驚きました。関数の記述を多用せずに書けるとは。どういう仕組みなのかサンプルコード上からはさっぱりわかっていませんが。今後はfiberが主流になるのかも?(すでになっているのか?)。