
Functional data structures in JavaScript with Mori - swannodette
http://sitr.us/2013/11/04/functional-data-structures.html
======
swannodette
One nifty thing not covered here is that Mori also has an extremely efficient
O(1) thaw to get a mutable copy of an immutable value and a O(1) freeze to get
a persistent value from a mutable data structure (transient).

The performance of a transient vector is shockingly close to using a
JavaScript array under Google V8 for adding new elements:

[http://github.com/swannodette/mori#efficient-
freezethaw](http://github.com/swannodette/mori#efficient-freezethaw)

------
rdtsc
Of course it is obligatory to mention the classic: Okasaki's "Purely
Functional Datastructures" book.

[http://www.amazon.com/Purely-Functional-Structures-Chris-
Oka...](http://www.amazon.com/Purely-Functional-Structures-Chris-
Okasaki/dp/0521663504)

Also check out this link for additional data structures worked on since then
or simply not included in the book:

[http://cstheory.stackexchange.com/questions/1539/whats-
new-i...](http://cstheory.stackexchange.com/questions/1539/whats-new-in-
purely-functional-data-structures-since-okasaki)

~~~
swannodette
A minor nit, most of the data structures provided through Mori via
ClojureScript are not based heavily on Okasaki's work, rather they are based
on Bagwell's paper on mutable Ideal Hash Trees
[http://lampwww.epfl.ch/papers/idealhashtrees.pdf](http://lampwww.epfl.ch/papers/idealhashtrees.pdf)
and Rich Hickey's efficient immutable implementations in Java for Clojure

------
tieTYT
This is great. I never understood why underscore/lo-dash doesn't have a `conj`
or a `concat`.

JavaScript's `push` mutates data which you'd think you'd want to avoid if
you're using a functional library like underscore/lo-dash.

`concat` makes sense to leave out when you consider that arrays already have a
`concat` function. But if that's the reasoning, why did underscore/lo-dash
include `size` and `max` and all those other things that already exist?

~~~
jkrems
One thing I never understood about - awful generalization - "real" functional
languages is their fascination with terrible naming. What I mean is things
like `car`, `cdr`, `conj` - words that are impossible to understand if you
don't already know what they mean.

~~~
lmm
That's only lisp and particularly faithful derivatives (unfortunately
including clojure). Haskell uses more natural names - head, tail, last.

~~~
mjn
Even most Lisps have first/rest as synonyms of car/cdr (dating back to some
very old Lisps, and mandated by the Common Lisp standard). They just don't
seem to have culturally caught on as idiomatic.

------
augustl
I like that the article calls then "functional data structures". Every time I
call them by their real name (persistent data structures), _at least_ one
person will get confused and think I'm talking about serialization to disk.

~~~
pmahoney
Is is possible to construct a persistent data structure that is not
referentially transparent? I suspect the answer is yes, depending on how you
define side effects (example: a persistent array that logs operations).

Which would mean "functional" is a more general adjective than "persistent"
since it includes both persistence and referential transparency.

Wikipedia[1] claims "There also exist persistent data structures which use
destructible operations, making them impossible to implement efficiently in
purely functional languages"

[1]
[https://en.wikipedia.org/wiki/Persistent_data_structure](https://en.wikipedia.org/wiki/Persistent_data_structure)

~~~
augustl
"Persistent" is but a bullet point on Clojure's own explanation of its data
strucures, so I suppose we as a community should follow in the official docs'
footsteps :)

[http://clojure.org/data_structures](http://clojure.org/data_structures)

------
agumonkey
IIUC they pulled out clojure's clojurescript projected core structures so you
can use it ~pojo ?

Recenlty I saw
[https://github.com/harukizaemon/hamster](https://github.com/harukizaemon/hamster)
, similarly immutable, structure sharing, persistent data structures

It's becoming mainstream ...

------
ds_
Is there a current build anywhere or do I have to build it myself?

~~~
theothershoe
Install the npm package, mori. You can require it in a NodeJS project, or grab
the file mori.js from the installed package and drop it in a web browser.

