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ライブラリではありません。それは、宣言的なデータフローと、命令的なリソース管理という、しばしば対立するパラダイムを、 「ライフサイクル」 という単一の統一された概念の下に完全に統合した、新しい次元のフレームワークです。
デバッグ効率とプロダクション環境でのパフォーマンスを両立させる設計により、このフレームワークは研究開発段階から実用段階まで、一貫して開発者を支援します。これは、理論的な美しさと実用的な価値を兼ね備えた、真に完成されたソフトウェアアーキテクチャの実現です。