38 lines
1.3 KiB
JavaScript
38 lines
1.3 KiB
JavaScript
import evaluateCalculation from '/imports/api/creature/computation/evaluateCalculation.js';
|
|
|
|
export default function computeToggle(toggle, memo){
|
|
if (toggle.computationDetails.computed) return;
|
|
if (toggle.computationDetails.busyComputing){
|
|
// Trying to compute this effect again while it is already computing.
|
|
// We must be in a dependency loop.
|
|
toggle.computationDetails.computed = true;
|
|
toggle.result = false;
|
|
toggle.computationDetails.busyComputing = false;
|
|
toggle.computationDetails.error = 'dependencyLoop';
|
|
if (Meteor.isClient) console.warn('dependencyLoop', toggle);
|
|
return;
|
|
}
|
|
// Before doing any work, mark this toggle as busy
|
|
toggle.computationDetails.busyComputing = true;
|
|
|
|
// Do work
|
|
delete toggle.errors;
|
|
if (toggle.enabled){
|
|
toggle.toggleResult = true;
|
|
} else if (toggle.disabled){
|
|
toggle.toggleResult = false;
|
|
} else if (!toggle.condition){
|
|
toggle.toggleResult = false;
|
|
} else if (Number.isFinite(+toggle.condition)){
|
|
toggle.toggleResult = !!+toggle.condition;
|
|
} else {
|
|
let {value, errors} = evaluateCalculation(toggle.condition, memo);
|
|
toggle.toggleResult = value;
|
|
if (errors.length){
|
|
toggle.errors = errors;
|
|
}
|
|
}
|
|
toggle.computationDetails.computed = true;
|
|
toggle.computationDetails.busyComputing = false;
|
|
}
|