Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
parent
4c7bc6f417
commit
9248f614ab
109
js/test/tuple.js
Normal file
109
js/test/tuple.js
Normal file
|
@ -0,0 +1,109 @@
|
|||
/* New tuple space implementation - Prototype */
|
||||
/**
|
||||
|
||||
Tupel space is divided in sub-spaces by creating a hierachical tuple space:
|
||||
|
||||
1. Arity
|
||||
2. Tuple type signature
|
||||
3. Hash tag from first tuple element
|
||||
|
||||
*/
|
||||
|
||||
var inspect = require('util').inspect;
|
||||
var _ = undefined;
|
||||
|
||||
|
||||
var SIGTYPE = {
|
||||
undefined:0,
|
||||
number:1,
|
||||
string:2,
|
||||
boolean:4,
|
||||
object:8,
|
||||
array:16,
|
||||
function:32
|
||||
}
|
||||
|
||||
var SIGTYPEMAX=6;
|
||||
|
||||
function signature(tuple) {
|
||||
var s=0;
|
||||
for(var i in tuple) {
|
||||
var t = typeof tuple[i];
|
||||
if (t=='object' && t instanceof Array) t='array';
|
||||
s = s | SIGTYPE[t]; s = s << SIGTYPEMAX;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
var db = [];
|
||||
var MAXDIM=10;
|
||||
|
||||
function init () {
|
||||
for(var i=1;i<=MAXDIM;i++)
|
||||
db[i]={dim:i,n:0,stores:{}}
|
||||
}
|
||||
|
||||
function store (tuple) {
|
||||
var ary = tuple.length;
|
||||
var sig = signature(tuple);
|
||||
var ts = db[ary];
|
||||
var store,index,hash;
|
||||
if (!ts.stores[sig]) {
|
||||
store={hash:{},sig:sig};
|
||||
store.hash[tuple[0]]={data:[tuple],free:[]};
|
||||
ts.stores[sig]=store;
|
||||
} else {
|
||||
store=ts.stores[sig];
|
||||
hash=store.hash[tuple[0]];
|
||||
if (hash) {
|
||||
if (hash.free.length)
|
||||
hash.data[index=hash.free.pop()]=tuple;
|
||||
else
|
||||
hash.data.push(tuple);
|
||||
} else {
|
||||
store.hash[tuple[0]]={data:[tuple],free:[]};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function match (tuple,pattern) {
|
||||
function eq (v1,v2) {
|
||||
// simplified test
|
||||
if (v1==v2) return true;
|
||||
return false;
|
||||
}
|
||||
for(var index in tuple) {
|
||||
if (pattern[index]!=undefined && !eq(tuple[index],pattern[index]))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function lookup (pattern) {
|
||||
var ary = pattern.length;
|
||||
var sig = signature(pattern);
|
||||
var ts = db[ary];
|
||||
// Search in all matching stores
|
||||
for (var s in ts.stores) {
|
||||
store= ts.stores[s];
|
||||
if ((store.sig & sig) == sig) {
|
||||
// pattern signature is contained in this store
|
||||
if (pattern[0]!=undefined) {
|
||||
hash=store.hash[pattern[0]];
|
||||
if (hash) for (d in hash.data) {
|
||||
if (match(hash.data[d],pattern)) return hash.data[d]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
init();
|
||||
store(['SEN',100,100]);
|
||||
store(['SEN',200,100]);
|
||||
store(['SEN2',100,true]);
|
||||
print(inspect(db[3],_,8));
|
||||
print(lookup(['SEN',_,_]));
|
||||
print(lookup(['SEN',_,100]));
|
||||
print(lookup(['SEN',_,101]));
|
Loading…
Reference in New Issue
Block a user