@w11k/ngx-present
Version:
Angular based Presentation Tool
248 lines • 16.9 kB
JavaScript
/**
* @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