Upgrade to Pro — share decks privately, control downloads, hide ads and more …

pickpatch を作った話と仕組みの解説

KoharaKazuya
June 14, 2019
45

pickpatch を作った話と仕組みの解説

ランチタイム勉強会 2019-06-14

KoharaKazuya

June 14, 2019
Tweet

Transcript

  1. 今日話すこと set("a.b", 10) のようなダサい API をやめるライブラリを書 いた ‑ Qiita pickpatch

    の技術解説 (個人的に会心のアイデアだったので事あるごとに自慢してる 話) 2 2
  2. Underscore.js, Lodash const replaced = _.set(app, "authors[0].name", " 小原 一哉");

    文字列でアクセス。 静的解析と相性が悪い。TypeScript の台頭で露見してきた。 7 7
  3. Immer const replaced = produce(app, draft => { draft.authors[0].name =

    " 小原 一哉"; }); マジカルになんとかしちゃう。 書く側は代入と一緒だが、裏では一部を置き換えつつ 新しいオブジェクトを作っている。 8 8
  4. pickpatch を作った const obj = { a: { b: 1

    }, c: 2, d: 3 }; const newObj = pickpatch( _ => [_.a.b, _.c], // picker defines partial to update )( ([b, c]) => [b * 10, c + 5], // patcher defines new values )( obj, // old object ); // -> { a: { b: 10 }, c: 7, d: 3 } 13 13
  5. picker 実際は picker の引数には Proxy が仕掛けられた ダミーのオブジェクトを渡している const picker =

    app => app.authors[0].name; picker の戻り値にはプロパティアクセスの キーが記録されている 16 16
  6. patcher 更新のロジックを定義する関数 const patcher = old => " 小原 一哉";

    ユーザーは 「picker で選択した値が引数として与えられて、 その部分の新しい値を返す関数」 を定義する 17 17
  7. patcher picker のプロパティアクセスのキーの情報を元に、 更新対象から値を抽出し、引数に与える。 const patcher = old => "

    小原 一哉"; 返り値を更新の際に用いる。 更新対象の一部を置き換えた新しいオブジェクトを生成する。 18 18