{
const log = [];
const getResultForSignal = function(signalObject, param) {
if (signalObject.result === undefined) {
signalObject.result = signalObject.evaluate(param);
signalObject.resultParam = param;
}
if (signalObject.resultParam === param) {
return signalObject.result;
}
log.push("Eval called with different params");
return signalObject.evaluate(param);
};
const signalB = (param) => getResultForSignal(signalB, param);
signalB.init = function() {
this.twoVal = 2;
function evaluate(param) {
log.push("Eval B called");
const ret = this.twoVal * signalA(param) / 32;
log.push("Computed B");
return ret;
};
if (!this.evaluate) {
this.evaluate = evaluate;
}
};
signalB.init();
const signalA = (param) => getResultForSignal(signalA, param);
signalA.init = function() {
this.evaluate = function(param) {
log.push("Eval A called");
const ret = signalB.twoVal * param * param;
log.push("Computed A");
return ret;
};
if (this.evaluate === undefined) {
this.evaluate = evaluate;
}
};
signalA.init();
function evaluate(param) {
signalA.result = undefined;
signalB.result = undefined;
return ({
signalB: signalB(param),
signalA: signalA(param),
log: log
})
}
return evaluate(4);
}