@ngutil/data 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,67 @@
1
+ export function groupBy(grouper) {
2
+ return grouperCompile(grouper);
3
+ }
4
+ function grouperCompile(grouper) {
5
+ return _ => undefined;
6
+ }
7
+ export function grouperMerge(...groupers) {
8
+ return undefined;
9
+ }
10
+ // import { Primitive } from "utility-types"
11
+ // import { Eval, Flatten } from "@ngutil/common"
12
+ // import { type Model } from "./query"
13
+ // import { SorterFn } from "./sorter"
14
+ // export interface Grouped<T extends Model> {
15
+ // items: T[]
16
+ // groups: Group<T>
17
+ // }
18
+ // export type GrouperFn<T extends Model> = (items: T[]) => any
19
+ // export type GroupKey<T extends Model> = (item: T, index: number) => Primitive[]
20
+ // export type GroupItemIsMatch<T extends Model> = (item: T, index: number) => boolean
21
+ // export interface GrouperX<T extends Model> {
22
+ // name: string
23
+ // title?: string
24
+ // isMatch?: GroupKey<T>
25
+ // [key: string]: any
26
+ // }
27
+ // export interface GrouperXNormalized<T extends Model> extends GrouperX<T> {
28
+ // key: GroupKey<T>
29
+ // }
30
+ // type _Groupers<T extends Model, F> = keyof F | Grouper<T>
31
+ // export type Grouper<T extends Model, F = Flatten<T>> = Eval<Array<_Groupers<T, F>>>
32
+ // export type GrouperNormalized<T extends Model> = { [key: string]: GrouperXNormalized<T> }
33
+ // export interface Group<T extends Model, G extends Grouper<T> = Grouper<T>> {
34
+ // grouper: G
35
+ // begin: number
36
+ // end: number
37
+ // }
38
+ // /**
39
+ // * @example
40
+ // * ```ts
41
+ // * const grouped = groupBy(["status"])(items)
42
+ // * // expexted: {[status]: [...items]}
43
+ // *
44
+ // * const grouped = groupBy(["name", "age"])(items)
45
+ // * // expected {[status]: {[age]: [...items]}}
46
+ // *
47
+ // * const STATUS_LABELS = {active: "Active", inactive: "Inactive"}
48
+ // * const grouped = groupBy([(item) => (STATUS_LABELS[item.status] || "Undefined")])(items)
49
+ // * // expected {["Active" | "Inactive" | "Undefined"]: [...items]}
50
+ // *
51
+ // * const grouped = groupBy([(item) => (STATUS_LABELS[item.status] || "Undefined"), "age"])(items)
52
+ // * // expected {["Active" | "Inactive" | "Undefined"]: {[age]: [...items]}}
53
+ // * ```
54
+ // */
55
+ // export function groupBy<T extends Model>(groupers: Grouper<T>): SorterFn<T> {
56
+ // return (_a, _b) => 0
57
+ // }
58
+ // export function grouperNormalize() {}
59
+ // export function grouperCompile<T extends Model>(groupers: Grouper<T>): GrouperFn<T> {
60
+ // return _ => undefined
61
+ // }
62
+ // export function grouperMerge<T extends Model, F = Flatten<T>>(
63
+ // ...groupers: Array<Grouper<T, F> | undefined | null>
64
+ // ): Grouper<T, F> | undefined {
65
+ // return undefined
66
+ // }
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RhdGEvc3JjL3F1ZXJ5L2dyb3VwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsTUFBTSxVQUFVLE9BQU8sQ0FBa0MsT0FBc0I7SUFDM0UsT0FBTyxjQUFjLENBQU8sT0FBTyxDQUFDLENBQUE7QUFDeEMsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFrQyxPQUFzQjtJQUMzRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFBO0FBQ3pCLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUN4QixHQUFHLFFBQWlEO0lBRXBELE9BQU8sU0FBUyxDQUFBO0FBQ3BCLENBQUM7QUFFRCw0Q0FBNEM7QUFFNUMsaURBQWlEO0FBRWpELHVDQUF1QztBQUN2QyxzQ0FBc0M7QUFFdEMsOENBQThDO0FBQzlDLGlCQUFpQjtBQUNqQix1QkFBdUI7QUFDdkIsSUFBSTtBQUVKLCtEQUErRDtBQUUvRCxrRkFBa0Y7QUFFbEYsc0ZBQXNGO0FBRXRGLCtDQUErQztBQUMvQyxtQkFBbUI7QUFDbkIscUJBQXFCO0FBQ3JCLDRCQUE0QjtBQUM1Qix5QkFBeUI7QUFDekIsSUFBSTtBQUVKLDZFQUE2RTtBQUM3RSx1QkFBdUI7QUFDdkIsSUFBSTtBQUVKLDREQUE0RDtBQUM1RCxzRkFBc0Y7QUFFdEYsNEZBQTRGO0FBRTVGLCtFQUErRTtBQUMvRSxpQkFBaUI7QUFDakIsb0JBQW9CO0FBQ3BCLGtCQUFrQjtBQUNsQixJQUFJO0FBRUosTUFBTTtBQUNOLGNBQWM7QUFDZCxXQUFXO0FBQ1gsZ0RBQWdEO0FBQ2hELHlDQUF5QztBQUN6QyxLQUFLO0FBQ0wscURBQXFEO0FBQ3JELGlEQUFpRDtBQUNqRCxLQUFLO0FBQ0wsb0VBQW9FO0FBQ3BFLDZGQUE2RjtBQUM3RixxRUFBcUU7QUFDckUsS0FBSztBQUNMLG9HQUFvRztBQUNwRyw4RUFBOEU7QUFDOUUsU0FBUztBQUNULE1BQU07QUFDTixnRkFBZ0Y7QUFDaEYsMkJBQTJCO0FBQzNCLElBQUk7QUFFSix3Q0FBd0M7QUFFeEMsd0ZBQXdGO0FBQ3hGLDRCQUE0QjtBQUM1QixJQUFJO0FBRUosaUVBQWlFO0FBQ2pFLDJEQUEyRDtBQUMzRCxpQ0FBaUM7QUFDakMsdUJBQXVCO0FBQ3ZCLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGbGF0dGVuLCBQcmltaXRpdmUgfSBmcm9tIFwiQG5ndXRpbC9jb21tb25cIlxuXG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbFwiXG5cbmV4cG9ydCB0eXBlIEdyb3VwZXJGbjxUID0gYW55PiA9IChpdGVtOiBhbnkpID0+IFByaW1pdGl2ZVxuXG5leHBvcnQgdHlwZSBHcm91cGVyPFQgZXh0ZW5kcyBNb2RlbCwgRiA9IEZsYXR0ZW48VD4+ID0gYW55XG5cbmV4cG9ydCBmdW5jdGlvbiBncm91cEJ5PFQgZXh0ZW5kcyBNb2RlbCwgRiA9IEZsYXR0ZW48VD4+KGdyb3VwZXI6IEdyb3VwZXI8VCwgRj4pOiBHcm91cGVyRm48VD4ge1xuICAgIHJldHVybiBncm91cGVyQ29tcGlsZTxULCBGPihncm91cGVyKVxufVxuXG5mdW5jdGlvbiBncm91cGVyQ29tcGlsZTxUIGV4dGVuZHMgTW9kZWwsIEYgPSBGbGF0dGVuPFQ+Pihncm91cGVyOiBHcm91cGVyPFQsIEY+KTogR3JvdXBlckZuPFQ+IHtcbiAgICByZXR1cm4gXyA9PiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwZXJNZXJnZTxUIGV4dGVuZHMgTW9kZWwsIEYgPSBGbGF0dGVuPFQ+PihcbiAgICAuLi5ncm91cGVyczogQXJyYXk8R3JvdXBlcjxULCBGPiB8IHVuZGVmaW5lZCB8IG51bGw+XG4pOiBHcm91cGVyPFQsIEY+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8vIGltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCJ1dGlsaXR5LXR5cGVzXCJcblxuLy8gaW1wb3J0IHsgRXZhbCwgRmxhdHRlbiB9IGZyb20gXCJAbmd1dGlsL2NvbW1vblwiXG5cbi8vIGltcG9ydCB7IHR5cGUgTW9kZWwgfSBmcm9tIFwiLi9xdWVyeVwiXG4vLyBpbXBvcnQgeyBTb3J0ZXJGbiB9IGZyb20gXCIuL3NvcnRlclwiXG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgR3JvdXBlZDxUIGV4dGVuZHMgTW9kZWw+IHtcbi8vICAgICBpdGVtczogVFtdXG4vLyAgICAgZ3JvdXBzOiBHcm91cDxUPlxuLy8gfVxuXG4vLyBleHBvcnQgdHlwZSBHcm91cGVyRm48VCBleHRlbmRzIE1vZGVsPiA9IChpdGVtczogVFtdKSA9PiBhbnlcblxuLy8gZXhwb3J0IHR5cGUgR3JvdXBLZXk8VCBleHRlbmRzIE1vZGVsPiA9IChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBQcmltaXRpdmVbXVxuXG4vLyBleHBvcnQgdHlwZSBHcm91cEl0ZW1Jc01hdGNoPFQgZXh0ZW5kcyBNb2RlbD4gPSAoaXRlbTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhblxuXG4vLyBleHBvcnQgaW50ZXJmYWNlIEdyb3VwZXJYPFQgZXh0ZW5kcyBNb2RlbD4ge1xuLy8gICAgIG5hbWU6IHN0cmluZ1xuLy8gICAgIHRpdGxlPzogc3RyaW5nXG4vLyAgICAgaXNNYXRjaD86IEdyb3VwS2V5PFQ+XG4vLyAgICAgW2tleTogc3RyaW5nXTogYW55XG4vLyB9XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgR3JvdXBlclhOb3JtYWxpemVkPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBHcm91cGVyWDxUPiB7XG4vLyAgICAga2V5OiBHcm91cEtleTxUPlxuLy8gfVxuXG4vLyB0eXBlIF9Hcm91cGVyczxUIGV4dGVuZHMgTW9kZWwsIEY+ID0ga2V5b2YgRiB8IEdyb3VwZXI8VD5cbi8vIGV4cG9ydCB0eXBlIEdyb3VwZXI8VCBleHRlbmRzIE1vZGVsLCBGID0gRmxhdHRlbjxUPj4gPSBFdmFsPEFycmF5PF9Hcm91cGVyczxULCBGPj4+XG5cbi8vIGV4cG9ydCB0eXBlIEdyb3VwZXJOb3JtYWxpemVkPFQgZXh0ZW5kcyBNb2RlbD4gPSB7IFtrZXk6IHN0cmluZ106IEdyb3VwZXJYTm9ybWFsaXplZDxUPiB9XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgR3JvdXA8VCBleHRlbmRzIE1vZGVsLCBHIGV4dGVuZHMgR3JvdXBlcjxUPiA9IEdyb3VwZXI8VD4+IHtcbi8vICAgICBncm91cGVyOiBHXG4vLyAgICAgYmVnaW46IG51bWJlclxuLy8gICAgIGVuZDogbnVtYmVyXG4vLyB9XG5cbi8vIC8qKlxuLy8gICogQGV4YW1wbGVcbi8vICAqIGBgYHRzXG4vLyAgKiBjb25zdCBncm91cGVkID0gZ3JvdXBCeShbXCJzdGF0dXNcIl0pKGl0ZW1zKVxuLy8gICogLy8gZXhwZXh0ZWQ6IHtbc3RhdHVzXTogWy4uLml0ZW1zXX1cbi8vICAqXG4vLyAgKiBjb25zdCBncm91cGVkID0gZ3JvdXBCeShbXCJuYW1lXCIsIFwiYWdlXCJdKShpdGVtcylcbi8vICAqIC8vIGV4cGVjdGVkIHtbc3RhdHVzXToge1thZ2VdOiBbLi4uaXRlbXNdfX1cbi8vICAqXG4vLyAgKiBjb25zdCBTVEFUVVNfTEFCRUxTID0ge2FjdGl2ZTogXCJBY3RpdmVcIiwgaW5hY3RpdmU6IFwiSW5hY3RpdmVcIn1cbi8vICAqIGNvbnN0IGdyb3VwZWQgPSBncm91cEJ5KFsoaXRlbSkgPT4gKFNUQVRVU19MQUJFTFNbaXRlbS5zdGF0dXNdIHx8IFwiVW5kZWZpbmVkXCIpXSkoaXRlbXMpXG4vLyAgKiAvLyBleHBlY3RlZCB7W1wiQWN0aXZlXCIgfCBcIkluYWN0aXZlXCIgfCBcIlVuZGVmaW5lZFwiXTogWy4uLml0ZW1zXX1cbi8vICAqXG4vLyAgKiBjb25zdCBncm91cGVkID0gZ3JvdXBCeShbKGl0ZW0pID0+IChTVEFUVVNfTEFCRUxTW2l0ZW0uc3RhdHVzXSB8fCBcIlVuZGVmaW5lZFwiKSwgXCJhZ2VcIl0pKGl0ZW1zKVxuLy8gICogLy8gZXhwZWN0ZWQge1tcIkFjdGl2ZVwiIHwgXCJJbmFjdGl2ZVwiIHwgXCJVbmRlZmluZWRcIl06IHtbYWdlXTogWy4uLml0ZW1zXX19XG4vLyAgKiBgYGBcbi8vICAqL1xuLy8gZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnk8VCBleHRlbmRzIE1vZGVsPihncm91cGVyczogR3JvdXBlcjxUPik6IFNvcnRlckZuPFQ+IHtcbi8vICAgICByZXR1cm4gKF9hLCBfYikgPT4gMFxuLy8gfVxuXG4vLyBleHBvcnQgZnVuY3Rpb24gZ3JvdXBlck5vcm1hbGl6ZSgpIHt9XG5cbi8vIGV4cG9ydCBmdW5jdGlvbiBncm91cGVyQ29tcGlsZTxUIGV4dGVuZHMgTW9kZWw+KGdyb3VwZXJzOiBHcm91cGVyPFQ+KTogR3JvdXBlckZuPFQ+IHtcbi8vICAgICByZXR1cm4gXyA9PiB1bmRlZmluZWRcbi8vIH1cblxuLy8gZXhwb3J0IGZ1bmN0aW9uIGdyb3VwZXJNZXJnZTxUIGV4dGVuZHMgTW9kZWwsIEYgPSBGbGF0dGVuPFQ+Pihcbi8vICAgICAuLi5ncm91cGVyczogQXJyYXk8R3JvdXBlcjxULCBGPiB8IHVuZGVmaW5lZCB8IG51bGw+XG4vLyApOiBHcm91cGVyPFQsIEY+IHwgdW5kZWZpbmVkIHtcbi8vICAgICByZXR1cm4gdW5kZWZpbmVkXG4vLyB9XG4iXX0=
@@ -0,0 +1,8 @@
1
+ export { filterBy, filterMerge } from "./filter";
2
+ export { groupBy, grouperMerge } from "./grouper";
3
+ export { sortBy, sorterMerge } from "./sorter";
4
+ export { slimBy, slimerMerge } from "./slimer";
5
+ export { sliceMerge, sliceApply, sliceInsert, sliceToPages, sliceClamp, sliceEq } from "./slice";
6
+ export { pathGetterCompile } from "./path";
7
+ export { queryExecutor } from "./executor";
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYXRhL3NyYy9xdWVyeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVUsUUFBUSxFQUFFLFdBQVcsRUFBWSxNQUFNLFVBQVUsQ0FBQTtBQUNsRSxPQUFPLEVBQVcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUMxRCxPQUFPLEVBQVUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUN0RCxPQUFPLEVBQVUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUN0RCxPQUFPLEVBQVMsVUFBVSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDdkcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sUUFBUSxDQUFBO0FBRTFDLE9BQU8sRUFBRSxhQUFhLEVBQWlCLE1BQU0sWUFBWSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgRmlsdGVyLCBmaWx0ZXJCeSwgZmlsdGVyTWVyZ2UsIEZpbHRlck9wIH0gZnJvbSBcIi4vZmlsdGVyXCJcbmV4cG9ydCB7IEdyb3VwZXIsIGdyb3VwQnksIGdyb3VwZXJNZXJnZSB9IGZyb20gXCIuL2dyb3VwZXJcIlxuZXhwb3J0IHsgU29ydGVyLCBzb3J0QnksIHNvcnRlck1lcmdlIH0gZnJvbSBcIi4vc29ydGVyXCJcbmV4cG9ydCB7IFNsaW1lciwgc2xpbUJ5LCBzbGltZXJNZXJnZSB9IGZyb20gXCIuL3NsaW1lclwiXG5leHBvcnQgeyBTbGljZSwgc2xpY2VNZXJnZSwgc2xpY2VBcHBseSwgc2xpY2VJbnNlcnQsIHNsaWNlVG9QYWdlcywgc2xpY2VDbGFtcCwgc2xpY2VFcSB9IGZyb20gXCIuL3NsaWNlXCJcbmV4cG9ydCB7IHBhdGhHZXR0ZXJDb21waWxlIH0gZnJvbSBcIi4vcGF0aFwiXG5leHBvcnQgeyBRdWVyeSwgUXVlcnlSZXN1bHQgfSBmcm9tIFwiLi9xdWVyeVwiXG5leHBvcnQgeyBxdWVyeUV4ZWN1dG9yLCBRdWVyeUV4ZWN1dG9yIH0gZnJvbSBcIi4vZXhlY3V0b3JcIlxuIl19
@@ -0,0 +1,18 @@
1
+ import { flattenDepth } from "lodash";
2
+ export function pathGetterCompile(path) {
3
+ if (!path || path.length === 0) {
4
+ throw new Error("Empty path");
5
+ }
6
+ return path.split(".").reduce((parent, part) => makeGetter(part, parent), (obj) => (obj == null ? [] : [obj]));
7
+ }
8
+ const IsNumber = /^\d+$/;
9
+ function makeGetter(part, parent) {
10
+ if (part === "*") {
11
+ return obj => flattenDepth(parent(obj), 1);
12
+ }
13
+ else {
14
+ const key = IsNumber.test(part) ? Number(part) : part;
15
+ return obj => parent(obj).map(v => (v != null ? v[key] : undefined));
16
+ }
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RhdGEvc3JjL3F1ZXJ5L3BhdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUtyQyxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBWTtJQUMxQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FDekIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUMxQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDM0MsQ0FBQTtBQUNMLENBQUM7QUFFRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUE7QUFFeEIsU0FBUyxVQUFVLENBQUMsSUFBWSxFQUFFLE1BQWdCO0lBQzlDLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2YsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDOUMsQ0FBQztTQUFNLENBQUM7UUFDSixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtRQUNyRCxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQ3hFLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmxhdHRlbkRlcHRoIH0gZnJvbSBcImxvZGFzaFwiXG5cbnR5cGUgR2V0dGVyRm4gPSAoc3JjczogYW55W10pID0+IGFueVtdXG5leHBvcnQgdHlwZSBQYXRoR2V0dGVyPFQgPSBhbnksIFIgPSBhbnk+ID0gKG9iajogVCkgPT4gUltdXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoR2V0dGVyQ29tcGlsZShwYXRoOiBzdHJpbmcpOiBQYXRoR2V0dGVyIHtcbiAgICBpZiAoIXBhdGggfHwgcGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW1wdHkgcGF0aFwiKVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoLnNwbGl0KFwiLlwiKS5yZWR1Y2U8R2V0dGVyRm4+KFxuICAgICAgICAocGFyZW50LCBwYXJ0KSA9PiBtYWtlR2V0dGVyKHBhcnQsIHBhcmVudCksXG4gICAgICAgIChvYmo6IGFueSkgPT4gKG9iaiA9PSBudWxsID8gW10gOiBbb2JqXSlcbiAgICApXG59XG5cbmNvbnN0IElzTnVtYmVyID0gL15cXGQrJC9cblxuZnVuY3Rpb24gbWFrZUdldHRlcihwYXJ0OiBzdHJpbmcsIHBhcmVudDogR2V0dGVyRm4pOiBHZXR0ZXJGbiB7XG4gICAgaWYgKHBhcnQgPT09IFwiKlwiKSB7XG4gICAgICAgIHJldHVybiBvYmogPT4gZmxhdHRlbkRlcHRoKHBhcmVudChvYmopLCAxKVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGtleSA9IElzTnVtYmVyLnRlc3QocGFydCkgPyBOdW1iZXIocGFydCkgOiBwYXJ0XG4gICAgICAgIHJldHVybiBvYmogPT4gcGFyZW50KG9iaikubWFwKHYgPT4gKHYgIT0gbnVsbCA/IHZba2V5XSA6IHVuZGVmaW5lZCkpXG4gICAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYXRhL3NyYy9xdWVyeS9xdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBEZWVwUmVhZG9ubHkgfSBmcm9tIFwiQG5ndXRpbC9jb21tb25cIlxuXG5pbXBvcnQgeyB0eXBlIE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsXCJcbmltcG9ydCB7IHR5cGUgRmlsdGVyIH0gZnJvbSBcIi4vZmlsdGVyXCJcbmltcG9ydCB7IHR5cGUgR3JvdXBlciB9IGZyb20gXCIuL2dyb3VwZXJcIlxuaW1wb3J0IHsgdHlwZSBTbGljZSB9IGZyb20gXCIuL3NsaWNlXCJcbmltcG9ydCB7IHR5cGUgU2xpbWVyIH0gZnJvbSBcIi4vc2xpbWVyXCJcbmltcG9ydCB7IHR5cGUgU29ydGVyIH0gZnJvbSBcIi4vc29ydGVyXCJcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeTxUIGV4dGVuZHMgTW9kZWw+IHtcbiAgICBmaWx0ZXI/OiBEZWVwUmVhZG9ubHk8RmlsdGVyPFQ+PlxuICAgIHNvcnRlcj86IERlZXBSZWFkb25seTxTb3J0ZXI8VD4+XG4gICAgc2xpbWVyPzogRGVlcFJlYWRvbmx5PFNsaW1lcjxUPj5cbiAgICBncm91cGVyPzogRGVlcFJlYWRvbmx5PEdyb3VwZXI8VD4+XG4gICAgc2xpY2U/OiBEZWVwUmVhZG9ubHk8U2xpY2U+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlSZXN1bHQ8VCBleHRlbmRzIE1vZGVsPiB7XG4gICAgaXRlbXM6IHJlYWRvbmx5IFRbXVxuICAgIHRvdGFsPzogbnVtYmVyXG4gICAgZ3JvdXBzPzogYW55W11cbn1cbiJdfQ==
@@ -0,0 +1,61 @@
1
+ import { deepClone } from "@ngutil/common";
2
+ export function sliceMerge(...slices) {
3
+ let result = undefined;
4
+ for (const slice of slices) {
5
+ if (slice == null) {
6
+ continue;
7
+ }
8
+ if (result == null) {
9
+ result = deepClone(slice);
10
+ }
11
+ else {
12
+ result = { ...result, ...slice };
13
+ }
14
+ }
15
+ return result;
16
+ }
17
+ /**
18
+ * Apply slice to array, and force the result length to equal with Slice length,
19
+ * so fill array with undefined if not enought elements
20
+ */
21
+ export function sliceApply(slice, array) {
22
+ const result = array.slice(slice.start, slice.end);
23
+ result.length = slice.end - slice.start;
24
+ return result;
25
+ }
26
+ /**
27
+ * @returns Page numbers, eg.: `[10, 11, 12, 13, ...]`
28
+ */
29
+ export function sliceToPages(slice) {
30
+ if (slice.pageSize == null) {
31
+ throw new Error("Missing `step` from slice");
32
+ }
33
+ const start = Math.floor(slice.start / slice.pageSize);
34
+ const end = Math.ceil(slice.end / slice.pageSize);
35
+ return Array.from({ length: end - start }, (_, i) => start + i);
36
+ }
37
+ export function sliceInsert(slice, array, newItems) {
38
+ if (slice.start === slice.end) {
39
+ return array;
40
+ }
41
+ let result = array.slice(0, slice.start);
42
+ result.length = slice.start;
43
+ result = result.concat(newItems);
44
+ result.length = slice.end;
45
+ return result.concat(array.slice(slice.end));
46
+ }
47
+ export function sliceClamp(slice, constraint) {
48
+ return {
49
+ start: Math.max(slice.start, constraint.start),
50
+ end: Math.min(slice.end, constraint.end),
51
+ pageSize: slice.pageSize
52
+ };
53
+ }
54
+ export function sliceEq(a, b) {
55
+ return a.start === b.start && a.end === b.end && a.pageSize === b.pageSize;
56
+ }
57
+ // TODO: sliceOverlap(other: Slice): Slice
58
+ // TODO: sliceIncludes(other: Slice): boolean
59
+ // TODO: sliceConcat(...slices: Slice[]): Slice[]
60
+ // TODO: sliceDiff(slice: Slice): Slice[]
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYXRhL3NyYy9xdWVyeS9zbGljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUF1QjFDLE1BQU0sVUFBVSxVQUFVLENBQUMsR0FBRyxNQUFlO0lBQ3pDLElBQUksTUFBTSxHQUFzQixTQUFTLENBQUE7SUFFekMsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN6QixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNoQixTQUFRO1FBQ1osQ0FBQztRQUNELElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDN0IsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLEdBQUcsRUFBRSxHQUFJLE1BQWMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFBO1FBQzdDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDakIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBWSxFQUFFLEtBQXFCO0lBQzFELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDbEQsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUE7SUFDdkMsT0FBTyxNQUFNLENBQUE7QUFDakIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFZO0lBQ3JDLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDaEQsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDdEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNqRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQ25FLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQVksRUFBRSxLQUFxQixFQUFFLFFBQXdCO0lBQ3JGLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDNUIsT0FBTyxLQUFZLENBQUE7SUFDdkIsQ0FBQztJQUVELElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN4QyxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUE7SUFFM0IsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDaEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFBO0lBRXpCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQ2hELENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQVksRUFBRSxVQUFpQjtJQUN0RCxPQUFPO1FBQ0gsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQzlDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUN4QyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7S0FDM0IsQ0FBQTtBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsT0FBTyxDQUFDLENBQVEsRUFBRSxDQUFRO0lBQ3RDLE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUE7QUFDOUUsQ0FBQztBQUVELDBDQUEwQztBQUMxQyw2Q0FBNkM7QUFDN0MsaURBQWlEO0FBQ2pELHlDQUF5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExpc3RSYW5nZSB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIlxuXG5pbXBvcnQgeyBkZWVwQ2xvbmUgfSBmcm9tIFwiQG5ndXRpbC9jb21tb25cIlxuXG4vLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9hcnJheS12aWV3XG5cbi8qKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiB7c3RhcnQ6IDAsIGVuZDogMH0gLy8gZW1wdHkgcmFuZ2VcbiAqIHtzdGFydDogMCwgZW5kOiAxfSAvLyByYW5nZSB3aXRoIG9uZSBpdGVtLmVnIHNsaWNlQXBwbHkoWzEsIDIsIDNdLCB7c3RhcnQ6MCwgZW5kOjF9KSAtPiBbMV1cbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWNlIGV4dGVuZHMgTGlzdFJhbmdlIHtcbiAgICAvKipcbiAgICAgKiBTdGFydCBvZiBzbGljZSwgZXhhY3QgaW5kZXggb2YgaXRlbSBpbiBsaXN0XG4gICAgICovXG4gICAgcmVhZG9ubHkgc3RhcnQ6IG51bWJlclxuICAgIC8qKlxuICAgICAqIEVuZCBvZiBzbGljZSwgbm90IGluY2x1ZGUgZW5kIGluZGV4IG9mIGl0ZW0gaW4gbGlzdFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuZDogbnVtYmVyXG4gICAgcmVhZG9ubHkgcGFnZVNpemU/OiBudW1iZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlTWVyZ2UoLi4uc2xpY2VzOiBTbGljZVtdKSB7XG4gICAgbGV0IHJlc3VsdDogU2xpY2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcblxuICAgIGZvciAoY29uc3Qgc2xpY2Ugb2Ygc2xpY2VzKSB7XG4gICAgICAgIGlmIChzbGljZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZGVlcENsb25lKHNsaWNlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0geyAuLi4ocmVzdWx0IGFzIGFueSksIC4uLnNsaWNlIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBBcHBseSBzbGljZSB0byBhcnJheSwgYW5kIGZvcmNlIHRoZSByZXN1bHQgbGVuZ3RoIHRvIGVxdWFsIHdpdGggU2xpY2UgbGVuZ3RoLFxuICogc28gZmlsbCBhcnJheSB3aXRoIHVuZGVmaW5lZCBpZiBub3QgZW5vdWdodCBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2xpY2VBcHBseShzbGljZTogU2xpY2UsIGFycmF5OiByZWFkb25seSBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCByZXN1bHQgPSBhcnJheS5zbGljZShzbGljZS5zdGFydCwgc2xpY2UuZW5kKVxuICAgIHJlc3VsdC5sZW5ndGggPSBzbGljZS5lbmQgLSBzbGljZS5zdGFydFxuICAgIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBQYWdlIG51bWJlcnMsIGVnLjogYFsxMCwgMTEsIDEyLCAxMywgLi4uXWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlVG9QYWdlcyhzbGljZTogU2xpY2UpOiBudW1iZXJbXSB7XG4gICAgaWYgKHNsaWNlLnBhZ2VTaXplID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBgc3RlcGAgZnJvbSBzbGljZVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5mbG9vcihzbGljZS5zdGFydCAvIHNsaWNlLnBhZ2VTaXplKVxuICAgIGNvbnN0IGVuZCA9IE1hdGguY2VpbChzbGljZS5lbmQgLyBzbGljZS5wYWdlU2l6ZSlcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogZW5kIC0gc3RhcnQgfSwgKF8sIGkpID0+IHN0YXJ0ICsgaSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlSW5zZXJ0KHNsaWNlOiBTbGljZSwgYXJyYXk6IHJlYWRvbmx5IGFueVtdLCBuZXdJdGVtczogcmVhZG9ubHkgYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKHNsaWNlLnN0YXJ0ID09PSBzbGljZS5lbmQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5IGFzIGFueVxuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSBhcnJheS5zbGljZSgwLCBzbGljZS5zdGFydClcbiAgICByZXN1bHQubGVuZ3RoID0gc2xpY2Uuc3RhcnRcblxuICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQobmV3SXRlbXMpXG4gICAgcmVzdWx0Lmxlbmd0aCA9IHNsaWNlLmVuZFxuXG4gICAgcmV0dXJuIHJlc3VsdC5jb25jYXQoYXJyYXkuc2xpY2Uoc2xpY2UuZW5kKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlQ2xhbXAoc2xpY2U6IFNsaWNlLCBjb25zdHJhaW50OiBTbGljZSk6IFNsaWNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogTWF0aC5tYXgoc2xpY2Uuc3RhcnQsIGNvbnN0cmFpbnQuc3RhcnQpLFxuICAgICAgICBlbmQ6IE1hdGgubWluKHNsaWNlLmVuZCwgY29uc3RyYWludC5lbmQpLFxuICAgICAgICBwYWdlU2l6ZTogc2xpY2UucGFnZVNpemVcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzbGljZUVxKGE6IFNsaWNlLCBiOiBTbGljZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhLnN0YXJ0ID09PSBiLnN0YXJ0ICYmIGEuZW5kID09PSBiLmVuZCAmJiBhLnBhZ2VTaXplID09PSBiLnBhZ2VTaXplXG59XG5cbi8vIFRPRE86IHNsaWNlT3ZlcmxhcChvdGhlcjogU2xpY2UpOiBTbGljZVxuLy8gVE9ETzogc2xpY2VJbmNsdWRlcyhvdGhlcjogU2xpY2UpOiBib29sZWFuXG4vLyBUT0RPOiBzbGljZUNvbmNhdCguLi5zbGljZXM6IFNsaWNlW10pOiBTbGljZVtdXG4vLyBUT0RPOiBzbGljZURpZmYoc2xpY2U6IFNsaWNlKTogU2xpY2VbXVxuIl19
@@ -0,0 +1,7 @@
1
+ export function slimBy(slimer) { }
2
+ export function slimerNormalize(slimer) { }
3
+ function slimerCompile(slimer) {
4
+ return item => item;
5
+ }
6
+ export function slimerMerge(...slimers) { }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpbWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGF0YS9zcmMvcXVlcnkvc2xpbWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQSxNQUFNLFVBQVUsTUFBTSxDQUFrQixNQUFpQixJQUFTLENBQUM7QUFFbkUsTUFBTSxVQUFVLGVBQWUsQ0FBa0IsTUFBaUIsSUFBUyxDQUFDO0FBRTVFLFNBQVMsYUFBYSxDQUFrQixNQUFpQjtJQUNyRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFBO0FBQ3ZCLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFrQixHQUFHLE9BQWtCLElBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsXCJcblxuLyoqXG4gKiBAZXhtYXBsZVxuICogYGBgdHNcbiAqIFtcbiAqICBcImZpZWxkX25hbWVcIixcbiAqICB7XCJjaGlsZF9uYW1lXCI6IFtcImNoaWxkX2ZpZWxkX25hbWVcIl19LFxuICogIHtcImNoaWxkcmVuXCI6IFtcImNoaWxkcmVuX2ZpZWxkX25hbWVcIiwge1wiJHR5cGVcIjogQXJ0aWNsZSwgc2xpbWVyOiBbXCJpZFwiLCBcInRpdGxlXCJdfV19LFxuICogIHtcIiR0eXBlXCI6IEVtcGxveWVlLCBzbGltZXI6IFtcIm5hbWVcIl19LlxuICogIHtcIiRmaWx0ZXJcIjogRmlsdGVyPFQsIEY+fVxuICogXVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIFNsaW1lcjxUIGV4dGVuZHMgTW9kZWw+ID0gYW55XG5leHBvcnQgdHlwZSBTbGltZXJGbjxUPiA9IChpdGVtOiBUKSA9PiBUXG5cbmV4cG9ydCBmdW5jdGlvbiBzbGltQnk8VCBleHRlbmRzIE1vZGVsPihzbGltZXI6IFNsaW1lcjxUPik6IHZvaWQge31cblxuZXhwb3J0IGZ1bmN0aW9uIHNsaW1lck5vcm1hbGl6ZTxUIGV4dGVuZHMgTW9kZWw+KHNsaW1lcjogU2xpbWVyPFQ+KTogdm9pZCB7fVxuXG5mdW5jdGlvbiBzbGltZXJDb21waWxlPFQgZXh0ZW5kcyBNb2RlbD4oc2xpbWVyOiBTbGltZXI8VD4pOiBTbGltZXJGbjxUPiB7XG4gICAgcmV0dXJuIGl0ZW0gPT4gaXRlbVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2xpbWVyTWVyZ2U8VCBleHRlbmRzIE1vZGVsPiguLi5zbGltZXJzOiBTbGltZXI8VD4pOiB2b2lkIHt9XG4iXX0=
@@ -0,0 +1,166 @@
1
+ import { flattenDeep, isEqual } from "lodash";
2
+ import { deepClone, isPlainObject } from "@ngutil/common";
3
+ import { pathGetterCompile } from "./path";
4
+ /**
5
+ * @example
6
+ *```ts
7
+ * items.toSorted(sortBy([{"author.name": "asc"}]))
8
+ * ```
9
+ */
10
+ export function sortBy(sorters) {
11
+ if (sorters.length === 0) {
12
+ throw new Error("Empty sorter");
13
+ }
14
+ return _sorterCompile(sorters);
15
+ }
16
+ /**
17
+ * Normalize sorter definition
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * normalizeSorter([{id: "asc"}]) -> [{path: "id", isAsc: true, emptyFirst: true}]
22
+ * normalizeSorter([{id: {dir: "desc", emptyFirst: false}}]) -> [{path: "id", isAsc: false, emptyFirst: false}]
23
+ * ```
24
+ */
25
+ export function sorterNormalize(sorters) {
26
+ return flattenDeep(sorters.map((s) => Object.entries(s).map(([k, v]) => {
27
+ if (typeof v === "string") {
28
+ const isAsc = v.toLowerCase() === "asc";
29
+ return { path: k, isAsc, emptyFirst: isAsc ? false : true };
30
+ }
31
+ else if (isPlainObject(v)) {
32
+ return {
33
+ path: k,
34
+ isAsc: (v.dir || "asc").toLowerCase() === "asc",
35
+ emptyFirst: v.emptyFirst == null ? true : !!v.emptyFirst
36
+ };
37
+ }
38
+ else {
39
+ throw new Error(`Invalid sorter: ${v}`);
40
+ }
41
+ })));
42
+ }
43
+ function _sorterCompile(sorters) {
44
+ if (sorters.length === 0) {
45
+ return (_a, _b) => 0;
46
+ }
47
+ const norm = sorterNormalize(sorters).map(createComparator);
48
+ if (norm.length === 1) {
49
+ return norm[0];
50
+ }
51
+ const initial = norm.pop();
52
+ return norm.reduceRight((next, curr) => (a, b) => {
53
+ const r = curr(a, b);
54
+ return r === 0 ? next(a, b) : r;
55
+ }, initial);
56
+ }
57
+ function createComparator({ path, isAsc, emptyFirst }) {
58
+ const getter = pathGetterCompile(path);
59
+ if (isAsc) {
60
+ return (a, b) => compare(getter(a), getter(b), emptyFirst);
61
+ }
62
+ else {
63
+ return (a, b) => compare(getter(a), getter(b), !emptyFirst) * -1;
64
+ }
65
+ }
66
+ export function compare(a, b, emptyFirst) {
67
+ // console.log("COMPARE", a, b)
68
+ if (a == null && b != null) {
69
+ return emptyFirst === true ? -1 : 1;
70
+ }
71
+ else if (a != null && b == null) {
72
+ return emptyFirst === true ? 1 : -1;
73
+ }
74
+ else if (a == null && b == null) {
75
+ return 0;
76
+ }
77
+ else if (isEqual(a, b)) {
78
+ return 0;
79
+ }
80
+ else if (typeof a === "number" && typeof b === "number") {
81
+ return a - b;
82
+ }
83
+ else if (typeof a === "string" && typeof b === "string") {
84
+ const al = a.length;
85
+ const bl = b.length;
86
+ // if both lengths is 0 the code execution not reach that point, because a === b
87
+ if (emptyFirst === true) {
88
+ if (al === 0) {
89
+ return -1;
90
+ }
91
+ else if (bl === 0) {
92
+ return 1;
93
+ }
94
+ }
95
+ else {
96
+ if (al === 0) {
97
+ return 1;
98
+ }
99
+ else if (bl === 0) {
100
+ return -1;
101
+ }
102
+ }
103
+ return a.localeCompare(b);
104
+ }
105
+ else if (Array.isArray(a) && Array.isArray(b)) {
106
+ const al = a.length;
107
+ const bl = b.length;
108
+ const l = Math.min(al, bl);
109
+ for (let i = 0; i < l; i++) {
110
+ const res = compare(a[i], b[i], emptyFirst);
111
+ if (res !== 0) {
112
+ return res;
113
+ }
114
+ }
115
+ if (al === bl) {
116
+ return 0;
117
+ }
118
+ if (emptyFirst === true) {
119
+ if (al === 0) {
120
+ return -1;
121
+ }
122
+ else if (bl === 0) {
123
+ return 1;
124
+ }
125
+ }
126
+ else {
127
+ if (al === 0) {
128
+ return 1;
129
+ }
130
+ else if (bl === 0) {
131
+ return -1;
132
+ }
133
+ }
134
+ return al - bl;
135
+ }
136
+ else if (isPlainObject(a) && isPlainObject(b)) {
137
+ return JSON.stringify(a).localeCompare(JSON.stringify(b));
138
+ }
139
+ return a > b ? -1 : 1;
140
+ }
141
+ export function sorterMerge(...sorters) {
142
+ let result;
143
+ for (const sorter of sorters) {
144
+ if (sorter == null) {
145
+ continue;
146
+ }
147
+ if (result == null) {
148
+ result = deepClone(sorter);
149
+ continue;
150
+ }
151
+ for (const sentry of sorter) {
152
+ for (const [k, v] of Object.entries(sentry)) {
153
+ const existing = result.find((value) => value[k] != null);
154
+ if (existing) {
155
+ ;
156
+ existing[k] = deepClone(v);
157
+ }
158
+ else {
159
+ result.push({ [k]: deepClone(v) });
160
+ }
161
+ }
162
+ }
163
+ }
164
+ return result;
165
+ }
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGF0YS9zcmMvcXVlcnkvc29ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBRTdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFHekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sUUFBUSxDQUFBO0FBb0IxQzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxNQUFNLENBQWtCLE9BQWtCO0lBQ3RELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ25DLENBQUM7SUFDRCxPQUFPLGNBQWMsQ0FBSSxPQUFPLENBQVEsQ0FBQTtBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFrQixPQUFrQjtJQUMvRCxPQUFPLFdBQVcsQ0FDYixPQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FDNUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQzdCLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssQ0FBQTtZQUN2QyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUMvRCxDQUFDO2FBQU0sSUFB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QUMsRUFBUyxDQUFDLENBQUE7Z0JBQzdDLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQTtBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmxhdHRlbkRlZXAsIGlzRXF1YWwgfSBmcm9tIFwibG9kYXNoXCJcblxuaW1wb3J0IHsgZGVlcENsb25lLCBpc1BsYWluT2JqZWN0IH0gZnJvbSBcIkBuZ3V0aWwvY29tbW9uXCJcblxuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxcIlxuaW1wb3J0IHsgcGF0aEdldHRlckNvbXBpbGUgfSBmcm9tIFwiLi9wYXRoXCJcblxuZXhwb3J0IHR5cGUgU29ydGVyRm48VCA9IGFueT4gPSAoYTogVCwgYjogVCkgPT4gbnVtYmVyXG5cbmV4cG9ydCBjb25zdCBlbnVtIFNvcnREaXJlY3Rpb24ge1xuICAgIEFzYyA9IFwiYXNjXCIsXG4gICAgRGVzYyA9IFwiZGVzY1wiXG59XG5cbnR5cGUgRGlyZWN0aW9uID0gU29ydERpcmVjdGlvbi5Bc2MgfCBTb3J0RGlyZWN0aW9uLkRlc2MgfCBcImFzY1wiIHwgXCJkZXNjXCJcbnR5cGUgRGlyZWN0aW9uRXh0cmEgPSB7IGRpcjogRGlyZWN0aW9uOyBlbXB0eUZpcnN0OiBib29sZWFuIH1cblxudHlwZSBfU29ydGVyPEY+ID0geyBbSyBpbiBrZXlvZiBGXTogeyBba2V5IGluIEtdOiBEaXJlY3Rpb24gfCBEaXJlY3Rpb25FeHRyYSB9IH1ba2V5b2YgRl1cbi8vIFRPRE86IGZpeCByZWN1cnNpb25cbi8vIGV4cG9ydCB0eXBlIFNvcnRlcjxUIGV4dGVuZHMgTW9kZWw+ID0gQXJyYXk8X1NvcnRlcjxGbGF0dGVuPFQ+Pj5cbmV4cG9ydCB0eXBlIFNvcnRlcjxUIGV4dGVuZHMgTW9kZWw+ID0gQXJyYXk8eyBba2V5OiBzdHJpbmddOiBEaXJlY3Rpb24gfCBEaXJlY3Rpb25FeHRyYSB9PlxuXG50eXBlIE5vcm1hbGl6ZWRFbnRyeSA9IHsgcGF0aDogc3RyaW5nOyBpc0FzYzogYm9vbGVhbjsgZW1wdHlGaXJzdDogYm9vbGVhbiB9XG5leHBvcnQgdHlwZSBTb3J0ZXJOb3JtYWxpemVkID0gQXJyYXk8Tm9ybWFsaXplZEVudHJ5PlxuXG4vKipcbiAqIEBleGFtcGxlXG4gKmBgYHRzXG4gKiBpdGVtcy50b1NvcnRlZChzb3J0QnkoW3tcImF1dGhvci5uYW1lXCI6IFwiYXNjXCJ9XSkpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRCeTxUIGV4dGVuZHMgTW9kZWw+KHNvcnRlcnM6IFNvcnRlcjxUPik6IFNvcnRlckZuPFQ+IHtcbiAgICBpZiAoc29ydGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW1wdHkgc29ydGVyXCIpXG4gICAgfVxuICAgIHJldHVybiBfc29ydGVyQ29tcGlsZTxUPihzb3J0ZXJzKSBhcyBhbnlcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgc29ydGVyIGRlZmluaXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIG5vcm1hbGl6ZVNvcnRlcihbe2lkOiBcImFzY1wifV0pIC0+IFt7cGF0aDogXCJpZFwiLCBpc0FzYzogdHJ1ZSwgZW1wdHlGaXJzdDogdHJ1ZX1dXG4gKiBub3JtYWxpemVTb3J0ZXIoW3tpZDoge2RpcjogXCJkZXNjXCIsIGVtcHR5Rmlyc3Q6IGZhbHNlfX1dKSAtPiBbe3BhdGg6IFwiaWRcIiwgaXNBc2M6IGZhbHNlLCBlbXB0eUZpcnN0OiBmYWxzZX1dXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRlck5vcm1hbGl6ZTxUIGV4dGVuZHMgTW9kZWw+KHNvcnRlcnM6IFNvcnRlcjxUPik6IFNvcnRlck5vcm1hbGl6ZWQge1xuICAgIHJldHVybiBmbGF0dGVuRGVlcChcbiAgICAgICAgKHNvcnRlcnMgYXMgYW55KS5tYXAoKHM6IGFueSkgPT5cbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHMpLm1hcCgoW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQXNjID0gdi50b0xvd2VyQ2FzZSgpID09PSBcImFzY1wiXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhdGg6IGssIGlzQXNjLCBlbXB0eUZpcnN0OiBpc0FzYyA/IGZhbHNlIDogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHYpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBrLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBc2M6ICgodiBhcyBEaXJlY3Rpb25FeHRyYSkuZGlyIHx8IFwiYXNjXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwiYXNjXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpcnN0OiAodiBhcyBEaXJlY3Rpb25FeHRyYSkuZW1wdHlGaXJzdCA9PSBudWxsID8gdHJ1ZSA6ICEhKHYgYXMgRGlyZWN0aW9uRXh0cmEpLmVtcHR5Rmlyc3RcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzb3J0ZXI6ICR7dn1gKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICApXG59XG5cbmZ1bmN0aW9uIF9zb3J0ZXJDb21waWxlPFQgZXh0ZW5kcyBNb2RlbD4oc29ydGVyczogU29ydGVyPFQ+KTogU29ydGVyRm48VD4ge1xuICAgIGlmIChzb3J0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gKF9hLCBfYikgPT4gMFxuICAgIH1cblxuICAgIGNvbnN0IG5vcm0gPSBzb3J0ZXJOb3JtYWxpemU8VD4oc29ydGVycykubWFwKGNyZWF0ZUNvbXBhcmF0b3IpXG4gICAgaWYgKG5vcm0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBub3JtWzBdXG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbCA9IG5vcm0ucG9wKCkhXG4gICAgcmV0dXJuIG5vcm0ucmVkdWNlUmlnaHQ8U29ydGVyRm48VD4+KFxuICAgICAgICAobmV4dCwgY3VycikgPT4gKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBjdXJyKGEsIGIpXG4gICAgICAgICAgICByZXR1cm4gciA9PT0gMCA/IG5leHQoYSwgYikgOiByXG4gICAgICAgIH0sXG4gICAgICAgIGluaXRpYWxcbiAgICApXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBhcmF0b3IoeyBwYXRoLCBpc0FzYywgZW1wdHlGaXJzdCB9OiBOb3JtYWxpemVkRW50cnkpOiBTb3J0ZXJGbiB7XG4gICAgY29uc3QgZ2V0dGVyID0gcGF0aEdldHRlckNvbXBpbGUocGF0aClcbiAgICBpZiAoaXNBc2MpIHtcbiAgICAgICAgcmV0dXJuIChhLCBiKSA9PiBjb21wYXJlKGdldHRlcihhKSwgZ2V0dGVyKGIpLCBlbXB0eUZpcnN0KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoYSwgYikgPT4gY29tcGFyZShnZXR0ZXIoYSksIGdldHRlcihiKSwgIWVtcHR5Rmlyc3QpICogLTFcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlKGE6IGFueSwgYjogYW55LCBlbXB0eUZpcnN0OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcIkNPTVBBUkVcIiwgYSwgYilcbiAgICBpZiAoYSA9PSBudWxsICYmIGIgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZW1wdHlGaXJzdCA9PT0gdHJ1ZSA/IC0xIDogMVxuICAgIH0gZWxzZSBpZiAoYSAhPSBudWxsICYmIGIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZW1wdHlGaXJzdCA9PT0gdHJ1ZSA/IDEgOiAtMVxuICAgIH0gZWxzZSBpZiAoYSA9PSBudWxsICYmIGIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMFxuICAgIH0gZWxzZSBpZiAoaXNFcXVhbChhLCBiKSkge1xuICAgICAgICByZXR1cm4gMFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGEgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGIgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGEgLSBiXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYSA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgYiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBhbCA9IGEubGVuZ3RoXG4gICAgICAgIGNvbnN0IGJsID0gYi5sZW5ndGhcbiAgICAgICAgLy8gaWYgYm90aCBsZW5ndGhzIGlzIDAgdGhlIGNvZGUgZXhlY3V0aW9uIG5vdCByZWFjaCB0aGF0IHBvaW50LCBiZWNhdXNlIGEgPT09IGJcbiAgICAgICAgaWYgKGVtcHR5Rmlyc3QgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGlmIChhbCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICAgICAgfSBlbHNlIGlmIChibCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYWwgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMVxuICAgICAgICAgICAgfSBlbHNlIGlmIChibCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhLmxvY2FsZUNvbXBhcmUoYilcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgICAgICBjb25zdCBhbCA9IGEubGVuZ3RoXG4gICAgICAgIGNvbnN0IGJsID0gYi5sZW5ndGhcbiAgICAgICAgY29uc3QgbCA9IE1hdGgubWluKGFsLCBibClcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gY29tcGFyZShhW2ldLCBiW2ldLCBlbXB0eUZpcnN0KVxuICAgICAgICAgICAgaWYgKHJlcyAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhbCA9PT0gYmwpIHtcbiAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW1wdHlGaXJzdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKGFsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhbCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWwgLSBibFxuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChhKSAmJiBpc1BsYWluT2JqZWN0KGIpKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhKS5sb2NhbGVDb21wYXJlKEpTT04uc3RyaW5naWZ5KGIpKVxuICAgIH1cblxuICAgIHJldHVybiBhID4gYiA/IC0xIDogMVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydGVyTWVyZ2U8VCBleHRlbmRzIE1vZGVsPiguLi5zb3J0ZXJzOiBBcnJheTxTb3J0ZXI8VD4gfCB1bmRlZmluZWQgfCBudWxsPik6IFNvcnRlcjxUPiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlc3VsdDogU29ydGVyPFQ+IHwgdW5kZWZpbmVkXG5cbiAgICBmb3IgKGNvbnN0IHNvcnRlciBvZiBzb3J0ZXJzKSB7XG4gICAgICAgIGlmIChzb3J0ZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGRlZXBDbG9uZShzb3J0ZXIpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBzZW50cnkgb2Ygc29ydGVyKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSAocmVzdWx0IGFzIGFueSkuZmluZCgodmFsdWU6IGFueSkgPT4gdmFsdWVba10gIT0gbnVsbClcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgOyhleGlzdGluZyBhcyBhbnkpW2tdID0gZGVlcENsb25lKHYpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBba106IGRlZXBDbG9uZSh2KSB9IGFzIGFueSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG4iXX0=