persistent

Persistent data-structures from the comfort of JavaScript - a lá clojure.

Warning: API Unstable (even more so than most < 1.0.0 releases)

Persistent

Persistent data-structures from the comfort of JavaScript - a lá clojure. Based on Bagwell (2001), and Clojure's persistent implementation of a Hash Array Mapped Trie.

Mutability causes headaches; immutability soothes them. JavaScript's Object and Array are crying out for immutable counterparts to complement first-class functions.

var p = require('persistent'),
    person = p.dict({ firstName: 'hugh', secondName: 'jackson' })
 
var personWithAge = person.set({ age: 24 })
 
person.has('age')          //= false 
personWithAge.has('age')   //= true 
personWithAge.get('age')   //= 24 

npm install persistent

Creates an empty dict, or sets the attributes if an object is passed.

var o = p.dict()
 
// or 
var you = p.dict({ wise: true, willUseThisLib: true })

Returns a new dict with the additional attribute(s).

var o = p.dict()
 
var changed = o.set('x', 3).set({ y: 4, z: 5 })
 
changed.has('x') //= true 
changed.get('y') //= 4 

Gets an attribute.

var o = p.dict({ x: 3, y: 4 })
 
o.get('x') //= 3 

Returns true or false; same as key in object for regular objects:

var o = p.dict({ x: 3, y: 4 })
 
o.has('x') //= true 
o.has('z') //= false 

Returns a new dict with the key removed.

var o = p.dict({
    foo: 'bar',
    baz: 'quux'
})
 
var updated = o.remove('foo').remove('baz')
updated.has('foo') //= false 
o.has('foo')       //= true 

Returns a seperate, mutable object with the same attrs.

var o = p.dict({
    foo: 'bar',
    baz: 'quux'
})
 
var trans = o.transient()
delete trans.foo
 
o.has('foo') //= true 

Shares the same API as persistent.dict, except:

Returns a seperate, mutable array with the same attrs.

var arr1 = p.list([1, 2, 3]),
    arr2 = arr1.transient()
 
arr2.splice(1)
 
arr1[1] !== arr2[1] //= true 

The following native methods return a new instance of p.list:

  • map
  • sort
  • filter
  • splice
  • slice
  • reverse
  • concat
  • pop
  • push
  • shift
  • unshift

The following native methods work as expected for a regular array:

  • toString
  • toLocaleString
  • join
  • forEach
  • indexOf
  • lastIndexOf
  • every
  • some
  • reduce
  • reduceRight