@activejs/core
Version:
Pragmatic, Reactive State Management for JavaScript Apps
34 lines • 5.11 kB
JavaScript
import { distinctUntilChanged, map } from 'rxjs/operators';
import { plucker } from '../utils/funcs';
import { checkPath } from '../checks/common';
/**
* Selection offers the ability to operate on nested properties in a Unit's value.
*
* Selection is a simple construct that operates on a nested property in
* the non-primitive Units' value, ie: ListUnit, GenericUnit and DictUnit.
*
* See {@link https://docs.activejs.dev/utilities/selection} for more details.
*
* @category 4. Utility
*/
export class Selection {
constructor(unit, path) {
this.unit = unit;
this.path = path;
checkPath(path);
}
value() {
const valAtPath = plucker(this.unit.rawValue(), this.path);
return this.unit.deepCopyMaybe(valAtPath);
}
asObservable() {
if (this.unit.config.immutable === true) {
// allows to optimize cases when the whole value is not new,
// e.g.: updating property 'a' in a DictUnit using 'set',
// wouldn't trigger paths that start with property 'b'
return this.unit.pipe(map(() => plucker(this.unit.rawValue(), this.path)), distinctUntilChanged(), map(() => plucker(this.unit.emittedValue, this.path)));
}
return this.unit.pipe(map(value => plucker(value, this.path)), distinctUntilChanged());
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3J1bm5lci93b3JrL2FjdGl2ZWpzL2FjdGl2ZWpzL3BhY2thZ2VzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL3NlbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHekQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUUzQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQU8sU0FBUztJQUNwQixZQUFvQixJQUFPLEVBQVUsSUFBeUI7UUFBMUMsU0FBSSxHQUFKLElBQUksQ0FBRztRQUFVLFNBQUksR0FBSixJQUFJLENBQXFCO1FBQzVELFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsS0FBSztRQUNILE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxPQUFRLElBQUksQ0FBQyxJQUFZLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQ3ZDLDREQUE0RDtZQUM1RCx5REFBeUQ7WUFDekQsc0RBQXNEO1lBQ3RELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDbkQsb0JBQW9CLEVBQUUsRUFDdEIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBRSxJQUFJLENBQUMsSUFBWSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDL0QsQ0FBQztTQUNIO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDbkIsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDdkMsb0JBQW9CLEVBQUUsQ0FDdkIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2Rpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7VW5pdEJhc2V9IGZyb20gJy4vYWJzdHJhY3QtdW5pdC1iYXNlJztcbmltcG9ydCB7S09mfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtwbHVja2VyfSBmcm9tICcuLi91dGlscy9mdW5jcyc7XG5pbXBvcnQge2NoZWNrUGF0aH0gZnJvbSAnLi4vY2hlY2tzL2NvbW1vbic7XG5cbi8qKlxuICogU2VsZWN0aW9uIG9mZmVycyB0aGUgYWJpbGl0eSB0byBvcGVyYXRlIG9uIG5lc3RlZCBwcm9wZXJ0aWVzIGluIGEgVW5pdCdzIHZhbHVlLlxuICpcbiAqIFNlbGVjdGlvbiBpcyBhIHNpbXBsZSBjb25zdHJ1Y3QgdGhhdCBvcGVyYXRlcyBvbiBhIG5lc3RlZCBwcm9wZXJ0eSBpblxuICogdGhlIG5vbi1wcmltaXRpdmUgVW5pdHMnIHZhbHVlLCBpZTogTGlzdFVuaXQsIEdlbmVyaWNVbml0IGFuZCBEaWN0VW5pdC5cbiAqXG4gKiBTZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5hY3RpdmVqcy5kZXYvdXRpbGl0aWVzL3NlbGVjdGlvbn0gZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAY2F0ZWdvcnkgNC4gVXRpbGl0eVxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uPFQsIFUgZXh0ZW5kcyBVbml0QmFzZTxhbnk+ID0gVW5pdEJhc2U8YW55PiwgSyBleHRlbmRzIEtPZjxUPiA9IEtPZjxUPj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHVuaXQ6IFUsIHByaXZhdGUgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSkge1xuICAgIGNoZWNrUGF0aChwYXRoKTtcbiAgfVxuXG4gIHZhbHVlKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZhbEF0UGF0aCA9IHBsdWNrZXIodGhpcy51bml0LnJhd1ZhbHVlKCksIHRoaXMucGF0aCk7XG4gICAgcmV0dXJuICh0aGlzLnVuaXQgYXMgYW55KS5kZWVwQ29weU1heWJlKHZhbEF0UGF0aCk7XG4gIH1cblxuICBhc09ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKHRoaXMudW5pdC5jb25maWcuaW1tdXRhYmxlID09PSB0cnVlKSB7XG4gICAgICAvLyBhbGxvd3MgdG8gb3B0aW1pemUgY2FzZXMgd2hlbiB0aGUgd2hvbGUgdmFsdWUgaXMgbm90IG5ldyxcbiAgICAgIC8vIGUuZy46IHVwZGF0aW5nIHByb3BlcnR5ICdhJyBpbiBhIERpY3RVbml0IHVzaW5nICdzZXQnLFxuICAgICAgLy8gd291bGRuJ3QgdHJpZ2dlciBwYXRocyB0aGF0IHN0YXJ0IHdpdGggcHJvcGVydHkgJ2InXG4gICAgICByZXR1cm4gdGhpcy51bml0LnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiBwbHVja2VyKHRoaXMudW5pdC5yYXdWYWx1ZSgpLCB0aGlzLnBhdGgpKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgbWFwKCgpID0+IHBsdWNrZXIoKHRoaXMudW5pdCBhcyBhbnkpLmVtaXR0ZWRWYWx1ZSwgdGhpcy5wYXRoKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudW5pdC5waXBlKFxuICAgICAgbWFwKHZhbHVlID0+IHBsdWNrZXIodmFsdWUsIHRoaXMucGF0aCkpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==