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から使っても便利…らしいです。
なぜこれを紹介したからというと、ロゴが最高に良い。
どんどんImmutableにしましょう。facebookは関数型脳のJSエンジニア多いっぽくて、僕と相性がいいです。