From e37679c2c9443f07d923aab3b8a65d6c42bd6f9d Mon Sep 17 00:00:00 2001 From: Timothy Farrell Date: Thu, 2 Nov 2017 08:35:52 -0500 Subject: [PATCH] Add computed.unsubscribeAll. Sometimes we want to remove... ...subscribers without removing dependencies. --- packages/frptools/src/computed.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/frptools/src/computed.js b/packages/frptools/src/computed.js index a7009ea..679c2c9 100644 --- a/packages/frptools/src/computed.js +++ b/packages/frptools/src/computed.js @@ -4,6 +4,7 @@ export function computed(fn, dependencies = [], comparator = eq) { let isDirty = true; let val; + // Receive dirty flag from parent logic node (dependency). Pass it down. function _computedDirtyReporter(_, skipPropagation) { if (!isDirty) { isDirty = true; @@ -17,6 +18,7 @@ export function computed(fn, dependencies = [], comparator = eq) { const dependentSubscriptions = Array.from(dependencies).map(d => d._d(_computedDirtyReporter)); + // Compute new value, call subscribers if changed. const accessor = function _computed() { if (isDirty) { const newVal = fn.apply(null, dependencies.map(runParam)); @@ -29,6 +31,7 @@ export function computed(fn, dependencies = [], comparator = eq) { return val; }; + // Add child nodes to the logic graph (value-based) accessor.subscribe = fn => { subscribers.add(fn); return () => { @@ -37,17 +40,25 @@ export function computed(fn, dependencies = [], comparator = eq) { }; }; + // Add child nodes to the logic graph (dirty-based) accessor._d = fn => { dependents.add(fn); return () => dependents.delete(fn); }; + // Remove this node from the logic graph completely accessor.detach = () => { subscribers.clear(); dependents.clear(); dependentSubscriptions.forEach(runParam); }; + // Remove child nodes from the logic graph + accessor.unsubscribeAll = () => { + subscribers.clear(); + dependents.clear(); + }; + return accessor; }