関数の数珠つなぎ 逐一版

そういえば、一週間くらい前、変な夢をみたんですよね。関数がいつまでたっても関数を返してくれるばかりで実質的な処理をしてくれなくて苦しむという。


たんに関数を返す条件と実質的に実行する条件を決めてやればいいだけなのですが、夢の中ではそれに気づかず関数を呼び出しては新たな関数を手に入れるということを延々と繰り返していました、対話環境で。


昨日の数珠つなぎの例(http://d.hatena.ne.jp/taedium/20120310/p2)を少し変更すると、こんな感じにすればよかったと今にして思います。

function chain(first) {
  return function (second) {
    if (typeof second === 'function') {
      return chain(function () {
        return second(first.apply(null, arguments));
      });
    } else {
      return first(second);
    }
  };
}

function a(arg){
  console.log('a is called. arg: ' + arg);
  return arg + 1;
}

function b(arg) {
  console.log('b is called. arg: ' + arg);
  return arg + 1;
}

function c(arg) {
  console.log('c is called. arg: ' + arg);
  return arg + 1;
}

var result = chain(a)(b)(c)(chain(a)(b)(c))(10);
console.log('result: ' + result);


関数を渡したら逐一数珠つなぎにして、関数以外を渡したら数珠つなぎしたものを一気に実行します。
実行結果はこうなります。

a is called. arg: 10
b is called. arg: 11
c is called. arg: 12
a is called. arg: 13
b is called. arg: 14
c is called. arg: 15
result: 16


関数が特定の条件を満たすまでは何らかの関数を返し続けるというのは、アイデア次第でもっと面白い使い方ができるんじゃないかなーと思いつつもアイデアは思い浮かばず。