JavaScriptでパイプ関数を作成する [30seconds of interviews]

以下の挙動をする 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)
  }
}

30secondsofinterviews.org