• supersede.js

  • ΒΆ
    function Supersede () {
        this._root = {}
        this._root[''] = this._root
    }
    
    Supersede.prototype.set = function (path, value) {
        var node = this._root
    
        for (var i = 0, I = path.length; i < I; i++) {
            if (!node[path[i]]) {
                node[path[i]] = {}
            }
            node = node[path[i]]
        }
    
        node['.value'] = value
    
        return value
    }
    
    Supersede.prototype.remove = function (path, value) {
        var node = this._root, parent
    
        for (var i = 0, I = path.length; i < I; i++) {
            if (!node[path[i]]) {
                return
            }
            parent = node
            node = node[path[i]]
        }
    
        if ('.value' in node) {
            delete node['.value']
            if (I > 1 && Object.keys(node).length == 0) {
                delete parent[path[I - 1]]
            }
        }
    }
    
    Supersede.prototype.get = function (path) {
        var node = this._root, i = 0, value
        do {
            value = node['.value'] == null ? value : node['.value']
            node = node[path[i++]]
        } while (node)
        return value
    }
    
    Supersede.prototype.gather = function (path) {
        var node = this._root, i = 0, array = []
        for (;;) {
            node = node[path[i++]]
            if (node == null) {
                break
            }
            if (node['.value'] != null) {
                array.push(node['.value'])
            }
        }
        return array
    }
    
    module.exports = Supersede