UNPKG

@w11k/ngx-present

Version:

Angular based Presentation Tool

294 lines 19.2 kB
/** * @fileoverview added by tsickle * Generated from: lib/core/utils.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __read, __spread, __values } from "tslib"; 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 {?} */ function (depth, val) { if (Array.isArray(val)) { /** @type {?} */ var 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) { var c = []; for (var _i = 2; _i < arguments.length; _i++) { c[_i - 2] = arguments[_i]; } /** @type {?} */ var values = __spread([a, b], c); return values.reduce((/** * @param {?} x * @param {?} y * @return {?} */ function (x, y) { return x > y ? y : x; })); } /** * @param {?} a * @param {?} b * @param {...?} c * @return {?} */ export function max(a, b) { var c = []; for (var _i = 2; _i < arguments.length; _i++) { c[_i - 2] = arguments[_i]; } /** @type {?} */ var values = __spread([a, b], c); return values.reduce((/** * @param {?} x * @param {?} y * @return {?} */ function (x, y) { return x > y ? x : y; })); } /** * @template T * @param {?} value * @param {?=} result * @return {?} */ export function flattenDeep(value, result) { var e_1, _a; if (result === void 0) { result = []; } try { for (var value_1 = __values(value), value_1_1 = value_1.next(); !value_1_1.done; value_1_1 = value_1.next()) { var element = value_1_1.value; if (Array.isArray(element)) { flattenDeep(element, result); } else { result.push(element); } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (value_1_1 && !value_1_1.done && (_a = value_1.return)) _a.call(value_1); } finally { if (e_1) throw e_1.error; } } return result; } /** * @template T, U * @param {?} level0 * @param {?} mapper * @return {?} */ export function mapDeep(level0, mapper) { return level0.map((/** * @param {?} level1 * @return {?} */ function (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 {?} */ var filtered = []; list.forEach((/** * @param {?} entry * @return {?} */ function (entry) { if (Array.isArray(entry)) { /** @type {?} */ var 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) { var e_2, _a, e_3, _b; var sources = []; for (var _i = 1; _i < arguments.length; _i++) { sources[_i - 1] = arguments[_i]; } /** @type {?} */ var target = {}; /** @type {?} */ var s1AndSources = __spread([s1], sources); try { for (var s1AndSources_1 = __values(s1AndSources), s1AndSources_1_1 = s1AndSources_1.next(); !s1AndSources_1_1.done; s1AndSources_1_1 = s1AndSources_1.next()) { var source = s1AndSources_1_1.value; if (source === undefined) { continue; } /** @type {?} */ var keys = Object.keys(source); try { for (var keys_1 = (e_3 = void 0, __values(keys)), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) { var key = keys_1_1.value; /** @type {?} */ var sourceVal = source[key]; /** @type {?} */ var targetVal = target[key]; /** @type {?} */ var targetIsObj = typeof targetVal === 'object' && Array.isArray(targetVal) === false; /** @type {?} */ var sourceIsObj = typeof sourceVal === 'object' && Array.isArray(sourceVal) === false; if (targetIsObj && sourceIsObj) { /** @type {?} */ var merged = mergeDeep(targetVal, sourceVal); target[key] = merged; } else if (source.hasOwnProperty(key)) { target[key] = sourceVal; } } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (keys_1_1 && !keys_1_1.done && (_b = keys_1.return)) _b.call(keys_1); } finally { if (e_3) throw e_3.error; } } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (s1AndSources_1_1 && !s1AndSources_1_1.done && (_a = s1AndSources_1.return)) _a.call(s1AndSources_1); } finally { if (e_2) throw e_2.error; } } return target; } /** * @template T * @param {?} list * @return {?} */ export function flattenDelayedWithAnimationFrame(list) { /** @type {?} */ var flatList = flattenDeep(list); /** @type {?} */ var observable = new Observable((/** * @param {?} subscriber * @return {?} */ function (subscriber) { /** @type {?} */ var k = 5; /** @type {?} */ var i = k; /** @type {?} */ var next = (/** * @return {?} */ function () { subscriber.next(flatList.slice(0, i)); i = i + k; if (i > flatList.length) { cancelAnimationFrame(frame); subscriber.complete(); } else { frame = requestAnimationFrame(next); } }); /** @type {?} */ var 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 {?} */ function (x) { if (Array.isArray(x)) { return recursive(x, depth_ - 1); } return x; })) .filter((/** * @param {?} x * @return {?} */ function (x) { return (Array.isArray(x) && x.length === 0) === false; })); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdzExay9uZ3gtcHJlc2VudC8iLCJzb3VyY2VzIjpbImxpYi9jb3JlL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQUVsQyxNQUFNLFVBQVUsUUFBUSxDQUFJLElBQXNDO0lBQ2hFLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDckIsT0FBTyxDQUFDLENBQUM7S0FDVjs7Ozs7O0lBRUQsU0FBUyxTQUFTLENBQUMsS0FBdUMsRUFBRSxZQUFvQjtRQUM5RSxPQUFPLEtBQUssQ0FBQyxNQUFNOzs7OztRQUFDLFVBQUMsS0FBSyxFQUFFLEdBQUc7WUFDN0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFOztvQkFDaEIsUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxHQUFHLENBQUMsQ0FBQztnQkFDakQsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzdCO1lBRUQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLEdBQUUsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQzs7Ozs7OztBQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFBRSxXQUFjO1NBQWQsVUFBYyxFQUFkLHFCQUFjLEVBQWQsSUFBYztRQUFkLDBCQUFjOzs7UUFDaEQsTUFBTSxhQUFJLENBQUMsRUFBRSxDQUFDLEdBQUssQ0FBQyxDQUFDO0lBQzNCLE9BQU8sTUFBTSxDQUFDLE1BQU07Ozs7O0lBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FB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RUFBRSxDQUFDO2FBQ3ZCO2lCQUFNO2dCQUNMLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNyQztRQUNILENBQUMsQ0FBQTs7WUFFRyxLQUFLLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDO0lBQ3pDLENBQUMsRUFBQztJQUVGLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7Ozs7Ozs7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFJLElBQXNDLEVBQUUsS0FBeUI7SUFDN0YsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDcEMsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzs7Ozs7O0lBRTlCLFNBQVMsU0FBUyxDQUFDLEtBQXVDLEVBQUUsTUFBYztRQUN4RSxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDaEIsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELE9BQU8sS0FBSzthQUNULEdBQUc7Ozs7UUFBQyxVQUFBLENBQUM7WUFDSixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BCLE9BQU8sU0FBUyxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDakM7WUFFRCxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUMsRUFBQzthQUNELE1BQU07Ozs7UUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBOUMsQ0FBOEMsRUFBQyxDQUFDO0lBQ2pFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4RGVwdGg8VD4obGlzdDogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4pOiBudW1iZXIge1xuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY3Vyc2l2ZSh2YWx1ZTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4sIGN1cnJlbnREZXB0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdmFsdWUucmVkdWNlKChkZXB0aCwgdmFsKSA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGNvbnN0IG5ld0RlcHRoID0gcmVjdXJzaXZlKHZhbCwgY3VycmVudERlcHRoICsgMSk7XG4gICAgICAgIHJldHVybiBtYXgobmV3RGVwdGgsIGRlcHRoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlcHRoO1xuICAgIH0sIGN1cnJlbnREZXB0aCArIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJlY3Vyc2l2ZShsaXN0LCAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihhOiBudW1iZXIsIGI6IG51bWJlciwgLi4uYzogbnVtYmVyW10pOiBudW1iZXIge1xuICBjb25zdCB2YWx1ZXMgPSBbYSwgYiwgLi4uY107XG4gIHJldHVybiB2YWx1ZXMucmVkdWNlKCh4LCB5KSA9PiB4ID4geSA/IHkgOiB4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1heChhOiBudW1iZXIsIGI6IG51bWJlciwgLi4uYzogbnVtYmVyW10pOiBudW1iZXIge1xuICBjb25zdCB2YWx1ZXMgPSBbYSwgYiwgLi4uY107XG4gIHJldHVybiB2YWx1ZXMucmVkdWNlKCh4LCB5KSA9PiB4ID4geSA/IHggOiB5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5EZWVwPFQ+KHZhbHVlOiBMaXN0T2ZSZWN1cnNpdmVBcnJheXNPclZhbHVlczxUPiwgcmVzdWx0OiBUW10gPSBbXSk6IFRbXSB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiB2YWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgICBmbGF0dGVuRGVlcChlbGVtZW50LCByZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaChlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwRGVlcDxULCBVPihsZXZlbDA6IExpc3RPZlJlY3Vyc2l2ZUFycmF5c09yVmFsdWVzPFQ+LCBtYXBwZXI6ICh4OiBUKSA9PiBVKTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VT4ge1xuICByZXR1cm4gbGV2ZWwwLm1hcChsZXZlbDEgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxldmVsMSkpIHtcbiAgICAgIHJldHVybiBtYXBEZWVwKGxldmVsMSwgbWFwcGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1hcHBlcihsZXZlbDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJEZWVwPFQ+KGxpc3Q6IExpc3RPZlJlY3Vyc2l2ZUFycmF5c09yVmFsdWVzPFQ+LCBwcmVkaWNhdGU6ICh4OiBUKSA9PiBib29sZWFuKTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4ge1xuICBjb25zdCBmaWx0ZXJlZDogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4gPSBbXTtcblxuICBsaXN0LmZvckVhY2goZW50cnkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgY29uc3QgbmVzdGVkRmlsdGVyZWQgPSBmaWx0ZXJEZWVwKGVudHJ5LCBwcmVkaWNhdGUpO1xuXG4gICAgICBpZiAobmVzdGVkRmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBmaWx0ZXJlZC5wdXNoKG5lc3RlZEZpbHRlcmVkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByZWRpY2F0ZShlbnRyeSkpIHtcbiAgICAgIGZpbHRlcmVkLnB1c2goZW50cnkpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEZWVwPFMxIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgUzIgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IGFueSB9PihzMTogUzEsIC4uLnNvdXJjZXM6IFMyW10pOiBTMSAmIFMyIHtcbiAgY29uc3QgdGFyZ2V0OiBhbnkgPSB7fTtcblxuICBjb25zdCBzMUFuZFNvdXJjZXMgPSBbczEsIC4uLnNvdXJjZXNdO1xuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIHMxQW5kU291cmNlcykge1xuICAgIGlmIChzb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3Qgc291cmNlVmFsID0gc291cmNlW2tleV07XG4gICAgICBjb25zdCB0YXJnZXRWYWwgPSB0YXJnZXRba2V5XTtcblxuICAgICAgY29uc3QgdGFyZ2V0SXNPYmogPSB0eXBlb2YgdGFyZ2V0VmFsID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHRhcmdldFZhbCkgPT09IGZhbHNlO1xuICAgICAgY29uc3Qgc291cmNlSXNPYmogPSB0eXBlb2Ygc291cmNlVmFsID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHNvdXJjZVZhbCkgPT09IGZhbHNlO1xuXG4gICAgICBpZiAodGFyZ2V0SXNPYmogJiYgc291cmNlSXNPYmopIHtcbiAgICAgICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VEZWVwKHRhcmdldFZhbCwgc291cmNlVmFsKTtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBtZXJnZWQ7XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlVmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuRGVsYXllZFdpdGhBbmltYXRpb25GcmFtZTxUPihsaXN0OiBMaXN0T2ZSZWN1cnNpdmVBcnJheXNPclZhbHVlczxUPik6IE9ic2VydmFibGU8VFtdPiB7XG4gIGNvbnN0IGZsYXRMaXN0ID0gZmxhdHRlbkRlZXAobGlzdCk7XG5cbiAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPFRbXT4oKHN1YnNjcmliZXIpID0+IHtcbiAgICBjb25zdCBrID0gNTtcbiAgICBsZXQgaSA9IGs7XG5cbiAgICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgICAgc3Vic2NyaWJlci5uZXh0KGZsYXRMaXN0LnNsaWNlKDAsIGkpKTtcbiAgICAgIGkgPSBpICsgaztcblxuICAgICAgaWYgKGkgPiBmbGF0TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoZnJhbWUpO1xuICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShuZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IGZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG5leHQpO1xuICB9KTtcblxuICByZXR1cm4gb2JzZXJ2YWJsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbWl0RGVwdGg8VD4obGlzdDogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4sIGRlcHRoOiBudW1iZXIgfCB1bmRlZmluZWQpOiBMaXN0T2ZSZWN1cnNpdmVBcnJheXNPclZhbHVlczxUPiB7XG4gIGlmIChkZXB0aCA9PT0gdW5kZWZpbmVkIHx8wqBkZXB0aCA8IDApIHtcbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIHJldHVybiByZWN1cnNpdmUobGlzdCwgZGVwdGgpO1xuXG4gIGZ1bmN0aW9uIHJlY3Vyc2l2ZSh2YWx1ZTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4sIGRlcHRoXzogbnVtYmVyKTogTGlzdE9mUmVjdXJzaXZlQXJyYXlzT3JWYWx1ZXM8VD4ge1xuICAgIGlmIChkZXB0aF8gPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgICAgIC5tYXAoeCA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICAgICAgcmV0dXJuIHJlY3Vyc2l2ZSh4LCBkZXB0aF8gLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoeCA9PiAoQXJyYXkuaXNBcnJheSh4KSAmJiB4Lmxlbmd0aCA9PT0gMCkgPT09IGZhbHNlKTtcbiAgfVxufVxuIl19