Mon 21 Jul 22:43:21 CEST 2025

This commit is contained in:
sbosse 2025-07-21 23:13:43 +02:00
parent 4c7bc6f417
commit 9248f614ab

109
js/test/tuple.js Normal file
View 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]));