Spaces:
Sleeping
Sleeping
/**@constructor*/ | |
function ChainNode(object, link) { | |
this.value = object; | |
this.link = link; // describes this node's relationship to the previous node | |
} | |
/**@constructor*/ | |
function Chain(valueLinks) { | |
this.nodes = []; | |
this.cursor = -1; | |
if (valueLinks && valueLinks.length > 0) { | |
this.push(valueLinks[0], "//"); | |
for (var i = 1, l = valueLinks.length; i < l; i+=2) { | |
this.push(valueLinks[i+1], valueLinks[i]); | |
} | |
} | |
} | |
Chain.prototype.push = function(o, link) { | |
if (this.nodes.length > 0 && link) this.nodes.push(new ChainNode(o, link)); | |
else this.nodes.push(new ChainNode(o)); | |
} | |
Chain.prototype.unshift = function(o, link) { | |
if (this.nodes.length > 0 && link) this.nodes[0].link = link; | |
this.nodes.unshift(new ChainNode(o)); | |
this.cursor++; | |
} | |
Chain.prototype.get = function() { | |
if (this.cursor < 0 || this.cursor > this.nodes.length-1) return null; | |
return this.nodes[this.cursor]; | |
} | |
Chain.prototype.first = function() { | |
this.cursor = 0; | |
return this.get(); | |
} | |
Chain.prototype.last = function() { | |
this.cursor = this.nodes.length-1; | |
return this.get(); | |
} | |
Chain.prototype.next = function() { | |
this.cursor++; | |
return this.get(); | |
} | |
Chain.prototype.prev = function() { | |
this.cursor--; | |
return this.get(); | |
} | |
Chain.prototype.toString = function() { | |
var string = ""; | |
for (var i = 0, l = this.nodes.length; i < l; i++) { | |
if (this.nodes[i].link) string += " -("+this.nodes[i].link+")-> "; | |
string += this.nodes[i].value.toString(); | |
} | |
return string; | |
} | |
Chain.prototype.joinLeft = function() { | |
var result = ""; | |
for (var i = 0, l = this.cursor; i < l; i++) { | |
if (result && this.nodes[i].link) result += this.nodes[i].link; | |
result += this.nodes[i].value.toString(); | |
} | |
return result; | |
} | |
/* USAGE: | |
var path = "one/two/three.four/five-six"; | |
var pathChain = new Chain(path.split(/([\/.-])/)); | |
print(pathChain); | |
var lineage = new Chain(); | |
lineage.push("Port"); | |
lineage.push("Les", "son"); | |
lineage.push("Dawn", "daughter"); | |
lineage.unshift("Purdie", "son"); | |
print(lineage); | |
// walk left | |
for (var node = lineage.last(); node !== null; node = lineage.prev()) { | |
print("< "+node.value); | |
} | |
// walk right | |
var node = lineage.first() | |
while (node !== null) { | |
print(node.value); | |
node = lineage.next(); | |
if (node && node.link) print("had a "+node.link+" named"); | |
} | |
*/ |