UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

139 lines 12 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { coerceArray } from './coerceArray'; import { DEFAULT_ID_KEY } from './defaultIDKey'; import { distinctUntilChanged, map } from 'rxjs/operators'; import { isArray } from './isArray'; import { isFunction } from './isFunction'; import { isEmpty } from './isEmpty'; // @internal /** * @template T * @param {?} collection * @param {?} idsOrPredicate * @param {?} idKey * @return {?} */ export function find(collection, idsOrPredicate, idKey) { /** @type {?} */ const result = []; if (isFunction(idsOrPredicate)) { for (const entity of collection) { if (idsOrPredicate(entity) === true) { result.push(entity); } } } else { /** @type {?} */ const toSet = coerceArray(idsOrPredicate).reduce((/** * @param {?} acc * @param {?} current * @return {?} */ (acc, current) => acc.add(current)), new Set()); for (const entity of collection) { if (toSet.has(entity[idKey])) { result.push(entity); } } } return result; } // @internal /** * @template T * @return {?} */ export function distinctUntilArrayItemChanged() { return distinctUntilChanged((/** * @param {?} prevCollection * @param {?} currentCollection * @return {?} */ (prevCollection, currentCollection) => { if (prevCollection === currentCollection) { return true; } if (isArray(prevCollection) === false || isArray(currentCollection) === false) { return false; } if (isEmpty(prevCollection) && isEmpty(currentCollection)) { return true; } // if item is new in the current collection but not exist in the prev collection /** @type {?} */ const hasNewItem = hasChange(currentCollection, prevCollection); if (hasNewItem) { return false; } /** @type {?} */ const isOneOfItemReferenceChanged = hasChange(prevCollection, currentCollection); // return false means there is a change and we want to call next() return isOneOfItemReferenceChanged === false; })); } // @internal /** * @template T * @param {?} first * @param {?} second * @return {?} */ function hasChange(first, second) { /** @type {?} */ const hasChange = second.some((/** * @param {?} currentItem * @return {?} */ currentItem => { /** @type {?} */ const oldItem = first.find((/** * @param {?} prevItem * @return {?} */ prevItem => prevItem === currentItem)); return oldItem === undefined; })); return hasChange; } /** * @template T * @param {?} idsOrPredicate * @param {?=} idKey * @return {?} */ export function arrayFind(idsOrPredicate, idKey) { return (/** * @param {?} source * @return {?} */ function (source) { return source.pipe(map((/** * @param {?} collection * @return {?} */ (collection) => { // which means the user deleted the root entity or set the collection to nil if (isArray(collection) === false) { return collection; } return find(collection, idsOrPredicate, idKey || DEFAULT_ID_KEY); })), distinctUntilArrayItemChanged(), map((/** * @param {?} value * @return {?} */ value => { if (isArray(value) === false) { return value; } if (isArray(idsOrPredicate) || isFunction(idsOrPredicate)) { return value; } return value[0]; }))); }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlGaW5kLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2FraXRhLyIsInNvdXJjZXMiOlsic3JjL2FycmF5RmluZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7QUFHcEMsTUFBTSxVQUFVLElBQUksQ0FBSSxVQUFlLEVBQUUsY0FBbUMsRUFBRSxLQUFhOztVQUNuRixNQUFNLEdBQUcsRUFBRTtJQUNqQixJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRTtRQUM5QixLQUFLLE1BQU0sTUFBTSxJQUFJLFVBQVUsRUFBRTtZQUMvQixJQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ25DLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDckI7U0FDRjtLQUNGO1NBQU07O2NBQ0MsS0FBSyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNOzs7OztRQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRS9GLEtBQUssTUFBTSxNQUFNLElBQUksVUFBVSxFQUFFO1lBQy9CLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNyQjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDOzs7Ozs7QUFHRCxNQUFNLFVBQVUsNkJBQTZCO0lBQzNDLE9BQU8sb0JBQW9COzs7OztJQUFDLENBQUMsY0FBbUIsRUFBRSxpQkFBc0IsRUFBRSxFQUFFO1FBQzFFLElBQUksY0FBYyxLQUFLLGlCQUFpQixFQUFFO1lBQ3hDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxLQUFLLElBQUksT0FBTyxDQUFDLGlCQUFpQixDQUFDLEtBQUssS0FBSyxFQUFFO1lBQzdFLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFBRTtZQUN6RCxPQUFPLElBQUksQ0FBQztTQUNiOzs7Y0FHSyxVQUFVLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixFQUFFLGNBQWMsQ0FBQztRQUUvRCxJQUFJLFVBQVUsRUFBRTtZQUNkLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7O2NBRUssMkJBQTJCLEdBQUcsU0FBUyxDQUFDLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQztRQUVoRixrRUFBa0U7UUFDbEUsT0FBTywyQkFBMkIsS0FBSyxLQUFLLENBQUM7SUFDL0MsQ0FBQyxFQUFDLENBQUM7QUFDTCxDQUFDOzs7Ozs7OztBQUdELFNBQVMsU0FBUyxDQUFJLEtBQVUsRUFBRSxNQUFXOztVQUNyQyxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUk7Ozs7SUFBQyxXQUFXLENBQUMsRUFBRTs7Y0FDcEMsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJOzs7O1FBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssV0FBVyxFQUFDO1FBQ2hFLE9BQU8sT0FBTyxLQUFLLFNBQVMsQ0FBQztJQUMvQixDQUFDLEVBQUM7SUFFRixPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDOzs7Ozs7O0FBNEJELE1BQU0sVUFBVSxTQUFTLENBQUksY0FBb0QsRUFBRSxLQUFjO0lBQy9GOzs7O0lBQU8sVUFBUyxNQUF1QjtRQUNyQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQ2hCLEdBQUc7Ozs7UUFBQyxDQUFDLFVBQWtDLEVBQUUsRUFBRTtZQUN6Qyw0RUFBNEU7WUFDNUUsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssS0FBSyxFQUFFO2dCQUNqQyxPQUFPLFVBQVUsQ0FBQzthQUNuQjtZQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsS0FBSyxJQUFJLGNBQWMsQ0FBQyxDQUFDO1FBQ25FLENBQUMsRUFBQyxFQUNGLDZCQUE2QixFQUFFLEVBQy9CLEdBQUc7Ozs7UUFBQyxLQUFLLENBQUMsRUFBRTtZQUNWLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDNUIsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUVELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRTtnQkFDekQsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUVELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsRUFBQyxDQUNILENBQUM7SUFDSixDQUFDLEVBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURTLCBJdGVtUHJlZGljYXRlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjb2VyY2VBcnJheSB9IGZyb20gJy4vY29lcmNlQXJyYXknO1xuaW1wb3J0IHsgREVGQVVMVF9JRF9LRVkgfSBmcm9tICcuL2RlZmF1bHRJREtleSc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnLi9pc0FycmF5JztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuL2lzRnVuY3Rpb24nO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gJy4vaXNFbXB0eSc7XG5cbi8vIEBpbnRlcm5hbFxuZXhwb3J0IGZ1bmN0aW9uIGZpbmQ8VD4oY29sbGVjdGlvbjogVFtdLCBpZHNPclByZWRpY2F0ZTogSURTIHwgSXRlbVByZWRpY2F0ZSwgaWRLZXk6IHN0cmluZykge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgaWYgKGlzRnVuY3Rpb24oaWRzT3JQcmVkaWNhdGUpKSB7XG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgY29sbGVjdGlvbikge1xuICAgICAgaWYgKGlkc09yUHJlZGljYXRlKGVudGl0eSkgPT09IHRydWUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZW50aXR5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdG9TZXQgPSBjb2VyY2VBcnJheShpZHNPclByZWRpY2F0ZSkucmVkdWNlKChhY2MsIGN1cnJlbnQpID0+IGFjYy5hZGQoY3VycmVudCksIG5ldyBTZXQoKSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAodG9TZXQuaGFzKGVudGl0eVtpZEtleV0pKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGVudGl0eSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gQGludGVybmFsXG5leHBvcnQgZnVuY3Rpb24gZGlzdGluY3RVbnRpbEFycmF5SXRlbUNoYW5nZWQ8VD4oKTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPFRbXT4ge1xuICByZXR1cm4gZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXZDb2xsZWN0aW9uOiBUW10sIGN1cnJlbnRDb2xsZWN0aW9uOiBUW10pID0+IHtcbiAgICBpZiAocHJldkNvbGxlY3Rpb24gPT09IGN1cnJlbnRDb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheShwcmV2Q29sbGVjdGlvbikgPT09IGZhbHNlIHx8IGlzQXJyYXkoY3VycmVudENvbGxlY3Rpb24pID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpc0VtcHR5KHByZXZDb2xsZWN0aW9uKSAmJiBpc0VtcHR5KGN1cnJlbnRDb2xsZWN0aW9uKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gaWYgaXRlbSBpcyBuZXcgaW4gdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBidXQgbm90IGV4aXN0IGluIHRoZSBwcmV2IGNvbGxlY3Rpb25cbiAgICBjb25zdCBoYXNOZXdJdGVtID0gaGFzQ2hhbmdlKGN1cnJlbnRDb2xsZWN0aW9uLCBwcmV2Q29sbGVjdGlvbik7XG5cbiAgICBpZiAoaGFzTmV3SXRlbSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGlzT25lT2ZJdGVtUmVmZXJlbmNlQ2hhbmdlZCA9IGhhc0NoYW5nZShwcmV2Q29sbGVjdGlvbiwgY3VycmVudENvbGxlY3Rpb24pO1xuXG4gICAgLy8gcmV0dXJuIGZhbHNlIG1lYW5zIHRoZXJlIGlzIGEgY2hhbmdlIGFuZCB3ZSB3YW50IHRvIGNhbGwgbmV4dCgpXG4gICAgcmV0dXJuIGlzT25lT2ZJdGVtUmVmZXJlbmNlQ2hhbmdlZCA9PT0gZmFsc2U7XG4gIH0pO1xufVxuXG4vLyBAaW50ZXJuYWxcbmZ1bmN0aW9uIGhhc0NoYW5nZTxUPihmaXJzdDogVFtdLCBzZWNvbmQ6IFRbXSkge1xuICBjb25zdCBoYXNDaGFuZ2UgPSBzZWNvbmQuc29tZShjdXJyZW50SXRlbSA9PiB7XG4gICAgY29uc3Qgb2xkSXRlbSA9IGZpcnN0LmZpbmQocHJldkl0ZW0gPT4gcHJldkl0ZW0gPT09IGN1cnJlbnRJdGVtKTtcbiAgICByZXR1cm4gb2xkSXRlbSA9PT0gdW5kZWZpbmVkO1xuICB9KTtcblxuICByZXR1cm4gaGFzQ2hhbmdlO1xufVxuXG4vKipcbiAqIEZpbmQgaXRlbXMgaW4gYSBjb2xsZWN0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgc2VsZWN0RW50aXR5KDEsICdjb21tZW50cycpLnBpcGUoXG4gKiAgIGFycmF5RmluZChjb21tZW50ID0+IGNvbW1lbnQudGV4dCA9ICd0ZXh0JylcbiAqIClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5RmluZDxUPihpZHM6IEl0ZW1QcmVkaWNhdGU8VD4sIGlkS2V5PzogbmV2ZXIpOiAoc291cmNlOiBPYnNlcnZhYmxlPFRbXT4pID0+IE9ic2VydmFibGU8VFtdPjtcbi8qKlxuICogQGV4YW1wbGVcbiAqXG4gKiBzZWxlY3RFbnRpdHkoMSwgJ2NvbW1lbnRzJykucGlwZShcbiAqICAgYXJyYXlGaW5kKDMpXG4gKiApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUZpbmQ8VD4oaWRzOiBudW1iZXIsIGlkS2V5Pzogc3RyaW5nKTogKHNvdXJjZTogT2JzZXJ2YWJsZTxUW10+KSA9PiBPYnNlcnZhYmxlPFQ+O1xuLyoqXG4gKiBAZXhhbXBsZVxuICpcbiAqIHNlbGVjdEVudGl0eSgxLCAnY29tbWVudHMnKS5waXBlKFxuICogICBhcnJheUZpbmQoWzEsIDIsIDNdKVxuICogKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlGaW5kPFQ+KGlkczogbnVtYmVyW10sIGlkS2V5Pzogc3RyaW5nKTogKHNvdXJjZTogT2JzZXJ2YWJsZTxUW10+KSA9PiBPYnNlcnZhYmxlPFRbXT47XG5leHBvcnQgZnVuY3Rpb24gYXJyYXlGaW5kPFQ+KGlkc09yUHJlZGljYXRlOiBudW1iZXJbXSB8IG51bWJlciB8IEl0ZW1QcmVkaWNhdGU8VD4sIGlkS2V5Pzogc3RyaW5nKTogKHNvdXJjZTogT2JzZXJ2YWJsZTxUW10+KSA9PiBPYnNlcnZhYmxlPFRbXSB8IFQ+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZTogT2JzZXJ2YWJsZTxUW10+KSB7XG4gICAgcmV0dXJuIHNvdXJjZS5waXBlKFxuICAgICAgbWFwKChjb2xsZWN0aW9uOiBUW10gfCB1bmRlZmluZWQgfCBudWxsKSA9PiB7XG4gICAgICAgIC8vIHdoaWNoIG1lYW5zIHRoZSB1c2VyIGRlbGV0ZWQgdGhlIHJvb3QgZW50aXR5IG9yIHNldCB0aGUgY29sbGVjdGlvbiB0byBuaWxcbiAgICAgICAgaWYgKGlzQXJyYXkoY29sbGVjdGlvbikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmQoY29sbGVjdGlvbiwgaWRzT3JQcmVkaWNhdGUsIGlkS2V5IHx8IERFRkFVTFRfSURfS0VZKTtcbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbEFycmF5SXRlbUNoYW5nZWQoKSxcbiAgICAgIG1hcCh2YWx1ZSA9PiB7XG4gICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShpZHNPclByZWRpY2F0ZSkgfHwgaXNGdW5jdGlvbihpZHNPclByZWRpY2F0ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWVbMF07XG4gICAgICB9KVxuICAgICk7XG4gIH07XG59XG4iXX0=