UNPKG

@w11k/ngx-present

Version:

Angular based Presentation Tool

248 lines 16.9 kB
/** * @fileoverview added by tsickle * Generated from: lib/core/utils.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Observable } from 'rxjs'; /** * @template T * @param {?} list * @return {?} */ export function maxDepth(list) { if (list.length === 0) { return 0; } /** * @param {?} value * @param {?} currentDepth * @return {?} */ function recursive(value, currentDepth) { return value.reduce((/** * @param {?} depth * @param {?} val * @return {?} */ (depth, val) => { if (Array.isArray(val)) { /** @type {?} */ const newDepth = recursive(val, currentDepth + 1); return max(newDepth, depth); } return depth; }), currentDepth + 1); } return recursive(list, 0); } /** * @param {?} a * @param {?} b * @param {...?} c * @return {?} */ export function min(a, b, ...c) { /** @type {?} */ const values = [a, b, ...c]; return values.reduce((/** * @param {?} x * @param {?} y * @return {?} */ (x, y) => x > y ? y : x)); } /** * @param {?} a * @param {?} b * @param {...?} c * @return {?} */ export function max(a, b, ...c) { /** @type {?} */ const values = [a, b, ...c]; return values.reduce((/** * @param {?} x * @param {?} y * @return {?} */ (x, y) => x > y ? x : y)); } /** * @template T * @param {?} value * @param {?=} result * @return {?} */ export function flattenDeep(value, result = []) { for (const element of value) { if (Array.isArray(element)) { flattenDeep(element, result); } else { result.push(element); } } return result; } /** * @template T, U * @param {?} level0 * @param {?} mapper * @return {?} */ export function mapDeep(level0, mapper) { return level0.map((/** * @param {?} level1 * @return {?} */ level1 => { if (Array.isArray(level1)) { return mapDeep(level1, mapper); } else { return mapper(level1); } })); } /** * @template T * @param {?} list * @param {?} predicate * @return {?} */ export function filterDeep(list, predicate) { /** @type {?} */ const filtered = []; list.forEach((/** * @param {?} entry * @return {?} */ entry => { if (Array.isArray(entry)) { /** @type {?} */ const nestedFiltered = filterDeep(entry, predicate); if (nestedFiltered.length > 0) { filtered.push(nestedFiltered); } } else if (predicate(entry)) { filtered.push(entry); } })); return filtered; } /** * @template S1, S2 * @param {?} s1 * @param {...?} sources * @return {?} */ export function mergeDeep(s1, ...sources) { /** @type {?} */ const target = {}; /** @type {?} */ const s1AndSources = [s1, ...sources]; for (const source of s1AndSources) { if (source === undefined) { continue; } /** @type {?} */ const keys = Object.keys(source); for (const key of keys) { /** @type {?} */ const sourceVal = source[key]; /** @type {?} */ const targetVal = target[key]; /** @type {?} */ const targetIsObj = typeof targetVal === 'object' && Array.isArray(targetVal) === false; /** @type {?} */ const sourceIsObj = typeof sourceVal === 'object' && Array.isArray(sourceVal) === false; if (targetIsObj && sourceIsObj) { /** @type {?} */ const merged = mergeDeep(targetVal, sourceVal); target[key] = merged; } else if (source.hasOwnProperty(key)) { target[key] = sourceVal; } } } return target; } /** * @template T * @param {?} list * @return {?} */ export function flattenDelayedWithAnimationFrame(list) { /** @type {?} */ const flatList = flattenDeep(list); /** @type {?} */ const observable = new Observable((/** * @param {?} subscriber * @return {?} */ (subscriber) => { /** @type {?} */ const k = 5; /** @type {?} */ let i = k; /** @type {?} */ const next = (/** * @return {?} */ () => { subscriber.next(flatList.slice(0, i)); i = i + k; if (i > flatList.length) { cancelAnimationFrame(frame); subscriber.complete(); } else { frame = requestAnimationFrame(next); } }); /** @type {?} */ let frame = requestAnimationFrame(next); })); return observable; } /** * @template T * @param {?} list * @param {?} depth * @return {?} */ export function limitDepth(list, depth) { if (depth === undefined || depth < 0) { return list; } return recursive(list, depth); /** * @param {?} value * @param {?} depth_ * @return {?} */ function recursive(value, depth_) { if (depth_ === 0) { return []; } return value .map((/** * @param {?} x * @return {?} */ x => { if (Array.isArray(x)) { return recursive(x, depth_ - 1); } return x; })) .filter((/** * @param {?} x * @return {?} */ x => (Array.isArray(x) && x.length === 0) === false)); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdzExay9uZ3gtcHJlc2VudC8iLCJzb3VyY2VzIjpbImxpYi9jb3JlL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBRWxDLE1BQU0sVUFBVSxRQUFRLENBQUksSUFBc0M7SUFDaEUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNyQixPQUFPLENBQUMsQ0FBQztLQUNWOzs7Ozs7SUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUF1QyxFQUFFLFlBQW9CO1FBQzlFLE9BQU8sS0FBSyxDQUFDLE1BQU07Ozs7O1FBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDakMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFOztzQkFDaEIsUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxHQUFHLENBQUMsQ0FBQztnQkFDakQsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzdCO1lBRUQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLEdBQUUsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQzs7Ozs7OztBQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxHQUFHLENBQVc7O1VBQ2hELE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0IsT0FBTyxNQUFNLENBQUMsTUFBTTs7Ozs7SUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENB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SyxLQUFLLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1FBQ3BDLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Ozs7OztJQUU5QixTQUFTLFNBQVMsQ0FBQyxLQUF1QyxFQUFFLE1BQWM7UUFDeEUsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2hCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxPQUFPLEtBQUs7YUFDVCxHQUFHOzs7O1FBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDUCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BCLE9BQU8sU0FBUyxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDakM7WUFFRCxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUMsRUFBQzthQUNELE1BQU07Ozs7UUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBQyxDQUFDO0lBQ2pFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4RGVwdGg8VD4obGlzdDogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4pOiBudW1iZXIge1xuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2l2ZSh2YWx1ZTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4sIGN1cnJlbnREZXB0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdmFsdWUucmVkdWNlKChkZXB0aCwgdmFsKSA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGNvbnN0IG5ld0RlcHRoID0gcmVjdXJzaXZlKHZhbCwgY3VycmVudERlcHRoICsgMSk7XG4gICAgICAgIHJldHVybiBtYXgobmV3RGVwdGgsIGRlcHRoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlcHRoO1xuICAgIH0sIGN1cnJlbnREZXB0aCArIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJlY3Vyc2l2ZShsaXN0LCAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihhOiBudW1iZXIsIGI6IG51bWJlciwgLi4uYzogbnVtYmVyW10pOiBudW1iZXIge1xuICBjb25zdCB2YWx1ZXMgPSBbYSwgYiwgLi4uY107XG4gIHJldHVybiB2YWx1ZXMucmVkdWNlKCh4LCB5KSA9PiB4ID4geSA/IHkgOiB4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1heChhOiBudW1iZXIsIGI6IG51bWJlciwgLi4uYzogbnVtYmVyW10pOiBudW1iZXIge1xuICBjb25zdCB2YWx1ZXMgPSBbYSwgYiwgLi4uY107XG4gIHJldHVybiB2YWx1ZXMucmVkdWNlKCh4LCB5KSA9PiB4ID4geSA/IHggOiB5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5EZWVwPFQ+KHZhbHVlOiBMaXN0T2ZSZWN1cnNpdmVBcnJheXNPclZhbHVlczxUPiwgcmVzdWx0OiBUW10gPSBbXSk6IFRbXSB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiB2YWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgICBmbGF0dGVuRGVlcChlbGVtZW50LCByZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaChlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwRGVlcDxULCBVPihsZXZlbDA6IExpc3RPZlJlY3Vyc2l2ZUFycmF5c09yVmFsdWVzPFQ+LCBtYXBwZXI6ICh4OiBUKSA9PiBVKTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VT4ge1xuICByZXR1cm4gbGV2ZWwwLm1hcChsZXZlbDEgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxldmVsMSkpIHtcbiAgICAgIHJldHVybiBtYXBEZWVwKGxldmVsMSwgbWFwcGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1hcHBlcihsZXZlbDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJEZWVwPFQ+KGxpc3Q6IExpc3RPZlJlY3Vyc2l2ZUFycmF5c09yVmFsdWVzPFQ+LCBwcmVkaWNhdGU6ICh4OiBUKSA9PiBib29sZWFuKTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4ge1xuICBjb25zdCBmaWx0ZXJlZDogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4gPSBbXTtcblxuICBsaXN0LmZvckVhY2goZW50cnkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgY29uc3QgbmVzdGVkRmlsdGVyZWQgPSBmaWx0ZXJEZWVwKGVudHJ5LCBwcmVkaWNhdGUpO1xuXG4gICAgICBpZiAobmVzdGVkRmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBmaWx0ZXJlZC5wdXNoKG5lc3RlZEZpbHRlcmVkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByZWRpY2F0ZShlbnRyeSkpIHtcbiAgICAgIGZpbHRlcmVkLnB1c2goZW50cnkpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEZWVwPFMxIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgUzIgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IGFueSB9PihzMTogUzEsIC4uLnNvdXJjZXM6IFMyW10pOiBTMSAmIFMyIHtcbiAgY29uc3QgdGFyZ2V0OiBhbnkgPSB7fTtcblxuICBjb25zdCBzMUFuZFNvdXJjZXMgPSBbczEsIC4uLnNvdXJjZXNdO1xuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIHMxQW5kU291cmNlcykge1xuICAgIGlmIChzb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3Qgc291cmNlVmFsID0gc291cmNlW2tleV07XG4gICAgICBjb25zdCB0YXJnZXRWYWwgPSB0YXJnZXRba2V5XTtcblxuICAgICAgY29uc3QgdGFyZ2V0SXNPYmogPSB0eXBlb2YgdGFyZ2V0VmFsID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHRhcmdldFZhbCkgPT09IGZhbHNlO1xuICAgICAgY29uc3Qgc291cmNlSXNPYmogPSB0eXBlb2Ygc291cmNlVmFsID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHNvdXJjZVZhbCkgPT09IGZhbHNlO1xuXG4gICAgICBpZiAodGFyZ2V0SXNPYmogJiYgc291cmNlSXNPYmopIHtcbiAgICAgICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VEZWVwKHRhcmdldFZhbCwgc291cmNlVmFsKTtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBtZXJnZWQ7XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlVmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuRGVsYXllZFdpdGhBbmltYXRpb25GcmFtZTxUPihsaXN0OiBMaXN0T2ZSZWN1cnNpdmVBcnJheXNPclZhbHVlczxUPik6IE9ic2VydmFibGU8VFtdPiB7XG4gIGNvbnN0IGZsYXRMaXN0ID0gZmxhdHRlbkRlZXAobGlzdCk7XG5cbiAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPFRbXT4oKHN1YnNjcmliZXIpID0+IHtcbiAgICBjb25zdCBrID0gNTtcbiAgICBsZXQgaSA9IGs7XG5cbiAgICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgICAgc3Vic2NyaWJlci5uZXh0KGZsYXRMaXN0LnNsaWNlKDAsIGkpKTtcbiAgICAgIGkgPSBpICsgaztcblxuICAgICAgaWYgKGkgPiBmbGF0TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoZnJhbWUpO1xuICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShuZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IGZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG5leHQpO1xuICB9KTtcblxuICByZXR1cm4gb2JzZXJ2YWJsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbWl0RGVwdGg8VD4obGlzdDogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4sIGRlcHRoOiBudW1iZXIgfCB1bmRlZmluZWQpOiBMaXN0T2ZSZWN1cnNpdmVBcnJheXNPclZhbHVlczxUPiB7XG4gIGlmIChkZXB0aCA9PT0gdW5kZWZpbmVkIHx8wqBkZXB0aCA8IDApIHtcbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIHJldHVybiByZWN1cnNpdmUobGlzdCwgZGVwdGgpO1xuXG4gIGZ1bmN0aW9uIHJlY3Vyc2l2ZSh2YWx1ZTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4sIGRlcHRoXzogbnVtYmVyKTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4ge1xuICAgIGlmIChkZXB0aF8gPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgICAgIC5tYXAoeCA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICAgICAgcmV0dXJuIHJlY3Vyc2l2ZSh4LCBkZXB0aF8gLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoeCA9PiAoQXJyYXkuaXNBcnJheSh4KSAmJiB4Lmxlbmd0aCA9PT0gMCkgPT09IGZhbHNlKTtcbiAgfVxufVxuIl19