thirdparty/jsdoctoolkit/app/frame/Chain.js
changeset 3041 c8f47f0b6697
equal deleted inserted replaced
3040:8f9580309846 3041:c8f47f0b6697
       
     1 /**@constructor*/
       
     2 function ChainNode(object, link) {
       
     3 	this.value = object;
       
     4 	this.link = link; // describes this node's relationship to the previous node
       
     5 }
       
     6 
       
     7 /**@constructor*/
       
     8 function Chain(valueLinks) {
       
     9 	this.nodes = [];
       
    10 	this.cursor = -1;
       
    11 	
       
    12 	if (valueLinks && valueLinks.length > 0) {
       
    13 		this.push(valueLinks[0], "//");
       
    14 		for (var i = 1, l = valueLinks.length; i < l; i+=2) {
       
    15 			this.push(valueLinks[i+1], valueLinks[i]);
       
    16 		}
       
    17 	}
       
    18 }
       
    19 
       
    20 Chain.prototype.push = function(o, link) {
       
    21 	if (this.nodes.length > 0 && link) this.nodes.push(new ChainNode(o, link));
       
    22 	else this.nodes.push(new ChainNode(o));
       
    23 }
       
    24 
       
    25 Chain.prototype.unshift = function(o, link) {
       
    26 	if (this.nodes.length > 0 && link) this.nodes[0].link = link;
       
    27 	this.nodes.unshift(new ChainNode(o));
       
    28 	this.cursor++;
       
    29 }
       
    30 
       
    31 Chain.prototype.get = function() {
       
    32 	if (this.cursor < 0 || this.cursor > this.nodes.length-1) return null;
       
    33 	return this.nodes[this.cursor];
       
    34 }
       
    35 
       
    36 Chain.prototype.first = function() {
       
    37 	this.cursor = 0;
       
    38 	return this.get();
       
    39 }
       
    40 
       
    41 Chain.prototype.last = function() {
       
    42 	this.cursor = this.nodes.length-1;
       
    43 	return this.get();
       
    44 }
       
    45 
       
    46 Chain.prototype.next = function() {
       
    47 	this.cursor++;
       
    48 	return this.get();
       
    49 }
       
    50 
       
    51 Chain.prototype.prev = function() {
       
    52 	this.cursor--;
       
    53 	return this.get();
       
    54 }
       
    55 
       
    56 Chain.prototype.toString = function() {
       
    57 	var string = "";
       
    58 	for (var i = 0, l = this.nodes.length; i < l; i++) {
       
    59 		if (this.nodes[i].link) string += " -("+this.nodes[i].link+")-> ";
       
    60 		string += this.nodes[i].value.toString();
       
    61 	}
       
    62 	return string;
       
    63 }
       
    64 
       
    65 Chain.prototype.joinLeft = function() {
       
    66 	var result = "";
       
    67 	for (var i = 0, l = this.cursor; i < l; i++) {
       
    68 		if (result && this.nodes[i].link) result += this.nodes[i].link;
       
    69 		result += this.nodes[i].value.toString();
       
    70 	}
       
    71 	return result;
       
    72 }
       
    73 
       
    74 
       
    75 /* USAGE:
       
    76 
       
    77 var path = "one/two/three.four/five-six";
       
    78 var pathChain = new Chain(path.split(/([\/.-])/));
       
    79 print(pathChain);
       
    80 
       
    81 var lineage = new Chain();
       
    82 lineage.push("Port");
       
    83 lineage.push("Les", "son");
       
    84 lineage.push("Dawn", "daughter");
       
    85 lineage.unshift("Purdie", "son");
       
    86 
       
    87 print(lineage);
       
    88 
       
    89 // walk left
       
    90 for (var node = lineage.last(); node !== null; node = lineage.prev()) {
       
    91 	print("< "+node.value);
       
    92 }
       
    93 
       
    94 // walk right
       
    95 var node = lineage.first()
       
    96 while (node !== null) {
       
    97 	print(node.value);
       
    98 	node = lineage.next();
       
    99 	if (node && node.link) print("had a "+node.link+" named");
       
   100 }
       
   101 
       
   102 */