transitionnetwork.js 1.66 KB
/* the aim of the transition network is to build a network of promises */
import TokenEvent from './tokenevent.js';


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") {
        // 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;