relu-core
Version:
52 lines (45 loc) • 1.26 kB
JavaScript
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
*/