UNPKG

@activejs/core

Version:

Pragmatic, Reactive State Management for JavaScript Apps

84 lines 9.02 kB
import { Observable } from 'rxjs'; import { isFunction, isNumber, makeNonEnumerable } from '../utils/funcs'; import { Configuration } from './configuration'; import { UnitBase } from './abstract-unit-base'; import { Base } from './abstract-base'; /** * NumUnit is a reactive storage Unit that emulates `number`. * * It only accepts `number` data type as its value. * It ensures that at any point of time the value would always be `number`. * * NumUnit implements all the `Number.prototype` methods that are available * in the environment/browser its running, including polyfills. * e.g.: `toFixed`, `toPrecision`, etc. * * Learn more about Units [here](https://docs.activejs.dev/fundamentals/units). \ * Learn more about NumUnit [here](https://docs.activejs.dev/fundamentals/units/numunit). * * Just like every other ActiveJS Unit: * - NumUnit extends {@link UnitBase} * - Which further extends {@link Base} and `Observable` * * @category 1. Units */ export class NumUnit extends UnitBase { constructor(config) { super(Object.assign(Object.assign({}, Configuration.NUM_UNIT), config)); makeNonEnumerable(this); } /** * Current value of the Unit. * @default `0` (number zero) * * @category Access Value */ value() { return this.rawValue(); } /** * @internal please do not use. */ defaultValue() { return 0; } /** * Extends {@link UnitBase.wouldDispatch} and adds additional check for type number, * which cannot be bypassed even by using param `force`. * * @param value The value to be dispatched. * @param force Whether dispatch-checks should be bypassed or not. * @returns A boolean indicating whether the param `value` would pass the dispatch-checks if dispatched. * * @category Common Units */ wouldDispatch(value, force) { return this.isValidValue(value) && super.wouldDispatch(value, force); } /** * @internal please do not use. */ isValidValue(value) { return isNumber(value); } } /** * @internal please do not use. */ const MethodsNotToImplement = [ ...Object.getOwnPropertyNames(Observable.prototype), ...Object.getOwnPropertyNames(Base.prototype), ...Object.getOwnPropertyNames(UnitBase.prototype), ...Object.getOwnPropertyNames(NumUnit.prototype), ]; Object.getOwnPropertyNames(Number.prototype).forEach(method => { if (!isFunction(Number.prototype[method]) || MethodsNotToImplement.includes(method)) { return; } Object.defineProperty(NumUnit.prototype, method, { value(...args) { return Number.prototype[method].apply(this.value(), args); }, }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtLXVuaXQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvYWN0aXZlanMvYWN0aXZlanMvcGFja2FnZXMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvbnVtLXVuaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVoQyxPQUFPLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDOUMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBS3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLFFBQWdCO0lBa0IzQyxZQUFZLE1BQTJCO1FBQ3JDLEtBQUssaUNBQ0EsYUFBYSxDQUFDLFFBQVEsR0FDdEIsTUFBTSxFQUNULENBQUM7UUFFSCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBeEJEOzs7OztPQUtHO0lBQ0gsS0FBSztRQUNILE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNPLFlBQVk7UUFDcEIsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBV0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsYUFBYSxDQUFDLEtBQWEsRUFBRSxLQUFlO1FBQzFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQ7O09BRUc7SUFDTyxZQUFZLENBQUMsS0FBVTtRQUMvQixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixDQUFDO0NBUUY7QUFFRDs7R0FFRztBQUNILE1BQU0scUJBQXFCLEdBQUc7SUFDNUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUNuRCxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzdDLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7SUFDakQsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztDQUNqRCxDQUFDO0FBQ0YsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7SUFDNUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUkscUJBQXFCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ25GLE9BQU87S0FDUjtJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUU7UUFDL0MsS0FBSyxDQUFDLEdBQUcsSUFBSTtZQUNYLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVELENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1VuaXRDb25maWd9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge2lzRnVuY3Rpb24sIGlzTnVtYmVyLCBtYWtlTm9uRW51bWVyYWJsZX0gZnJvbSAnLi4vdXRpbHMvZnVuY3MnO1xuaW1wb3J0IHtDb25maWd1cmF0aW9ufSBmcm9tICcuL2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtVbml0QmFzZX0gZnJvbSAnLi9hYnN0cmFjdC11bml0LWJhc2UnO1xuaW1wb3J0IHtCYXNlfSBmcm9tICcuL2Fic3RyYWN0LWJhc2UnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZW1wdHktaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIE51bVVuaXQgZXh0ZW5kcyBOdW1iZXIge31cblxuLyoqXG4gKiBOdW1Vbml0IGlzIGEgcmVhY3RpdmUgc3RvcmFnZSBVbml0IHRoYXQgZW11bGF0ZXMgYG51bWJlcmAuXG4gKlxuICogSXQgb25seSBhY2NlcHRzIGBudW1iZXJgIGRhdGEgdHlwZSBhcyBpdHMgdmFsdWUuXG4gKiBJdCBlbnN1cmVzIHRoYXQgYXQgYW55IHBvaW50IG9mIHRpbWUgdGhlIHZhbHVlIHdvdWxkIGFsd2F5cyBiZSBgbnVtYmVyYC5cbiAqXG4gKiBOdW1Vbml0IGltcGxlbWVudHMgYWxsIHRoZSBgTnVtYmVyLnByb3RvdHlwZWAgbWV0aG9kcyB0aGF0IGFyZSBhdmFpbGFibGVcbiAqIGluIHRoZSBlbnZpcm9ubWVudC9icm93c2VyIGl0cyBydW5uaW5nLCBpbmNsdWRpbmcgcG9seWZpbGxzLlxuICogZS5nLjogYHRvRml4ZWRgLCBgdG9QcmVjaXNpb25gLCBldGMuXG4gKlxuICogTGVhcm4gbW9yZSBhYm91dCBVbml0cyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmFjdGl2ZWpzLmRldi9mdW5kYW1lbnRhbHMvdW5pdHMpLiBcXFxuICogTGVhcm4gbW9yZSBhYm91dCBOdW1Vbml0IFtoZXJlXShodHRwczovL2RvY3MuYWN0aXZlanMuZGV2L2Z1bmRhbWVudGFscy91bml0cy9udW11bml0KS5cbiAqXG4gKiBKdXN0IGxpa2UgZXZlcnkgb3RoZXIgQWN0aXZlSlMgVW5pdDpcbiAqIC0gTnVtVW5pdCBleHRlbmRzIHtAbGluayBVbml0QmFzZX1cbiAqIC0gV2hpY2ggZnVydGhlciBleHRlbmRzIHtAbGluayBCYXNlfSBhbmQgYE9ic2VydmFibGVgXG4gKlxuICogQGNhdGVnb3J5IDEuIFVuaXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBOdW1Vbml0IGV4dGVuZHMgVW5pdEJhc2U8bnVtYmVyPiB7XG4gIC8qKlxuICAgKiBDdXJyZW50IHZhbHVlIG9mIHRoZSBVbml0LlxuICAgKiBAZGVmYXVsdCBgMGAgKG51bWJlciB6ZXJvKVxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQWNjZXNzIFZhbHVlXG4gICAqL1xuICB2YWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJhd1ZhbHVlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIHBsZWFzZSBkbyBub3QgdXNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRlZmF1bHRWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3RydWN0b3IoY29uZmlnPzogVW5pdENvbmZpZzxudW1iZXI+KSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4uQ29uZmlndXJhdGlvbi5OVU1fVU5JVCxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9KTtcblxuICAgIG1ha2VOb25FbnVtZXJhYmxlKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dGVuZHMge0BsaW5rIFVuaXRCYXNlLndvdWxkRGlzcGF0Y2h9IGFuZCBhZGRzIGFkZGl0aW9uYWwgY2hlY2sgZm9yIHR5cGUgbnVtYmVyLFxuICAgKiB3aGljaCBjYW5ub3QgYmUgYnlwYXNzZWQgZXZlbiBieSB1c2luZyBwYXJhbSBgZm9yY2VgLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIGRpc3BhdGNoZWQuXG4gICAqIEBwYXJhbSBmb3JjZSBXaGV0aGVyIGRpc3BhdGNoLWNoZWNrcyBzaG91bGQgYmUgYnlwYXNzZWQgb3Igbm90LlxuICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYXJhbSBgdmFsdWVgIHdvdWxkIHBhc3MgdGhlIGRpc3BhdGNoLWNoZWNrcyBpZiBkaXNwYXRjaGVkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQ29tbW9uIFVuaXRzXG4gICAqL1xuICB3b3VsZERpc3BhdGNoKHZhbHVlOiBudW1iZXIsIGZvcmNlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRWYWx1ZSh2YWx1ZSkgJiYgc3VwZXIud291bGREaXNwYXRjaCh2YWx1ZSwgZm9yY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBwbGVhc2UgZG8gbm90IHVzZS5cbiAgICovXG4gIHByb3RlY3RlZCBpc1ZhbGlkVmFsdWUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc051bWJlcih2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQGlnbm9yZVxuICAgKiBAaW50ZXJuYWwgcGxlYXNlIGRvIG5vdCB1c2UuXG4gICAqL1xuICBzdGF0aWMgTnVtYmVyOiBhbnk7XG59XG5cbi8qKlxuICogQGludGVybmFsIHBsZWFzZSBkbyBub3QgdXNlLlxuICovXG5jb25zdCBNZXRob2RzTm90VG9JbXBsZW1lbnQgPSBbXG4gIC4uLk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9ic2VydmFibGUucHJvdG90eXBlKSxcbiAgLi4uT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQmFzZS5wcm90b3R5cGUpLFxuICAuLi5PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhVbml0QmFzZS5wcm90b3R5cGUpLFxuICAuLi5PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhOdW1Vbml0LnByb3RvdHlwZSksXG5dO1xuT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTnVtYmVyLnByb3RvdHlwZSkuZm9yRWFjaChtZXRob2QgPT4ge1xuICBpZiAoIWlzRnVuY3Rpb24oTnVtYmVyLnByb3RvdHlwZVttZXRob2RdKSB8fCBNZXRob2RzTm90VG9JbXBsZW1lbnQuaW5jbHVkZXMobWV0aG9kKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOdW1Vbml0LnByb3RvdHlwZSwgbWV0aG9kLCB7XG4gICAgdmFsdWUoLi4uYXJncykge1xuICAgICAgcmV0dXJuIE51bWJlci5wcm90b3R5cGVbbWV0aG9kXS5hcHBseSh0aGlzLnZhbHVlKCksIGFyZ3MpO1xuICAgIH0sXG4gIH0pO1xufSk7XG4iXX0=