UNPKG

relu-core

Version:
52 lines (45 loc) 1.26 kB
var base = require("./base"); var rpVariable = require("./variable"); var rpComputed = require("./computed"); module.exports = function rpDoubleComputed(d, fn, fnBack) { var computed = d.computed(fn); var p = rpVariable(computed._getUndependend()); p.constructor = rpDoubleComputed; var computedBack = p.computed(fnBack); var computedChanged = false; var computedBackChanged = false; computed.onChanged(function() { if(!computedBackChanged && !computedChanged) { computedChanged = true; base.atAtomicEnd(transferValue); } else computedChanged = true; }); computedBack.onChanged(function() { if(!computedBackChanged && !computedChanged) { computedBackChanged = true; base.atAtomicEnd(transferValue); } else computedBackChanged = true; }); function transferValue() { if(computedChanged) { p.set(computed._getUndependend()); } else if(computedBackChanged) { d.set(computedBack._getUndependend()); } computedChanged = computedBackChanged = false; } p._addWeakRef(computedBack); computed.ref(p); computedBack.ref(p); p.onceDisposed(function() { computed.unref(p); computedBack.unref(p); }); return p; }; /* computed -> d computedBack -> p */