コンテンツにスキップ

Chapter 1: map — 静的な依存グラフ

Timelineで最も基本的で頻繁に使われる変換操作が.map()です。これは、あるTimelineの値を、特定のルール(関数)に従って別の値に変換し、新しいTimelineを生成します。

その本質は、2つのTimelineの間に、不変で「静的な」関係性を定義することです。

F#: map: ('a -> 'b) -> Timeline<'a> -> Timeline<'b>
Section titled “F#: map: ('a -> 'b) -> Timeline<'a> -> Timeline<'b>”
TS: .map<B>(f: (value: A) => B): Timeline<B>
Section titled “TS: .map<B>(f: (value: A) => B): Timeline<B>”

mapは、型Aの値を受け取って型Bの値を返す純粋な関数fを引数に取ります。

TypeScript

const numbers = Timeline(5);
// (x: number) => string という関数を渡す
const labels = numbers.map(x => `Score: ${x}`);
console.log(labels.at(Now)); // "Score: 5"
// ソースを更新すると、labelsも自動的に更新される
numbers.define(Now, 100);
console.log(labels.at(Now)); // "Score: 100"

mapを呼び出すと、内部では2つのTimelineの間に依存関係 (Dependency) が登録されます。この関係性のネットワーク全体を依存グラフと呼びます。

mapが作る依存関係は静的 (Static) です。一度labels = numbers.map(...)という関係を定義したら、numberslabelsの間の「値を変換する」というルールそのものが後から変わることはありません。

image

image

このシンプルな「静的な依存関係」の概念が、後に出てくるbindusingが構築する「動的な」依存関係を理解するための基礎となります。

image