diff --git a/Logic/UIEventSource.ts b/Logic/UIEventSource.ts index eadd38d520..5fbfdcda6d 100644 --- a/Logic/UIEventSource.ts +++ b/Logic/UIEventSource.ts @@ -305,7 +305,8 @@ export class ImmutableStore extends Store { */ class ListenerTracker { private readonly _callbacks: ((t: T) => (boolean | void | any)) [] = []; - + + public pingCount = 0; /** * Adds a callback which can be called; a function to unregister is returned */ @@ -330,6 +331,7 @@ class ListenerTracker { * Returns the number of registered callbacks */ public ping(data: T): number { + this.pingCount ++; let toDelete = undefined let startTime = new Date().getTime() / 1000; for (const callback of this._callbacks) { @@ -368,7 +370,10 @@ class ListenerTracker { class MappedStore extends Store { private _upstream: Store; + private _upstreamCallbackHandler: ListenerTracker; + private _upstreamPingCount: number = -1; private _unregisterFromUpstream: (() => void) + private _f: (t: TIn) => T; private readonly _extraStores: Store[] | undefined; private _unregisterFromExtraStores: (() => void)[] | undefined @@ -378,18 +383,39 @@ class MappedStore extends Store { private static readonly pass: () => {} - constructor(upstream: Store, f: (t: TIn) => T, extraStores: Store[] = undefined, initialData : T= undefined) { + constructor(upstream: Store, f: (t: TIn) => T, extraStores: Store[] = undefined, + upstreamListenerHandler: ListenerTracker) { super(); this._upstream = upstream; + this._upstreamCallbackHandler = upstreamListenerHandler this._f = f; - this._data = initialData ?? f(upstream.data) + this._data = f(upstream.data) + this._upstreamPingCount = upstreamListenerHandler.pingCount this._extraStores = extraStores; + this.registerCallbacksToUpstream() } private _data: T; private _callbacksAreRegistered = false - get data(): T { + /** + * Gets the current data from the store + * + * const src = new UIEventSource(21) + * const mapped = src.map(i => i * 2) + * src.setData(3) + * mapped.data // => 6 + * + */ + get data(): T { + if (!this._callbacksAreRegistered) { + // Callbacks are not registered, so we haven't been listening for updates from the upstream which might have changed + if(this._upstreamCallbackHandler.pingCount != this._upstreamPingCount){ + // Upstream has pinged - let's update our data first + this._data = this._f(this._upstream.data) + } + return this._data + } return this._data } @@ -413,7 +439,7 @@ class MappedStore extends Store { this._upstream, data => f(this._f(data)), stores, - f(this._data) + this._upstreamCallbackHandler ); } @@ -423,9 +449,22 @@ class MappedStore extends Store { this._unregisterFromUpstream() this._unregisterFromExtraStores?.forEach(unr => unr()) } + + private registerCallbacksToUpstream() { + const self = this + + this._unregisterFromUpstream = this._upstream.addCallback( + _ => self.update() + ) + this._unregisterFromExtraStores = this._extraStores?.map(store => + store?.addCallback(_ => self.update()) + ) + this._callbacksAreRegistered = true; + } private update(): void { const newData = this._f(this._upstream.data) + this._upstreamPingCount = this._upstreamCallbackHandler.pingCount if (this._data == newData) { return; } @@ -435,16 +474,9 @@ class MappedStore extends Store { addCallback(callback: (data: T) => (any | boolean | void)): (() => void) { if (!this._callbacksAreRegistered) { - const self = this // This is the first callback that is added // We register this 'map' to the upstream object and all the streams - this._unregisterFromUpstream = this._upstream.addCallback( - _ => self.update() - ) - this._unregisterFromExtraStores = this._extraStores?.map(store => - store?.addCallback(_ => self.update()) - ) - this._callbacksAreRegistered = true; + this.registerCallbacksToUpstream() } const unregister = this._callbacks.addCallback(callback) return () => { @@ -487,7 +519,7 @@ class MappedStore extends Store { export class UIEventSource extends Store { public data: T; - private _callbacks: ListenerTracker = new ListenerTracker() + _callbacks: ListenerTracker = new ListenerTracker() private static readonly pass: () => {} @@ -637,7 +669,7 @@ export class UIEventSource extends Store { */ public map(f: ((t: T) => J), extraSources: Store[] = []): Store { - return new MappedStore(this, f, extraSources); + return new MappedStore(this, f, extraSources, this._callbacks); } /** diff --git a/assets/layers/etymology/etymology.json b/assets/layers/etymology/etymology.json index 63268951dc..804da649d0 100644 --- a/assets/layers/etymology/etymology.json +++ b/assets/layers/etymology/etymology.json @@ -58,58 +58,99 @@ "Q22698" ], "removePrefixes": [ + "allée de", "allée du", "allée", + "autoroute de", "autoroute du", "autoroute", + "avenue de", "avenue du", "avenue", + "bibliothèque de", "bibliothèque du", "bibliothèque", + "boulevard de", "boulevard du", "boulevard", - "centre du", - "centre", + "centre culturel de", "centre culturel du", "centre culturel", + "centre de", + "centre du", + "centre", + "chaussée de", "chaussée du", "chaussée", + "chemin de", "chemin du", "chemin", + "collège de", "collège du", "collège", + "complexe sportif de", "complexe sportif du", "complexe sportif", - "école du", - "école", + "école élémentaire de", "école élémentaire du", "école élémentaire", + "école maternelle de", "école maternelle du", "école maternelle", + "école primaire de", "école primaire du", "école primaire", + "école de", + "école du", + "école", + "esplanade de", "esplanade du", "esplanade", + "groupe scolaire de", "groupe scolaire du", "groupe scolaire", + "gymnase de", "gymnase du", "gymnase", + "impasse de", + "impasse du", + "impasse", + "lycée de", "lycée du", "lycée", + "mail de", "mail du", "mail", + "médiathèque de", "médiathèque du", "médiathèque", + "musée de", "musée du", "musée", + "parc de", "parc du", "parc", + "place de", + "place du", + "place", + "résidence de", + "résidence du", + "résidence", + "route de", + "route du", + "route", + "rue de", "rue du", "rue", + "square de", "square du", "square", + "stade de", "stade du", - "stade" + "stade", + "villa de", + "villa du", + "villa" ], "removePostfixes": [ "baan", @@ -278,4 +319,4 @@ } } ] -} \ No newline at end of file +}