Slide 12
Slide 12 text
実行モデル Eager vs Lazy
実行のタイミング — 即時実行 (eager) vs 遅延実行 (lazy)
今までは eager での実行例. lazy パターンで、副作用を持つ処理を「値」として組み立てると、全体を把握できる
// Eager: 呼んだ瞬間に副作用が走る
const validated = service.validate();
const saved = await validated.save(); // ← この場で DB 書込
await saved.notify(); // ← この場で通知送信
// Lazy: pipeline を 型に積み上げる
const program = Program.start>()
.add({ type: "validate", fn: (u) => u.validate()! })
.add({ type: "save", fn: (u) => u.save() })
.add({ type: "notify", fn: (u) => u.notify() });
// ↑ hover で 全 step の I/O 型 (pipeline 全体) が見える
// Program<[ // US = UserService
// ["validate", US<"draft">, US<"validated">],
// ["save", US<"validated">, US<"saved">],
// ["notify", US<"saved">, US<"notified">],
// ]>
await program.run(initial); // ← ここで初めて実行
Lazy + 型積み上げ
pipeline 全体が型に出る
hover で各 step の I/O 観測
実行前に検査できる
構造から validation / dry-run
ドメインと分離可
pipeline 構築自体は汎用的な処理
再利用・合成
pipeline を値として渡せる
Type-State は遅延実行も可(構築時に型エラー). 本格運用なら ライブラリに任せる のが現実的