@activejs/core
Version:
Pragmatic, Reactive State Management for JavaScript Apps
78 lines • 8.75 kB
JavaScript
import { Configuration } from './configuration';
import { NonPrimitiveUnitBase } from './abstract-non-primitive-unit-base';
import { findIndex, findIndexBackwards, makeNonEnumerable } from '../utils/funcs';
/**
* GenericUnit is a reactive storage Unit that doesn't pertain to any specific data type.
*
* GenericUnit accepts all data types as its value.
*
* Learn more about Units [here](https://docs.activejs.dev/fundamentals/units). \
* Learn more about GenericUnit [here](https://docs.activejs.dev/fundamentals/units/genericunit).
*
* Just like every other Non-Primitive ActiveJS Unit:
* - GenericUnit extends {@link NonPrimitiveUnitBase}
* - Which further extends {@link UnitBase}, {@link Base} and `Observable`
*
* @category 1. Units
*/
export class GenericUnit extends NonPrimitiveUnitBase {
constructor(config) {
super(Object.assign(Object.assign({}, Configuration.GENERIC_UNIT), config));
makeNonEnumerable(this);
}
/**
* The underlying method that makes `skipNilValues` possible for {@link goBack} and {@link goForward}.
*
* @param direction The direction to find the non `null` or `undefined` value in.
*
* @hidden
* @category Cache Navigation
*/
goToNonNilValue(direction) {
if (this.isFrozen) {
return false;
}
const lastNonNilValueIndex = direction === 'BACK'
? findIndexBackwards(this._cachedValues, v => v != null, this.cacheIndex - 1)
: findIndex(this._cachedValues, v => v != null, this.cacheIndex + 1);
if (lastNonNilValueIndex === -1) {
return false;
}
return this.jump(lastNonNilValueIndex - this.cacheIndex);
}
/**
* It extends {@link UnitBase.goBack}, and allows skipping over nil (null or undefined) values. \
* To skip over nil values pass `true` as `skipNilValues`.
*
* @param skipNilValues Should the `null` and `undefined` values be skipped over.
*
* @category Cache Navigation
*/
goBack(skipNilValues = false) {
if (skipNilValues === true) {
return this.goToNonNilValue('BACK');
}
return super.goBack();
}
/**
* It extends {@link UnitBase.goForward}, and allows skipping over nil (null or undefined) values. \
* To skip over nil values pass `true` as `skipNilValues`.
*
* @param skipNilValues Should the `null` and `undefined` values be skipped over.
*
* @category Cache Navigation
*/
goForward(skipNilValues = false) {
if (skipNilValues === true) {
return this.goToNonNilValue('FORWARD');
}
return super.goForward();
}
/**
* @internal please do not use.
*/
isValidValue(value) {
return true;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy11bml0LmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3J1bm5lci93b3JrL2FjdGl2ZWpzL2FjdGl2ZWpzL3BhY2thZ2VzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL2dlbmVyaWMtdW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFOUMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFDLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR2hGOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLE9BQU8sV0FJWCxTQUFRLG9CQUF1QjtJQUMvQixZQUFZLE1BQXNCO1FBQ2hDLEtBQUssaUNBQ0EsYUFBYSxDQUFDLFlBQVksR0FDMUIsTUFBTSxFQUNULENBQUM7UUFFSCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLGVBQWUsQ0FBQyxTQUE2QjtRQUNuRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE1BQU0sb0JBQW9CLEdBQ3hCLFNBQVMsS0FBSyxNQUFNO1lBQ2xCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztZQUM3RSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxvQkFBb0IsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUMvQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxhQUFhLEdBQUcsS0FBSztRQUMxQixJQUFJLGFBQWEsS0FBSyxJQUFJLEVBQUU7WUFDMUIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JDO1FBRUQsT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxTQUFTLENBQUMsYUFBYSxHQUFHLEtBQUs7UUFDN0IsSUFBSSxhQUFhLEtBQUssSUFBSSxFQUFFO1lBQzFCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN4QztRQUVELE9BQU8sS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNPLFlBQVksQ0FBQyxLQUFVO1FBQy9CLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb25maWd1cmF0aW9ufSBmcm9tICcuL2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtVbml0QmFzZX0gZnJvbSAnLi9hYnN0cmFjdC11bml0LWJhc2UnO1xuaW1wb3J0IHtOb25QcmltaXRpdmVVbml0QmFzZX0gZnJvbSAnLi9hYnN0cmFjdC1ub24tcHJpbWl0aXZlLXVuaXQtYmFzZSc7XG5pbXBvcnQge2ZpbmRJbmRleCwgZmluZEluZGV4QmFja3dhcmRzLCBtYWtlTm9uRW51bWVyYWJsZX0gZnJvbSAnLi4vdXRpbHMvZnVuY3MnO1xuaW1wb3J0IHtLT2YsIFVuaXRDb25maWd9IGZyb20gJy4uL21vZGVscyc7XG5cbi8qKlxuICogR2VuZXJpY1VuaXQgaXMgYSByZWFjdGl2ZSBzdG9yYWdlIFVuaXQgdGhhdCBkb2Vzbid0IHBlcnRhaW4gdG8gYW55IHNwZWNpZmljIGRhdGEgdHlwZS5cbiAqXG4gKiBHZW5lcmljVW5pdCBhY2NlcHRzIGFsbCBkYXRhIHR5cGVzIGFzIGl0cyB2YWx1ZS5cbiAqXG4gKiBMZWFybiBtb3JlIGFib3V0IFVuaXRzIFtoZXJlXShodHRwczovL2RvY3MuYWN0aXZlanMuZGV2L2Z1bmRhbWVudGFscy91bml0cykuIFxcXG4gKiBMZWFybiBtb3JlIGFib3V0IEdlbmVyaWNVbml0IFtoZXJlXShodHRwczovL2RvY3MuYWN0aXZlanMuZGV2L2Z1bmRhbWVudGFscy91bml0cy9nZW5lcmljdW5pdCkuXG4gKlxuICogSnVzdCBsaWtlIGV2ZXJ5IG90aGVyIE5vbi1QcmltaXRpdmUgQWN0aXZlSlMgVW5pdDpcbiAqIC0gR2VuZXJpY1VuaXQgZXh0ZW5kcyB7QGxpbmsgTm9uUHJpbWl0aXZlVW5pdEJhc2V9XG4gKiAtIFdoaWNoIGZ1cnRoZXIgZXh0ZW5kcyB7QGxpbmsgVW5pdEJhc2V9LCB7QGxpbmsgQmFzZX0gYW5kIGBPYnNlcnZhYmxlYFxuICpcbiAqIEBjYXRlZ29yeSAxLiBVbml0c1xuICovXG5leHBvcnQgY2xhc3MgR2VuZXJpY1VuaXQ8XG4gIFQsXG4gIEsgZXh0ZW5kcyBLT2Y8VD4gPSBLT2Y8VD4sXG4gIFYgZXh0ZW5kcyBUW0tdID0gVFtLXVxuPiBleHRlbmRzIE5vblByaW1pdGl2ZVVuaXRCYXNlPFQ+IHtcbiAgY29uc3RydWN0b3IoY29uZmlnPzogVW5pdENvbmZpZzxUPikge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLkNvbmZpZ3VyYXRpb24uR0VORVJJQ19VTklULFxuICAgICAgLi4uY29uZmlnLFxuICAgIH0pO1xuXG4gICAgbWFrZU5vbkVudW1lcmFibGUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHVuZGVybHlpbmcgbWV0aG9kIHRoYXQgbWFrZXMgYHNraXBOaWxWYWx1ZXNgIHBvc3NpYmxlIGZvciB7QGxpbmsgZ29CYWNrfSBhbmQge0BsaW5rIGdvRm9yd2FyZH0uXG4gICAqXG4gICAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0byBmaW5kIHRoZSBub24gYG51bGxgIG9yIGB1bmRlZmluZWRgIHZhbHVlIGluLlxuICAgKlxuICAgKiBAaGlkZGVuXG4gICAqIEBjYXRlZ29yeSBDYWNoZSBOYXZpZ2F0aW9uXG4gICAqL1xuICBwcml2YXRlIGdvVG9Ob25OaWxWYWx1ZShkaXJlY3Rpb246ICdCQUNLJyB8ICdGT1JXQVJEJyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzRnJvemVuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGxhc3ROb25OaWxWYWx1ZUluZGV4ID1cbiAgICAgIGRpcmVjdGlvbiA9PT0gJ0JBQ0snXG4gICAgICAgID8gZmluZEluZGV4QmFja3dhcmRzKHRoaXMuX2NhY2hlZFZhbHVlcywgdiA9PiB2ICE9IG51bGwsIHRoaXMuY2FjaGVJbmRleCAtIDEpXG4gICAgICAgIDogZmluZEluZGV4KHRoaXMuX2NhY2hlZFZhbHVlcywgdiA9PiB2ICE9IG51bGwsIHRoaXMuY2FjaGVJbmRleCArIDEpO1xuICAgIGlmIChsYXN0Tm9uTmlsVmFsdWVJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuanVtcChsYXN0Tm9uTmlsVmFsdWVJbmRleCAtIHRoaXMuY2FjaGVJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogSXQgZXh0ZW5kcyB7QGxpbmsgVW5pdEJhc2UuZ29CYWNrfSwgYW5kIGFsbG93cyBza2lwcGluZyBvdmVyIG5pbCAobnVsbCBvciB1bmRlZmluZWQpIHZhbHVlcy4gXFxcbiAgICogVG8gc2tpcCBvdmVyIG5pbCB2YWx1ZXMgcGFzcyBgdHJ1ZWAgYXMgYHNraXBOaWxWYWx1ZXNgLlxuICAgKlxuICAgKiBAcGFyYW0gc2tpcE5pbFZhbHVlcyBTaG91bGQgdGhlIGBudWxsYCBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzIGJlIHNraXBwZWQgb3Zlci5cbiAgICpcbiAgICogQGNhdGVnb3J5IENhY2hlIE5hdmlnYXRpb25cbiAgICovXG4gIGdvQmFjayhza2lwTmlsVmFsdWVzID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAoc2tpcE5pbFZhbHVlcyA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ29Ub05vbk5pbFZhbHVlKCdCQUNLJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmdvQmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IGV4dGVuZHMge0BsaW5rIFVuaXRCYXNlLmdvRm9yd2FyZH0sIGFuZCBhbGxvd3Mgc2tpcHBpbmcgb3ZlciBuaWwgKG51bGwgb3IgdW5kZWZpbmVkKSB2YWx1ZXMuIFxcXG4gICAqIFRvIHNraXAgb3ZlciBuaWwgdmFsdWVzIHBhc3MgYHRydWVgIGFzIGBza2lwTmlsVmFsdWVzYC5cbiAgICpcbiAgICogQHBhcmFtIHNraXBOaWxWYWx1ZXMgU2hvdWxkIHRoZSBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIHZhbHVlcyBiZSBza2lwcGVkIG92ZXIuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBDYWNoZSBOYXZpZ2F0aW9uXG4gICAqL1xuICBnb0ZvcndhcmQoc2tpcE5pbFZhbHVlcyA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgaWYgKHNraXBOaWxWYWx1ZXMgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmdvVG9Ob25OaWxWYWx1ZSgnRk9SV0FSRCcpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5nb0ZvcndhcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgcGxlYXNlIGRvIG5vdCB1c2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNWYWxpZFZhbHVlKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl19