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 ~~ "