Immutable.jsでJSでも不変データ構造を扱う


ClojureやHaskellのような不変データ構造体のJS実装です。facebook製。

不変データ構造の特徴として、元のデータ構造は不変です。

Immutable = require 'immutable'
map1 = Immutable.Map a: 1, b: 2 # => Map {a: 1, b: 2}
map2 = map1.set a: 3 #=> Map {a: 3, b: 2}
map3 = map1.update (val) -> {foo: val.a} #=> Map {foo: 1}

Mapの他に、List, OrderedMap, Set, OrederedSet, Seq, Range, Record, Stack等があります。内部的にはトライ木になっています。

面白いのはSeqやRangeで、filter関数やmap関数を与えても、getで呼ばれるまで遅延評価されています

Immutable.Seq.of(1,2,3,4,5,6,7,8).filter((i)->i % 2).map((a)->a*a).get 3 #=> 49

(ターミナルで評価したときには実体が見えるかもしれませんが、valueOfが実装されてるからですね)

Immutable.Range(1, Infinity)という無限リスト表現も可能です。そのまま評価すると死にます。

TypeScriptの型定義もあります。

詳しくはドキュメントにて http://facebook.github.io/immutable-js/

他の実装

moriはclojurescriptの中で使われてるclojureのimmutableデータ構造をJSで実装したものです。普通にJSから使っても便利…らしいです。

swannodette/mori · GitHub

なぜこれを紹介したからというと、ロゴが最高に良い。

どんどんImmutableにしましょう。facebookは関数型脳のJSエンジニア多いっぽくて、僕と相性がいいです。