@datorama/akita
Version:
State Management Tailored-Made for JS Applications
139 lines • 12 kB
JavaScript
/**
* @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=