以下の挙動をする pipe
関数を作成する
const square = v => v * v const double = v => v * 2 const addOne = v => v + 1 const res = pipe(square, double, addOne) res(3) // 19; addOne(double(square(3)))
- 与えられた全ての関数をスプレッド演算子
...
を使って収集する。 - pipe処理の初期値としてxを受け取るようにする。
Array.prototype.reduce()
を使って一連の関数を実行する。そのとき、reduceで逐次得た結果を次の関数の引数として渡すようにする。
const pipe = (...fns) => x => fns.reduce((v, fn) => fn(v), x)
上記をわかりやすく冗長に書くと以下のようになる。
const pipe = (...fns) => { return (x) => { return fns.reduce((v, fn) => fn(v), x) } }