ababup1192
2/18/2017 - 1:04 PM

map.js

const compose = (f, g) => (arg) => f(g(arg));

const empty = (_) => null;

const get = (key) => (obj) => obj(key);

const set = (key, value) =>
    (obj) =>
      (queryKey) =>
        key === queryKey ? value : get(queryKey)(obj);

console.log(set("a", 1)(empty)("a"));
// set("a", 1)(empty)
// (queryKey) =>
//     "a" == queryKey ? 1 : get(queryKey, empty)
// "a" を 関数に渡せば "a" == "a" となり 1が評価される。
// => 1


console.log(set("a", 1)(empty)("b"));
// 存在しないkeyの場合は、三項演算子がfalseになり
// get("b")(empty) => empty("b")
// empty関数に何を入れても、nullを返す。
// => null

const map = compose(
        set("C3PO", "Star Wars"),
        set("HAL9000", "2001: a space odessay")
   )(empty);

console.log(map("HAL9000"));
// composeしたときは、set関数がクロージャによりネストする
// (queryKey) =>
//   "C3PO" === queryKey ? "StartWars" : get(queryKey)(
//      (queryKey) =>
//        "HAL9000" === queryKey ? "2001: a space odessay" : get(queryKey)(empty)
//   );
// => "2001 ~~ "