@dubaua/observable
Version:
tiny observable class
1 lines • 3.01 kB
Source Map (JSON)
{"version":3,"file":"observable.min.mjs","sources":["../src/observable.js"],"sourcesContent":["/**\n * @template T\n * @typedef {(next: T, prev: T | undefined) => void} Subscriber\n */\n\n/**\n * Creates reactive object allowing set new value and subscribe to the value change.\n * If new value isn't equal to previous, each callback passed via subscribe method will be fired.\n * @template T\n * @class Observable\n */\n\nclass Observable {\n /** @private @type {T | undefined} */\n internal;\n\n /** @private @type {Array<Subscriber<T>>} */\n callbacks = [];\n\n /** @private @type {T | undefined} */\n initialValue;\n\n /** Allows to set initial value\n * @param {T} [initial]\n * @public\n */\n constructor(initial) {\n this.internal = initial;\n this.initialValue = initial;\n }\n\n /**\n * Higher order function accepting subscriber and returning unsubscribe function\n * @param {Subscriber<T>} callback a function accepting next and prev values\n * @returns {() => void} unsubscribe function stops firing callback\n * @public\n */\n subscribe(callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('[createObservable]: expected callback to be a function.');\n }\n this.callbacks.push(callback);\n return () => {\n const index = this.callbacks.indexOf(callback);\n this.callbacks = this.callbacks.slice(0, index).concat(this.callbacks.slice(index + 1));\n };\n }\n\n /** @returns {T | undefined} @public */\n get value() {\n return this.internal;\n }\n\n /** @param {T | undefined} next @public */\n set value(next) {\n if (next !== this.internal) {\n const prev = this.internal;\n this.internal = next;\n for (let i = 0; i < this.callbacks.length; i++) {\n this.callbacks[i](this.internal, prev);\n }\n }\n }\n\n /**\n * Clears subscribers and restores initial value\n * @public\n */\n reset() {\n this.callbacks = [];\n this.internal = this.initialValue;\n }\n}\n\nexport default Observable;\n"],"names":["Observable","initial","callbacks","this","internal","initialValue","_proto","prototype","_createClass","subscribe","callback","_this","TypeError","push","index","indexOf","slice","concat","reset","key","get","set","next","prev","i","length"],"mappings":"+RAYM,IAAAA,wBAcJ,WAAA,SAAAA,WAAYC,GATZC,KAAAA,UAAY,GAUVC,KAAKC,SAAWH,EAChBE,KAAKE,aAAeJ,CACtB,CAAC,QAAAK,EAAAN,WAAAO,UA0CAC,OA1CAF,EAQDG,UAAA,SAAUC,GAAU,IAAAC,EAClBR,KAAA,GAAwB,mBAAbO,EACT,MAAM,IAAIE,UAAU,2DAGtB,OADAT,KAAKD,UAAUW,KAAKH,cAElB,IAAMI,EAAQH,EAAKT,UAAUa,QAAQL,GACrCC,EAAKT,UAAYS,EAAKT,UAAUc,MAAM,EAAGF,GAAOG,OAAON,EAAKT,UAAUc,MAAMF,EAAQ,GACtF,CACF,EAACR,EAsBDY,MAAA,WACEf,KAAKD,UAAY,GACjBC,KAAKC,SAAWD,KAAKE,YACvB,IAACL,cAAA,CAAA,CAAAmB,IAAA,QAAAC,IAtBD,WACE,OAAWjB,KAACC,QACd,EAACiB,IAGD,SAAUC,GACR,GAAIA,IAASnB,KAAKC,SAAU,CAC1B,IAAMmB,EAAOpB,KAAKC,SAClBD,KAAKC,SAAWkB,EAChB,IAAK,IAAIE,EAAI,EAAGA,EAAIrB,KAAKD,UAAUuB,OAAQD,IACzCrB,KAAKD,UAAUsB,GAAGrB,KAAKC,SAAUmB,EAErC,CACF,iPAAC,CApCD"}