Difference between revisions of "Peer-nodal.as"
(LGPL) |
(legacy) |
||
(19 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
+ | {{legacy}} | ||
+ | <as> | ||
// Liscenced under LGPL: www.gnu.org/copyleft/lesser.html | // Liscenced under LGPL: www.gnu.org/copyleft/lesser.html | ||
// | // | ||
− | // | + | // peer-nodal.as - ecma-script implementation of the nodal core |
// Nad - 2006 | // Nad - 2006 | ||
// | // | ||
Line 11: | Line 13: | ||
// NODAL PROPERTIES & CORE NODAL CONCEPTS | // NODAL PROPERTIES & CORE NODAL CONCEPTS | ||
− | // idcount is a accumulating-only counter for locally-unique-id number | + | // - all-capital-identifiers are node-references |
− | // nodes is the current number of instantiated node objects | + | // - ROOT.idcount is a accumulating-only counter for locally-unique-id number |
− | + | // - ROOT.nodes is the current number of instantiated node objects | |
− | ROOT = { | + | ROOT = { idcount: 0, nodes: 0 }; |
− | NEXT = new node(); | + | VOID = ROOT; |
− | PREV = new node(); | + | INIT = new node( ROOT ); // Default method executed if quanta sent to empty/new association |
− | FUNC = new node(); | + | NEXT = new node( ROOT ); |
− | FOCUS = new node(); | + | PREV = new node( ROOT ); |
+ | FUNC = new node( ROOT ); | ||
+ | FOCUS = new node( ROOT ); | ||
// NODE OBJECT | // NODE OBJECT | ||
− | function node() { | + | // - note: only a node's parent can adjust a nodes prev/next |
− | + | function node( key ) { | |
ROOT.nodes++; | ROOT.nodes++; | ||
this.id = ROOT.idcount++; | this.id = ROOT.idcount++; | ||
− | this. | + | this.set( [FOCUS], key.get( [INIT] ) ); |
− | + | } | |
− | |||
// NODAL METHODS | // NODAL METHODS | ||
Line 37: | Line 40: | ||
// - but keep all hierarchy nodal | // - but keep all hierarchy nodal | ||
− | node.prototype.set( path, value ) { | + | node.prototype.set = function( path, value ) { |
− | ptr = this. | + | var ptr = this._resolve( path ); |
ptr.value = value; | ptr.value = value; | ||
− | + | }; | |
− | node.prototype.get( path ) { | + | node.prototype.get = function( path ) { |
− | ptr = this. | + | var ptr = this._resolve( path ); |
// need to return class.value onNonExistent | // need to return class.value onNonExistent | ||
return ptr.value; | return ptr.value; | ||
− | + | }; | |
// Resolve creates if non existent and returns reference to result | // Resolve creates if non existent and returns reference to result | ||
// - this is private, used by get/set | // - this is private, used by get/set | ||
− | node.prototype. | + | node.prototype._resolve = function( path ) { |
var context = this; | var context = this; | ||
while( path.length ) { | while( path.length ) { | ||
var key = path.shift(); | var key = path.shift(); | ||
− | context = context[key.id] == null ? context[key.id] = new node() : context[ key.id ]; | + | context = context[key.id] == null ? context[key.id] = new node( key ) : context[ key.id ]; |
− | + | } | |
return context; | return context; | ||
− | + | }; | |
// Consume one quanta | // Consume one quanta | ||
Line 66: | Line 69: | ||
// the structures necessary to build the fucntion are child assocs too | // the structures necessary to build the fucntion are child assocs too | ||
node.prototype.reduce = function() { | node.prototype.reduce = function() { | ||
− | |||
− | // | + | // Rotate this level's queue |
− | var | + | var ptr = this.get( [FOCUS] ); |
− | + | this.set( [FOCUS], this.get( [FOCUS,NEXT] ) ); | |
// If there's a local function declaration, execute | // If there's a local function declaration, execute | ||
− | + | var ref = ptr.get( [FUNC] ); | |
− | ref = | + | if ( ref != VOID ) { |
+ | ref = ref.call( ptr ); | ||
+ | if ( ref == VOID ) { | ||
+ | // Remove focus from loop | ||
+ | ptr.set( [NEXT,PREV], ptr.get( [PREV] ) ); // ptr.next.prev = ptr.prev | ||
+ | ptr.set( [PREV,NEXT], ptr.get( [NEXT] ) ); // ptr.prev.next = ptr.next | ||
+ | } | ||
+ | else if ( ref != ptr ) { | ||
+ | // Replace current ptr with result-ref | ||
+ | ref.set( [NEXT], ptr.get( [NEXT] ) ); // ref.next = ptr.next | ||
+ | ref.set( [PREV], ptr.get( [PREV] ) ); // ref.prev = ptr.prev | ||
+ | ptr.set( [NEXT,PREV], ref ); // ptr.next.prev = ref | ||
+ | ptr.set( [PREV,NEXT], ref ); // ptr.prev.next = ref | ||
+ | } | ||
+ | |||
// also call class.reduce() | // also call class.reduce() | ||
− | |||
− | // if not, send the quanta downstairs if there's | + | } |
− | else if ( ) | + | |
− | + | // if not, send the quanta downstairs if there's anything in its loop | |
+ | else if ( ptr = ptr.get( [FOCUS] ) != VOID ) ptr.reduce(); | ||
− | + | }; | |
+ | </as> | ||
+ | [[Category:ActionScript]] |
Latest revision as of 23:43, 24 September 2013
<as> // Liscenced under LGPL: www.gnu.org/copyleft/lesser.html // // peer-nodal.as - ecma-script implementation of the nodal core // Nad - 2006 //
// ISSUES // - associations (maintained class:instance relationships) // - get should use class content as default - resolve() doesn't // so either add get/set which use resolve, or remove object-freedom and have only .data
// NODAL PROPERTIES & CORE NODAL CONCEPTS // - all-capital-identifiers are node-references // - ROOT.idcount is a accumulating-only counter for locally-unique-id number // - ROOT.nodes is the current number of instantiated node objects ROOT = { idcount: 0, nodes: 0 }; VOID = ROOT; INIT = new node( ROOT ); // Default method executed if quanta sent to empty/new association NEXT = new node( ROOT ); PREV = new node( ROOT ); FUNC = new node( ROOT ); FOCUS = new node( ROOT );
// NODE OBJECT // - note: only a node's parent can adjust a nodes prev/next function node( key ) { ROOT.nodes++; this.id = ROOT.idcount++; this.set( [FOCUS], key.get( [INIT] ) ); }
// NODAL METHODS // - the delete-list is only needed for limited list-space env // - Actionscript failed ref-as-hashkey test, // so we use a id (locally unique identifier) as a lookup-key // - no delete currently // - just get/set properties with normal object-accessor way // - but keep all hierarchy nodal
node.prototype.set = function( path, value ) { var ptr = this._resolve( path ); ptr.value = value; };
node.prototype.get = function( path ) { var ptr = this._resolve( path ); // need to return class.value onNonExistent return ptr.value; };
// Resolve creates if non existent and returns reference to result // - this is private, used by get/set node.prototype._resolve = function( path ) { var context = this; while( path.length ) { var key = path.shift(); context = context[key.id] == null ? context[key.id] = new node( key ) : context[ key.id ]; } return context; };
// Consume one quanta // - each quantum is actually two, one for local instance, one for global class // - all instance-loops work by going cd this.current then assigning this.current.next to it // when a function executes, it can update the loop at that location (equiv to array.push) // - a functions parameters (and even further methods and tools) are child associations // the structures necessary to build the fucntion are child assocs too node.prototype.reduce = function() {
// Rotate this level's queue var ptr = this.get( [FOCUS] ); this.set( [FOCUS], this.get( [FOCUS,NEXT] ) );
// If there's a local function declaration, execute var ref = ptr.get( [FUNC] ); if ( ref != VOID ) { ref = ref.call( ptr ); if ( ref == VOID ) { // Remove focus from loop ptr.set( [NEXT,PREV], ptr.get( [PREV] ) ); // ptr.next.prev = ptr.prev ptr.set( [PREV,NEXT], ptr.get( [NEXT] ) ); // ptr.prev.next = ptr.next } else if ( ref != ptr ) { // Replace current ptr with result-ref ref.set( [NEXT], ptr.get( [NEXT] ) ); // ref.next = ptr.next ref.set( [PREV], ptr.get( [PREV] ) ); // ref.prev = ptr.prev ptr.set( [NEXT,PREV], ref ); // ptr.next.prev = ref ptr.set( [PREV,NEXT], ref ); // ptr.prev.next = ref }
// also call class.reduce()
}
// if not, send the quanta downstairs if there's anything in its loop else if ( ptr = ptr.get( [FOCUS] ) != VOID ) ptr.reduce();
}; </as>