Chapter 5: using — 外部リソースとのライフサイクル同期
timelineフレームワークの根底には、物理学の「ブロック宇宙」モデルに基づいた、時間と共に変化する値を宣言的に扱うという思想があります。この考え方から自然と導き出されるのは、開発者がリソースの生成や破棄のタイミングを一切気にすることなく、本質的なロジックの記述に集中できる全自動リソース管理の実現です。
我々はこの理想を、リアクティブな内部状態だけでなく、Gnome Shell拡張のGTKウィジェットのような、あらゆる外部リソースのライフサイクルにまで適用する道筋を発見しました。これから解説する.using()は、その理想を完全に具現化する、このフレームワークの最終的な完成形です。
.using() API — 究極のリソース管理
Section titled “.using() API — 究極のリソース管理”.bind()がTimelineオブジェクトのライフサイクルを管理するのに対し、.using()は、「リソースの生存期間」を「Timelineのイリュージョン」と完全に同期させるための、唯一の正しいアプローチです。
F#: using: ('a -> Resource<'b>) -> Timeline<'a> -> Timeline<'b option>
Section titled “F#: using: ('a -> Resource<'b>) -> Timeline<'a> -> Timeline<'b option>”TS: using<B>(resourceFactory: (value: A) => { resource: B; cleanup: () => void } | null): Timeline<B | null>
Section titled “TS: using<B>(resourceFactory: (value: A) => { resource: B; cleanup: () => void } | null): Timeline<B | null>”sourceTimelineの値が変化すると、usingはまず、以前のイリュージョンで生成されたリソースに紐づくcleanup関数を、disposeIllusionを通じて確実に実行します。- 次に、新しい値で
resourceFactory関数を呼び出します。 resourceFactoryが{ resource, cleanup }オブジェクトを返した場合:resourceが、出力Timelineの新しい値となります。cleanup関数が、新しいイリュージョンに紐づくonDisposeコールバックとしてDependencyCoreに登録されます。
resourceFactoryがnullを返した場合、出力Timelineはnullとなり、クリーンアップ処理も登録されません。
- 保証: このメカニズムにより、
resourceFactoryによって一度でも生成されたリソースは、そのイリュージョンが(どのような理由であれ)終了する際に、対応するcleanup関数が必ず呼び出されることが保証されます。これにより、リソースリークは構造的に発生し得ません。
Illusion概念の拡張 — レベル3の可変性
Section titled “Illusion概念の拡張 — レベル3の可変性”.using()の導入によって、Illusionの概念はさらに一段階拡張されます。
- レベル1 (
map):_lastという値が可変。 - レベル2 (
bind):innerTimelineという内部構造が可変。 - レベル3 (
using):DOMやタイマーといった外部世界の存在そのものが、Illusionのライフサイクルと同期する可変な存在となる。
進化した心臓部: DependencyCoreとonDispose
Section titled “進化した心臓部: DependencyCoreとonDispose”DependencyCoreは、もはや単なる「リアクティブな接続」の管理システムではありません。それは、「依存関係の生存期間(ライフサイクル)に紐づく、あらゆる種類のクリーンアップ処理」を保証する、汎用的な基盤へと進化しました。
.using()は、resourceFactoryが返すcleanup関数を、このDependencyCoreのonDisposeコールバック機能を通じて登録します。そして、Illusionが破棄される際に、DependencyCoreがこのonDispose(つまりcleanup)の実行を100%保証することで、外部リソースのクリーンアップが完全に自動化されるのです。
結論:パラダイムの統合
Section titled “結論:パラダイムの統合”このTimelineは、もはや単なるFRPライブラリではありません。それは、宣言的なデータフローと、命令的なリソース管理という、しばしば対立するパラダイムを、 「ライフサイクル」 という単一の統一された概念の下に完全に統合した、新しい次元のフレームワークです。
デバッグ効率とプロダクション環境でのパフォーマンスを両立させる設計により、このフレームワークは研究開発段階から実用段階まで、一貫して開発者を支援します。これは、理論的な美しさと実用的な価値を兼ね備えた、真に完成されたソフトウェアアーキテクチャの実現です。
Canvas デモ
Section titled “Canvas デモ”
https://gemini.google.com/share/d4b42486dfdf
Section titled “https://gemini.google.com/share/d4b42486dfdf”