{"version":3,"sources":["../ts/modules/observable.ts"],"names":["isCallable","foo","Observable","constructor","this","observers","addObserver","observer","indexOf","push","removeObserver","array_1","removeAll","notify","param","next","filter","exports","SingleObservable","super","_isResolved","_isRejected","_hasFired","_hasFailed","_promiselike","Promise","resolve","reject","_resolve","value","isPending","_reject","fail","error","then","onFulfilled","onRejected","isResolved","isRejected","ObservableValue","initialValue","_value","onChange","valueOf","toString","call"],"mappings":"8FAeA,SAASA,WAAYC,KACpB,MAAsB,YAAf,OAAOA,GACf,C,wIAEaC,WAAbC,cAwBWC,KAAAC,UAAiC,EAC5C,CAxBQC,YAAaC,UACnB,IAAQF,UAAcD,KAAdC,aACR,MAAIL,CAAAA,EAAAA,WAAYO,QAAQ,GAAMF,UAAUG,QAASD,QAAQ,EAAK,KAC7DF,UAAUI,KAAMF,QAAQ,EACjB,CAAA,EAIT,CAEOG,eAAgBH,UACtB,OAA+C,GAAxC,EAAAI,QAAAC,WAAWR,KAAKC,UAAWE,QAAQ,CAC3C,CAEOM,OAAQC,MAAUC,KAAO,OAAa,CAAA,GAC5C,IACSR,SAAT,IAASA,YADSH,KAAKC,UAAUW,OAAQhB,UAAU,EAGlD,GADAO,SAAUO,KAAK,EACO,CAAA,IAAlBC,KAAMD,KAAK,EAAe,MAAO,CAAA,EAEtC,MAAO,CAAA,CACR,C,CAtBDG,QAAAf,WAAAA,WA2BAe,QAAAC,+BAAyChB,WACxCC,cACCgB,MAAK,EA0CEf,KAAAgB,YAAc,CAAA,EACdhB,KAAAiB,YAAc,CAAA,EAcdjB,KAAAkB,UAAY,CAAA,EACZlB,KAAAmB,WAAa,CAAA,EAzDpBnB,KAAKoB,aAAe,IAAIC,QAAS,CAAEC,QAASC,UAC3CvB,KAAKwB,SAAWC,QACVzB,KAAK0B,YACV1B,KAAKgB,YAAc,CAAA,EACnBM,QAASG,KAAK,EACf,EACAzB,KAAK2B,QAAUF,QACTzB,KAAK0B,YACV1B,KAAKiB,YAAc,CAAA,EACnBM,OAAQE,KAAK,EACd,CACD,CAAC,CACF,CAEOhB,OAAQC,OACd,MAAKV,CAAAA,CAAAA,KAAK0B,YACVX,MAAMN,OAAQC,KAAK,EACnBV,KAAKwB,SAAUd,KAAK,EACb,CAAA,EACR,CAEOkB,KAAMC,OAGZ,OAFK7B,KAAK0B,WACV1B,KAAK2B,QAASE,KAAK,EACZ,CAAA,CACR,CAQOC,KAASC,YAAkBC,YACjC,OAAOX,QAAQC,QAAStB,KAAKoB,YAAY,EAAGU,KAASC,YAAaC,UAAU,CAC7E,CASAC,iBACC,OAAOjC,KAAKgB,WACb,CAEAkB,iBACC,OAAOlC,KAAKiB,WACb,CAEAS,gBACC,MAAO,EAAE1B,KAAKiC,YAAcjC,KAAKkC,WAClC,C,EAMDrB,QAAAsB,8BAAwCrC,WACvCC,YAAaqC,cACZrB,MAAK,EACLf,KAAKqC,OAASD,YACf,CAIAX,YAAqB,OAAOzB,KAAKqC,MAAQ,CACzCZ,UAAkBA,OACbzB,KAAKqC,SAAWZ,QACnBzB,KAAKqC,OAASZ,MACdzB,KAAKsC,SAAUb,KAAK,EAEtB,CAEUa,SAAUb,OACnBzB,KAAKS,OAAQgB,KAAK,CACnB,CAEOc,UACN,IAAQd,MAAUzB,KAAVyB,SACR,OAAIA,MAAAA,MAA+CA,MACvCA,MAAMc,QAAO,CAC1B,CAEOC,WACN,IAAQf,MAAUzB,KAAVyB,SACR,OAAIA,MAAAA,MAA+C,GAAKe,SAASC,KAAMhB,KAAK,EAChEA,MAAMe,SAAQ,CAC3B,C","file":"observable.js","sourcesContent":["import { removeAll } from 'utilities/array';\r\n\r\nexport interface IObserver {\r\n\t( value: T ): void;\r\n}\r\n\r\nexport interface IObservable {\r\n\taddObserver( observer: IObserver ): boolean;\r\n\tremoveObserver( observer: IObserver ): boolean;\r\n}\r\n\r\nexport interface IObservableValue extends IObservable {\r\n\tvalue: T;\r\n}\r\n\r\nfunction isCallable( foo: any ): foo is Function {\r\n\treturn typeof foo === 'function';\r\n}\r\n\r\nexport class Observable {\r\n\tpublic addObserver( observer: IObserver ) {\r\n\t\tconst { observers } = this;\r\n\t\tif( isCallable( observer ) && observers.indexOf( observer ) < 0 ) {\r\n\t\t\tobservers.push( observer );\r\n\t\t\treturn true;\r\n\t\t} else {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic removeObserver( observer: IObserver ) {\r\n\t\treturn removeAll( this.observers, observer ) > 0;\r\n\t}\r\n\r\n\tpublic notify( param: T, next = ( param ) => true ) {\r\n\t\tconst observers = this.observers.filter( isCallable );\r\n\t\tfor( let observer of observers ) {\r\n\t\t\tobserver( param );\r\n\t\t\tif( next( param ) === false ) return false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tprotected observers: Array> = [];\r\n}\r\n\r\nexport class SingleObservable extends Observable {\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis._promiselike = new Promise( ( resolve, reject ) => {\r\n\t\t\tthis._resolve = value => {\r\n\t\t\t\tif( !this.isPending ) return;\r\n\t\t\t\tthis._isResolved = true;\r\n\t\t\t\tresolve( value );\r\n\t\t\t};\r\n\t\t\tthis._reject = value => {\r\n\t\t\t\tif( !this.isPending ) return;\r\n\t\t\t\tthis._isRejected = true;\r\n\t\t\t\treject( value );\r\n\t\t\t};\r\n\t\t} );\r\n\t}\r\n\r\n\tpublic notify( param: T ) {\r\n\t\tif( !this.isPending ) return false;\r\n\t\tsuper.notify( param );\r\n\t\tthis._resolve( param );\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpublic fail( error?: any ) {\r\n\t\tif( !this.isPending ) return false;\r\n\t\tthis._reject( error );\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic then( onFulfilled?: (value: T) => PromiseLike, onRejected?: (error: any) => PromiseLike ): PromiseLike;\r\n\tpublic then( onFulfilled?: (value: T) => PromiseLike, onRejected?: (error: any) => U ): PromiseLike;\r\n\tpublic then( onFulfilled?: (value: T) => PromiseLike, onRejected?: (error: any) => void ): PromiseLike;\r\n\tpublic then( onFulfilled?: (value: T) => U, onRejected?: (error: any) => PromiseLike ): PromiseLike;\r\n\tpublic then( onFulfilled?: (value: T) => U, onRejected?: (error: any) => U ): PromiseLike;\r\n\tpublic then( onFulfilled?: (value: T) => U, onRejected?: (error: any) => void ): PromiseLike;\r\n\tpublic then( onFulfilled: any, onRejected?: any ) {\r\n\t\treturn Promise.resolve( this._promiselike ).then( onFulfilled, onRejected );\r\n\t}\r\n\r\n\tprivate _promiselike: PromiseLike;\r\n\tprivate _resolve: ( value: T ) => void;\r\n\tprivate _reject: ( error: T ) => void;\r\n\r\n\tprivate _isResolved = false;\r\n\tprivate _isRejected = false;\r\n\r\n\tpublic get isResolved() {\r\n\t\treturn this._isResolved;\r\n\t}\r\n\r\n\tpublic get isRejected() {\r\n\t\treturn this._isRejected;\r\n\t}\r\n\r\n\tpublic get isPending() {\r\n\t\treturn !(this.isResolved || this.isRejected);\r\n\t}\r\n\r\n\tprivate _hasFired = false;\r\n\tprivate _hasFailed = false;\r\n}\r\n\r\nexport class ObservableValue extends Observable implements IObservableValue {\r\n\tconstructor( initialValue?: T ) {\r\n\t\tsuper();\r\n\t\tthis._value = initialValue;\r\n\t}\r\n\r\n\tprivate _value: T;\r\n\r\n\tpublic get value() { return this._value; }\r\n\tpublic set value( value: T ) {\r\n\t\tif( this._value !== value ) {\r\n\t\t\tthis._value = value;\r\n\t\t\tthis.onChange( value );\r\n\t\t}\r\n\t}\r\n\r\n\tprotected onChange( value: T ) {\r\n\t\tthis.notify( value );\r\n\t}\r\n\r\n\tpublic valueOf() {\r\n\t\tconst { value } = this;\r\n\t\tif( value === null || value === undefined ) return value;\r\n\t\telse return value.valueOf() as T;\r\n\t}\r\n\r\n\tpublic toString() {\r\n\t\tconst { value } = this;\r\n\t\tif( value === null || value === undefined ) return ({}).toString.call( value );\r\n\t\telse return value.toString();\r\n\t}\r\n}\r\n"]}