On Github 25th-floor / immutablejs-and-react
S. Oestreicher @thinkfunctional A. Sharif @sharifsbeat
var foo = 'Some String'; var bar = foo.substr(1, 3);
JavaScript Strings are immutable.
function top(n, xs) {
xs.sort().reverse();
return xs.slice(0, n);
}
// somewhere else
let xs = [4, 1, 3, 2, 5];
let top3 = top(3, xs);
// oops, xs has been changed!
// Do I need to make a copy? Should "top" make a copy?
let now = moment();
let startOfWeek = now.startOf('week');
let endOfWeek = now.endOf('week');
now.format('YYYY-MM-DD'); // => 2015-11-07
startOfWeek.format('YYYY-MM-DD'); // => 2015-11-07
endOfWeek.format('YYYY-MM-DD'); // => 2015-11-07
// we have to remember to make a copy every time!
let now = moment();
let startOfWeek = now.clone().startOf('week');
let endOfWeek = now.clone().endOf('week');
"Purely functional tree, after" by VineetKumar at English Wikipedia
Immutable.fromJS([{a:1}, {b:2}])
get()
let map = Immutable.fromJS({foo: {bar: 1}});
map.get('foo').get('bar'); //instead of map.foo.bar
Immutable.is()
Immutable.is(this.props.cols, nextProps.cols);
rows.updateIn([row, 'cols', col, 'active'], active => !active);setIn()
rows.setIn([row, 'cols', col, 'active'], false);mergeDeep()
var x = Immutable.fromJS({a: { x: 10, y: 10 }, b: { x: 20, y: 50 } });
var y = Immutable.fromJS({a: { x: 2 }, b: { y: 5 }, c: { z: 3 } });
x.mergeDeep(y) // {a: { x: 2, y: 10 }, b: { x: 20, y: 5 }, c: { z: 3 } }
The secret sauce of why ClojureScript React wrappers are faster than vanilla React.
Useful, but you should prefer your own implementation to leverage Immutable.is
var a = Immutable.List([1,2]); var b = Immutable.List([1,2]); a === b; // => false Immutable.is(a, b); // => true
var map = Immutable.Map();
map = map.set(Immutable.Map({foo:'bar'}), 'foobar');
map.get(Immutable.Map({foo:'bar'}));
// => 'foobar'
map.toJSON();
// => {"[object Object]": "foobar"}
// sad :-(
function handle(what) {
return transit.makeWriteHandler({
tag: v => what,
rep: v => v,
stringRep: v => null
});
}
var writer = transit.writer("json-verbose", {
handlers: transit.map([
Immutable.List, handle('array'),
Immutable.Map, handle('map')
])
});
var reader = transit.reader("json", {
arrayBuilder: {
init: function(node) { return Immutable.List().asMutable(); },
add: function(ret, val, node) { return ret.push(val); },
finalize: function(ret, node) { return ret.asImmutable(); },
fromArray: function(arr, node) {
return Immutable.List.from(arr);
}
},
mapBuilder: {
init: function(node) { return Immutable.Map().asMutable(); },
add: function(ret, key, val, node) { return ret.set(key, val); },
finalize: function(ret, node) { return ret.asImmutable(); }
}
});
Demo Time!