From db8bbf0102165afd2038c71f8a6760b765c1873c Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Sat, 24 Aug 2019 23:49:21 -0700 Subject: [PATCH] Add some generic methods for dealing with selectors (#888) --- modern/src/MakiSelectors.ts | 14 +++++++++----- modern/src/runtime/GuiObject.js | 31 +++++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/modern/src/MakiSelectors.ts b/modern/src/MakiSelectors.ts index 60ee3e75..ae5eed4c 100644 --- a/modern/src/MakiSelectors.ts +++ b/modern/src/MakiSelectors.ts @@ -1,14 +1,18 @@ import * as Utils from "./utils"; -function findNodeByUid(state, uid) { - return Utils.findInTree(state.xmlTree, node => { - return node.uid === uid; - }); +function findNodeByUid(uid) { + // TODO: Do some clever caching here. + return state => { + return Utils.findInTree(state.xmlTree, node => { + return node.uid === uid; + }); + }; } export function getTop(uid) { + const findNodeInState = findNodeByUid(uid); return state => { - const node = findNodeByUid(state, uid); + const node = findNodeInState(state); return Number(node.attributes.y) || 0; }; } diff --git a/modern/src/runtime/GuiObject.js b/modern/src/runtime/GuiObject.js index a8cff28e..289900dd 100644 --- a/modern/src/runtime/GuiObject.js +++ b/modern/src/runtime/GuiObject.js @@ -11,6 +11,25 @@ class GuiObject extends MakiObject { super(node, parent, annotations, store); this.visible = true; + this._selectorCache = new Map(); + } + + _useUidSelector(selector) { + // TODO: use memoize for this + if (!this._selectorCache.has(selector)) { + this._selectorCache.set(selector, selector(this._uid)); + } + return this._selectorCache.get(selector)(this._store.getState()); + } + + _compareToUidSelector(value, selector) { + const selectorValue = this._useUidSelector(selector); + if (selectorValue !== value) { + console.error( + `Maki state ${value} is out of sync with tree state ${selectorValue}` + ); + } + return value; } /** @@ -62,14 +81,10 @@ class GuiObject extends MakiObject { } gettop() { - const stateTop = MakiSelectors.getTop(this._uid)(this._store.getState()); - const makiTop = Number(this.attributes.y) || 0; - if (stateTop !== makiTop) { - console.error( - `Maki state ${makiTop} is out of sync with tree state ${stateTop}` - ); - } - return makiTop; + return this._compareToUidSelector( + Number(this.attributes.y) || 0, + MakiSelectors.getTop + ); } getleft() {