Pure string:val storage, using structural sharing


This project is no longer actively supported. If anyone is interested in becoming the new maintainer, don't hesitate to contact me (

For an alternative, consider


Pure string:val storage, using structural sharing.

This module forms a possible basis for effecient persistent datastructures; such as those found in Clojure's PersistentHashMap and PersistentVector.

npm install persistent-hash-trie

var p = require('persistent-hash-trie')
var trie = p.Trie()

Returns a new Trie with the new key:value keys added.

var trie1 = p.Trie()
var trie2 = p.assoc(trie1, 'key', { value: true })

Returns a new Trie without a specific key

var trie1 = p.assoc(p.Trie(), 'key', 'val')
var trie2 = p.dissoc(trie2, 'key')

Retrieves a value from a Trie.

var trie = p.assoc(p.Trie(), 'key', 'val')
p.get(trie, 'key') //= 'val' 

Returns true or false, depending on whether the value is in the Trie.

var trie = p.assoc(p.Trie(), 'key', 'val')
p.has(trie, 'key')  //= true 
p.has(trie, 'not-in-here') //= false 

Returns a mutable copy of a Trie, in the form of a js object.

var trie = p.assoc(p.Trie(), 'key', 'val')
p.mutable(trie) //= { key: 'val' } 

Returns an array of all keys in the trie

var trie = p.assoc(p.Trie(), 'key', 'val')
p.keys(trie) //= ['key'] 

The traditional reduce - requires seed.

// definition of `mutable` using reduce: 
var mutable = function(node){
    return p.reduce(node, addKeyVal, {})
var addKeyVal = function(ovalkey){
    o[key] = val
    return o

Can be cancelled early:

var some = function(nodepredicate){
return p.reduce(node, function(seedvalue){
if ( !predicate(value)) return p.reduce.Break(false)
else                    return true
}, true)

The hashing and equality functions used on the keys can be overidden by passing an opts object to assoc, dissoc, get and has.

var p = require('persistent-hash-trie')
var opts = {
eqfunction(ab){ return a === b},
hashfunction(key){ return parseInt(key, 10) }
var vector = p.assoc(p.Trie(), 3, 'my-val', opts)
var val = p.get(vector, 3, opts)
var vector2 = p.dissoc(vector, 3, opts)
p.has(vector2, 3, opts) // false 

npm test and npm run benchmark are your friends.