export const ValueObserver = ( initialValue: T, valueGetter: () => T, handler: (value: T) => void ): ValueObserverInstance => { let previousValue: T = initialValue; return Object.freeze({ init(value: T) { previousValue = value; }, notify() { const value = valueGetter(); if (previousValue !== value) { handler(value); } previousValue = value; }, }); }; export type ValueObserverInstance = { readonly init: (value: T) => void; readonly notify: () => void; };