transitionnetwork.js
2.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* the aim of the transition network is to build a network of promises */
import TokenEvent from './tokenevent.js';
const Leaf = function(tokenEvents,nodeName) {
this.eval = function() {
return tokenEvents[nodeName];
};
};
const OrNode = function(tokenEvents, left, right) {
this.eval = function() {
return left.eval(tokenEvents) || right.eval(tokenEvents);
};
};
const AndNode = function(tokenEvents, left, right) {
this.eval = function(tokenEvents) {
return left.eval(tokenEvents) && right.eval(tokenEvents);
};
};
let TransitionNetwork = {};
//let TransitionNetwork = function() {
// object storing token events (that is to say references to promises)
/*this.promise = {};
this.and = function(tn) {
this.promise = Promise.all([this.promise, tn.promise]);
return this;
};
this.or = function(tn) {
this.promise = Promise.race([this.promise, tn.promise]);
return this;
};*/
//};
TransitionNetwork.build = function(tree, tokenEvents) {
var res;
var tmpTN;
var rightTN;
if (typeof tree === "string") {
tokenEvents[tree] = tokenEvents[tree] ?? false;
return new Leaf(tokenEvents, tree);
}
res = TransitionNetwork.build(tree[0],tokenEvents);
var i;
for (i=1; i < tree.length; i++) {
if (tree[i].hasOwnProperty('and')) {
rightTN = TransitionNetwork.build(tree[i]['and'], tokenEvents);
tmpTN = new AndNode(tokenEvents, res, rightTN);
} else {
if (tree[i].hasOwnProperty('or')) {
rightTN = TransitionNetwork.build(tree[i]['or'], tokenEvents);
tmpTN = new OrNode(tokenEvents, res, rightTN);
} else {
console.warn('[ARCS] Illegal tree');
}
}
res = tmpTN;
}
/*if (typeof tree === "string") {
// here we have a terminal string i.e. a token event
var tokenEvent;
if (tokenEvents.hasOwnProperty(tree)) {
tokenEvent = tokenEvents[tree];
} else {
tokenEvents[tree] = tokenEvent = new TokenEvent();
}
var tn = new TransitionNetwork();
tn.promise = tokenEvent.promise;
return tn;
}
res = TransitionNetwork.build(tree[0],tokenEvents);
var i;
for (i=1; i < tree.length; i++) {
if (tree[i].hasOwnProperty('and')) {
rightTN = TransitionNetwork.build(tree[i]['and'], tokenEvents);
tmpTN = res.and(rightTN);
} else {
if (tree[i].hasOwnProperty('or')) {
rightTN = TransitionNetwork.build(tree[i]['or'], tokenEvents);
tmpTN = res.or(rightTN);
} else {
console.warn('[ARCS] Illegal tree');
}
}
res = tmpTN;
}*/
return res;
};
export default TransitionNetwork;