From 1e10b27f69f1704b40dc36f87c1f276976cf1a72 Mon Sep 17 00:00:00 2001 From: Timothy Farrell Date: Thu, 2 Nov 2017 00:19:57 -0500 Subject: [PATCH] Rudimentary support for comparators. --- packages/frptools/src/computed.js | 4 ++-- packages/frptools/src/observable.js | 6 ++++-- packages/frptools/src/util.js | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 packages/frptools/src/util.js diff --git a/packages/frptools/src/computed.js b/packages/frptools/src/computed.js index dbfff1d..a7009ea 100644 --- a/packages/frptools/src/computed.js +++ b/packages/frptools/src/computed.js @@ -1,4 +1,4 @@ -export function computed(fn, dependencies = []) { +export function computed(fn, dependencies = [], comparator = eq) { const subscribers = new Set(); const dependents = new Set(); let isDirty = true; @@ -21,7 +21,7 @@ export function computed(fn, dependencies = []) { if (isDirty) { const newVal = fn.apply(null, dependencies.map(runParam)); isDirty = false; - if (newVal !== val) { + if (!comparator(newVal, val)) { val = newVal; subscribers.forEach(s => s(val)); } diff --git a/packages/frptools/src/observable.js b/packages/frptools/src/observable.js index 66d57ce..6c6180f 100644 --- a/packages/frptools/src/observable.js +++ b/packages/frptools/src/observable.js @@ -1,8 +1,10 @@ -export function observable(store) { +import { eq } from './util.js'; + +export function observable(store, comparator = eq) { const subscribers = new Set(); const accessor = function _observable(newVal) { - if (newVal !== undefined && store !== newVal) { + if (newVal !== undefined && !comparator(store, newVal)) { store = newVal; subscribers.forEach(s => s(store)); } diff --git a/packages/frptools/src/util.js b/packages/frptools/src/util.js new file mode 100644 index 0000000..4ce0d59 --- /dev/null +++ b/packages/frptools/src/util.js @@ -0,0 +1 @@ +export const eq = (a, b) => a === b;