仕組みについては Haskell の記事を読んでいただきたく。
.js
// 代数的データ型を関数に、
// パターンマッチを関数適用に見立てる宣言
const caseOf = match => adt => adt(match);
// Haskell の Maybe を意識した何か
const Nothing = () => ({Nothing}) => Nothing();
const Just = x => ({Just}) => Just(x);
const guard = flg => flg ? Just() : Nothing();
const fmap = f => caseOf({
Nothing,
Just: x => Just(f(x))
});
const fromMaybe = v => caseOf({
Nothing: () => v,
Just: x => x
});
// 定数関数
const con$t = x => _ => x;
// ifの代替関数の作成用
const if_ = guard;
const then_ = x => fmap(con$t(x));
const else_ = fromMaybe;
const compose = fs => fs.reduce((g, f) => x => f(g(x)), x => x);
// 使用例
const dayText = compose([
if_,
then_(() => "お休み"),
else_(() => "平日"),
lazy => lazy()
]);
console.log(dayText(true));
//=> お休み
console.log(dayText(false));
//=> 平日