JavaScript でメソッドチェーンらしきことをやってみる

以下のコードのように、メソッドが連続して書かれていると何をしているか理解するのが捗ります。

person.sort('age').reverser(); // 結果は年齢の降順だろうなということは想像がつく

このような書き方はオブジェクト指向でよく出てくるものですが、JavaScriptで同じようなことをしてみました。

// 1 値を包むコンテナを作成
function Container(value){
	this.value = value;
}
Container.prototype.fmap = function(fn){
	return new Container(fn(this.value));
};
Container.prototype.getValue = function(){
	return this.value;
};

// 2 適用する関数を定義
const plus = a => b => a + b;
const plus2 = plus(2);
const plus5 = plus(5);

// 3 チェーンのように実行する
const container = new Container(2);
container.fmap(plus2).fmap(plus5).getValue(); // 9
  1. 値を包み込むコンテナを作成します。fmap に関数を渡すと、包んだ値に対してその関数を適用して、新しいコンテナを返します。
  2. コンテナに適用する関数を定義しています。引数を一つの関数にするためにカリー化しています。
  3. 実際に使っています。

fmap が返すのは新しいコンテナなので、上記ように fmap をつなげて書くことができます。