@devisfuture/mega-collection 2.4.5 → 2.4.7

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.
Files changed (63) hide show
  1. package/README.md +2 -2
  2. package/dist/State.d.ts +42 -0
  3. package/dist/{chunk-BJZg_1dI.mjs → State.mjs} +2 -2
  4. package/dist/constants.d.ts +5 -0
  5. package/dist/constants.mjs +4 -0
  6. package/dist/filter/chain.d.ts +9 -0
  7. package/dist/filter/chain.mjs +22 -0
  8. package/dist/filter/constants.d.ts +2 -0
  9. package/dist/filter/criterion.d.ts +6 -0
  10. package/dist/filter/criterion.mjs +64 -0
  11. package/dist/filter/errors.d.ts +7 -0
  12. package/dist/filter/errors.mjs +17 -0
  13. package/dist/filter/filter.d.ts +89 -0
  14. package/dist/filter/filter.mjs +439 -0
  15. package/dist/filter/index.mjs +2 -891
  16. package/dist/filter/nested.d.ts +32 -0
  17. package/dist/filter/nested.mjs +246 -0
  18. package/dist/filter/types.d.ts +74 -0
  19. package/dist/filter/utils.d.ts +4 -0
  20. package/dist/filter/utils.mjs +29 -0
  21. package/dist/index.mjs +1 -1
  22. package/dist/indexer.d.ts +41 -0
  23. package/dist/indexer.mjs +101 -0
  24. package/dist/internal.d.ts +6 -0
  25. package/dist/{chunk-C5Zpu_ol.mjs → internal.mjs} +1 -1
  26. package/dist/merge/chain.d.ts +9 -0
  27. package/dist/merge/chain.mjs +23 -0
  28. package/dist/merge/constants.d.ts +6 -0
  29. package/dist/merge/constants.mjs +8 -0
  30. package/dist/merge/errors.d.ts +8 -0
  31. package/dist/merge/errors.mjs +19 -0
  32. package/dist/merge/index.mjs +1 -1
  33. package/dist/merge/merge-engines.d.ts +75 -0
  34. package/dist/{chunk-BURK5sks.mjs → merge/merge-engines.mjs} +35 -108
  35. package/dist/merge/module-adapters.d.ts +7 -0
  36. package/dist/merge/module-adapters.mjs +41 -0
  37. package/dist/merge/types.d.ts +125 -0
  38. package/dist/search/constants.d.ts +5 -0
  39. package/dist/search/index.mjs +2 -1010
  40. package/dist/search/nested.d.ts +41 -0
  41. package/dist/search/nested.mjs +210 -0
  42. package/dist/search/ngram.d.ts +23 -0
  43. package/dist/search/ngram.mjs +96 -0
  44. package/dist/search/text-search.d.ts +146 -0
  45. package/dist/search/text-search.mjs +696 -0
  46. package/dist/search/types.d.ts +93 -0
  47. package/dist/search/utils.d.ts +4 -0
  48. package/dist/search/utils.mjs +22 -0
  49. package/dist/sort/errors.d.ts +5 -0
  50. package/dist/sort/errors.mjs +11 -0
  51. package/dist/sort/index.mjs +2 -416
  52. package/dist/sort/sorter.d.ts +47 -0
  53. package/dist/sort/sorter.mjs +375 -0
  54. package/dist/sort/types.d.ts +18 -0
  55. package/dist/sort/utils.d.ts +17 -0
  56. package/dist/sort/utils.mjs +38 -0
  57. package/dist/types.d.ts +73 -0
  58. package/package.json +11 -34
  59. /package/dist/filter/{index.d.mts → index.d.ts} +0 -0
  60. /package/dist/{index.d.mts → index.d.ts} +0 -0
  61. /package/dist/merge/{index.d.mts → index.d.ts} +0 -0
  62. /package/dist/search/{index.d.mts → index.d.ts} +0 -0
  63. /package/dist/sort/{index.d.mts → index.d.ts} +0 -0
@@ -0,0 +1,32 @@
1
+ import { CollectionItem, type FilterCriterion } from "../types";
2
+ import type { FilterNestedCollectionStorage } from "./types";
3
+ export declare class FilterNestedCollection<T extends CollectionItem> {
4
+ private readonly storage;
5
+ private readonly registeredFields;
6
+ private readonly fieldDescriptors;
7
+ constructor(storage?: FilterNestedCollectionStorage<T>);
8
+ registerFields(fieldPaths?: readonly string[]): void;
9
+ hasRegisteredFields(): boolean;
10
+ hasField(fieldPath: string): boolean;
11
+ clearIndexes(): void;
12
+ buildIndexes(data: T[]): void;
13
+ addItems(items: T[]): void;
14
+ removeItem(item: T): void;
15
+ updateItem(nextItem: T, previousItem: T): void;
16
+ filter(sourceData: T[], criteria: FilterCriterion<T>[], dataset: T[]): T[];
17
+ private resolveCriteria;
18
+ private registerField;
19
+ private buildIndex;
20
+ private removeItemFromIndex;
21
+ private addItem;
22
+ private addItemToIndex;
23
+ private updateItemInIndex;
24
+ private collectUniqueValues;
25
+ private areValueSetsEqual;
26
+ private filterByIndexes;
27
+ private getItemsByValues;
28
+ private estimateIndexSize;
29
+ private filterLinearly;
30
+ private applyIndexedExclusions;
31
+ }
32
+ //# sourceMappingURL=nested.d.ts.map
@@ -0,0 +1,246 @@
1
+ import { createNestedFieldDescriptor as e } from "../internal.mjs";
2
+ import { resolveCriteria as t } from "./criterion.mjs";
3
+ //#region src/filter/nested.ts
4
+ var n = class {
5
+ constructor(e = {
6
+ indexes: /* @__PURE__ */ new Map(),
7
+ itemPositions: /* @__PURE__ */ new Map()
8
+ }) {
9
+ this.storage = e, this.registeredFields = /* @__PURE__ */ new Set(), this.fieldDescriptors = /* @__PURE__ */ new Map();
10
+ }
11
+ registerFields(e) {
12
+ if (e?.length) for (let t = 0; t < e.length; t++) this.registerField(e[t]);
13
+ }
14
+ hasRegisteredFields() {
15
+ return this.registeredFields.size > 0;
16
+ }
17
+ hasField(e) {
18
+ return this.registeredFields.has(e);
19
+ }
20
+ clearIndexes() {
21
+ this.storage.indexes.clear(), this.storage.itemPositions.clear();
22
+ }
23
+ buildIndexes(e) {
24
+ this.storage.indexes.clear(), this.storage.itemPositions.clear();
25
+ for (let t of this.registeredFields) this.buildIndex(e, t);
26
+ }
27
+ addItems(e) {
28
+ if (!(e.length === 0 || this.storage.indexes.size === 0)) for (let t = 0; t < e.length; t++) this.addItem(e[t]);
29
+ }
30
+ removeItem(e) {
31
+ for (let t of this.storage.indexes.keys()) this.removeItemFromIndex(t, e);
32
+ }
33
+ updateItem(e, t) {
34
+ for (let n of this.storage.indexes.keys()) this.updateItemInIndex(n, e, t);
35
+ }
36
+ filter(e, t, n) {
37
+ let r = this.resolveCriteria(t);
38
+ if (e.length === 0 || r.length === 0) return e;
39
+ let i = [], a = [];
40
+ for (let e = 0; e < r.length; e++) {
41
+ let t = r[e];
42
+ if (this.storage.indexes.has(t.field)) {
43
+ i.push(t);
44
+ continue;
45
+ }
46
+ a.push(t);
47
+ }
48
+ let o = e;
49
+ if (i.length > 0 && (o = this.filterByIndexes(i, e, n), o.length === 0)) return o;
50
+ for (let e = 0; e < a.length; e++) if (o = this.filterLinearly(o, a[e]), o.length === 0) return o;
51
+ return o;
52
+ }
53
+ resolveCriteria(e) {
54
+ if (e.length === 0) return [];
55
+ let n = e[0];
56
+ return "hasValues" in n && "hasExclude" in n && "includedValues" in n ? e : t(e);
57
+ }
58
+ registerField(t) {
59
+ let n = e(t);
60
+ n && (this.registeredFields.add(t), this.fieldDescriptors.set(t, n));
61
+ }
62
+ buildIndex(e, t) {
63
+ let n = this.fieldDescriptors.get(t);
64
+ if (!n) return;
65
+ let { collectionKey: r, nestedKey: i } = n, a = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map();
66
+ for (let t = 0, n = e.length; t < n; t++) {
67
+ let n = e[t], s = n[r];
68
+ if (Array.isArray(s)) for (let e = 0; e < s.length; e++) {
69
+ let t = s[e][i];
70
+ if (t == null) continue;
71
+ let r = a.get(t);
72
+ if (r) {
73
+ r[r.length - 1] !== n && (r.push(n), o.get(t).set(n, r.length - 1));
74
+ continue;
75
+ }
76
+ a.set(t, [n]);
77
+ let c = /* @__PURE__ */ new WeakMap();
78
+ c.set(n, 0), o.set(t, c);
79
+ }
80
+ }
81
+ this.storage.indexes.set(t, a), this.storage.itemPositions.set(t, o);
82
+ }
83
+ removeItemFromIndex(e, t) {
84
+ let n = this.fieldDescriptors.get(e), r = this.storage.indexes.get(e), i = this.storage.itemPositions.get(e);
85
+ if (!n || !r || !i) return;
86
+ let { collectionKey: a, nestedKey: o } = n, s = t[a];
87
+ if (!Array.isArray(s) || s.length === 0) return;
88
+ let c = /* @__PURE__ */ new Set();
89
+ for (let e = 0; e < s.length; e++) {
90
+ let t = s[e][o];
91
+ t != null && c.add(t);
92
+ }
93
+ for (let e of c) {
94
+ let n = r.get(e), a = i.get(e), o = a?.get(t);
95
+ if (!n || !a || o === void 0) continue;
96
+ let s = n.length - 1, c = n[s];
97
+ o !== s && (n[o] = c, a.set(c, o)), n.pop(), a.delete(t), n.length === 0 && (r.delete(e), i.delete(e));
98
+ }
99
+ }
100
+ addItem(e) {
101
+ for (let t of this.storage.indexes.keys()) this.addItemToIndex(t, e);
102
+ }
103
+ addItemToIndex(e, t) {
104
+ let n = this.fieldDescriptors.get(e), r = this.storage.indexes.get(e), i = this.storage.itemPositions.get(e);
105
+ if (!n || !r || !i) return;
106
+ let { collectionKey: a, nestedKey: o } = n, s = t[a];
107
+ if (!Array.isArray(s) || s.length === 0) return;
108
+ let c = /* @__PURE__ */ new Set();
109
+ for (let e = 0; e < s.length; e++) {
110
+ let t = s[e][o];
111
+ t != null && c.add(t);
112
+ }
113
+ for (let e of c) {
114
+ let n = r.get(e), a = i.get(e);
115
+ if (n && a) {
116
+ n.push(t), a.set(t, n.length - 1);
117
+ continue;
118
+ }
119
+ r.set(e, [t]);
120
+ let o = /* @__PURE__ */ new WeakMap();
121
+ o.set(t, 0), i.set(e, o);
122
+ }
123
+ }
124
+ updateItemInIndex(e, t, n) {
125
+ let r = this.fieldDescriptors.get(e), i = this.storage.indexes.get(e), a = this.storage.itemPositions.get(e);
126
+ if (!r || !i || !a) return;
127
+ let o = this.collectUniqueValues(n, r), s = this.collectUniqueValues(t, r);
128
+ if (this.areValueSetsEqual(o, s)) {
129
+ for (let e of o) {
130
+ let r = i.get(e), o = a.get(e), s = o?.get(n);
131
+ !r || !o || s === void 0 || (r[s] = t, o.delete(n), o.set(t, s));
132
+ }
133
+ return;
134
+ }
135
+ this.removeItemFromIndex(e, n), this.addItemToIndex(e, t);
136
+ }
137
+ collectUniqueValues(e, t) {
138
+ let { collectionKey: n, nestedKey: r } = t, i = e[n], a = /* @__PURE__ */ new Set();
139
+ if (!Array.isArray(i) || i.length === 0) return a;
140
+ for (let e = 0; e < i.length; e++) {
141
+ let t = i[e][r];
142
+ t != null && a.add(t);
143
+ }
144
+ return a;
145
+ }
146
+ areValueSetsEqual(e, t) {
147
+ if (e.size !== t.size) return !1;
148
+ for (let n of e) if (!t.has(n)) return !1;
149
+ return !0;
150
+ }
151
+ filterByIndexes(e, t, n) {
152
+ let r = e.filter((e) => e.hasValues), i = e.filter((e) => e.hasExclude), a = t === n ? null : new Set(t);
153
+ if (r.length === 0) return this.applyIndexedExclusions(t, i);
154
+ if (r.length === 1) {
155
+ let e = this.storage.indexes.get(r[0].field);
156
+ if (!e) return [];
157
+ let t = this.getItemsByValues(e, r[0].values);
158
+ if (t.length === 0) return [];
159
+ let n = [];
160
+ for (let e = 0; e < t.length; e++) {
161
+ let r = t[e];
162
+ a && !a.has(r) || n.push(r);
163
+ }
164
+ return this.applyIndexedExclusions(n, i);
165
+ }
166
+ let o = r.map((e) => ({
167
+ criterion: e,
168
+ size: this.estimateIndexSize(e)
169
+ })).sort((e, t) => e.size - t.size), s = a, c = [];
170
+ for (let e = 0; e < o.length; e++) {
171
+ let { criterion: t } = o[e], n = this.storage.indexes.get(t.field);
172
+ if (!n) return [];
173
+ let r = this.getItemsByValues(n, t.values);
174
+ if (r.length === 0) return [];
175
+ if (s === null) c = r;
176
+ else {
177
+ c = [];
178
+ for (let e = 0; e < r.length; e++) {
179
+ let t = r[e];
180
+ s.has(t) && c.push(t);
181
+ }
182
+ }
183
+ if (c.length === 0) return [];
184
+ s = new Set(c);
185
+ }
186
+ return this.applyIndexedExclusions(c, i);
187
+ }
188
+ getItemsByValues(e, t) {
189
+ if (t.length === 1) return e.get(t[0]) ?? [];
190
+ let n = /* @__PURE__ */ new Set(), r = [];
191
+ for (let i = 0; i < t.length; i++) {
192
+ let a = e.get(t[i]);
193
+ if (a) for (let e = 0; e < a.length; e++) {
194
+ let t = a[e];
195
+ n.has(t) || (n.add(t), r.push(t));
196
+ }
197
+ }
198
+ return r;
199
+ }
200
+ estimateIndexSize(e) {
201
+ let t = this.storage.indexes.get(e.field);
202
+ return t ? e.values.reduce((e, n) => {
203
+ let r = t.get(n);
204
+ return r ? e + r.length : e;
205
+ }, 0) : Infinity;
206
+ }
207
+ filterLinearly(e, t) {
208
+ let n = this.fieldDescriptors.get(t.field);
209
+ if (!n) return e;
210
+ let { collectionKey: r, nestedKey: i } = n, a = [];
211
+ for (let n = 0; n < e.length; n++) {
212
+ let o = e[n], s = o[r];
213
+ if (!Array.isArray(s)) continue;
214
+ let c = !t.hasValues, l = !1;
215
+ for (let e = 0; e < s.length; e++) {
216
+ let n = s[e][i];
217
+ if (t.hasExclude && t.excludedValues.has(n)) {
218
+ l = !0;
219
+ break;
220
+ }
221
+ t.hasValues && t.includedValues.has(n) && (c = !0);
222
+ }
223
+ !l && c && a.push(o);
224
+ }
225
+ return a;
226
+ }
227
+ applyIndexedExclusions(e, t) {
228
+ if (t.length === 0 || e.length === 0) return e;
229
+ let n = /* @__PURE__ */ new Set();
230
+ for (let e = 0; e < t.length; e++) {
231
+ let r = t[e], i = this.storage.indexes.get(r.field);
232
+ if (!i) continue;
233
+ let a = this.getItemsByValues(i, r.exclude);
234
+ for (let e = 0; e < a.length; e++) n.add(a[e]);
235
+ }
236
+ if (n.size === 0) return e;
237
+ let r = [];
238
+ for (let t = 0; t < e.length; t++) {
239
+ let i = e[t];
240
+ n.has(i) || r.push(i);
241
+ }
242
+ return r;
243
+ }
244
+ };
245
+ //#endregion
246
+ export { n as FilterNestedCollection };
@@ -0,0 +1,74 @@
1
+ import type { IndexerStorage } from "../indexer";
2
+ import type { CollectionItem, FilterCriterion } from "../types";
3
+ import type { FilterEngine } from "./filter";
4
+ export type FilterNestedCollectionStorage<T extends CollectionItem> = IndexerStorage<T>;
5
+ export interface FilterEngineChain<T extends CollectionItem> {
6
+ filter(criteria: FilterCriterion<T>[]): T[] & FilterEngineChain<T>;
7
+ filter(data: T[], criteria: FilterCriterion<T>[]): T[] & FilterEngineChain<T>;
8
+ getOriginData(): T[];
9
+ add(items: T[]): FilterEngine<T>;
10
+ update(descriptor: import("../types").UpdateDescriptor<T>): FilterEngine<T>;
11
+ data(data: T[]): FilterEngine<T>;
12
+ clearIndexes(): FilterEngine<T>;
13
+ clearData(): FilterEngine<T>;
14
+ resetFilterState(): FilterEngine<T>;
15
+ }
16
+ export interface FilterEngineOptions<T extends CollectionItem = CollectionItem> {
17
+ data?: T[];
18
+ mutableExcludeField?: keyof T & string;
19
+ fields?: (keyof T & string)[];
20
+ nestedFields?: string[];
21
+ filterByPreviousResult?: boolean;
22
+ }
23
+ export type NestedFieldDescriptor = {
24
+ collectionKey: string;
25
+ nestedKey: string;
26
+ };
27
+ export type ResolvedFilterCriterion<T extends CollectionItem> = {
28
+ field: FilterCriterion<T>["field"];
29
+ values: any[];
30
+ exclude: any[];
31
+ hasValues: boolean;
32
+ hasExclude: boolean;
33
+ includedValues: Set<any> | null;
34
+ excludedValues: Set<any> | null;
35
+ cacheKeySegment: string;
36
+ };
37
+ export type FilterSequentialCacheEntry<T extends CollectionItem> = {
38
+ result: T[];
39
+ resultSet: Set<T> | null;
40
+ };
41
+ export type FilterEngineChainCallbacks<T extends CollectionItem> = {
42
+ filter: (dataOrCriteria: T[] | FilterCriterion<T>[], criteria?: FilterCriterion<T>[]) => T[] & FilterEngineChain<T>;
43
+ getOriginData: () => T[];
44
+ add: (items: T[]) => FilterEngine<T>;
45
+ update: (descriptor: import("../types").UpdateDescriptor<T>) => FilterEngine<T>;
46
+ data: (data: T[]) => FilterEngine<T>;
47
+ clearIndexes: () => FilterEngine<T>;
48
+ clearData: () => FilterEngine<T>;
49
+ resetFilterState: () => FilterEngine<T>;
50
+ };
51
+ export type FilterSequentialCache<T extends CollectionItem> = {
52
+ previousResult: T[] | null;
53
+ previousCriteria: ResolvedFilterCriterion<T>[] | null;
54
+ previousCriteriaKey: string | null;
55
+ previousBaseData: T[] | null;
56
+ previousResultsByCriteria: Map<string, FilterSequentialCacheEntry<T>>;
57
+ /** Cached Set of previousResult items — avoids O(m) Set construction on each filterViaIndex narrowing call. */
58
+ previousResultSet: Set<T> | null;
59
+ };
60
+ export type MutableExcludeRuntime = {
61
+ datasetPositions: Map<any, number>;
62
+ valueCounts: Map<any, number>;
63
+ duplicateValueCount: number;
64
+ hasDuplicateValues: boolean;
65
+ };
66
+ export type FilterRuntime<T extends CollectionItem> = {
67
+ indexedFields: Set<keyof T & string>;
68
+ indexerStorage: IndexerStorage<T>;
69
+ nestedStorage: FilterNestedCollectionStorage<T>;
70
+ deferredMutationVersion: number | null;
71
+ mutableExclude: MutableExcludeRuntime;
72
+ sequentialCache: FilterSequentialCache<T>;
73
+ };
74
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,4 @@
1
+ import type { CollectionItem } from "../types";
2
+ import type { FilterRuntime } from "./types";
3
+ export declare const createFilterRuntime: <T extends CollectionItem>() => FilterRuntime<T>;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1,29 @@
1
+ //#region src/filter/utils.ts
2
+ var e = () => ({
3
+ indexedFields: /* @__PURE__ */ new Set(),
4
+ indexerStorage: {
5
+ indexes: /* @__PURE__ */ new Map(),
6
+ itemPositions: /* @__PURE__ */ new Map()
7
+ },
8
+ nestedStorage: {
9
+ indexes: /* @__PURE__ */ new Map(),
10
+ itemPositions: /* @__PURE__ */ new Map()
11
+ },
12
+ deferredMutationVersion: null,
13
+ mutableExclude: {
14
+ datasetPositions: /* @__PURE__ */ new Map(),
15
+ valueCounts: /* @__PURE__ */ new Map(),
16
+ duplicateValueCount: 0,
17
+ hasDuplicateValues: !1
18
+ },
19
+ sequentialCache: {
20
+ previousResult: null,
21
+ previousCriteria: null,
22
+ previousCriteriaKey: null,
23
+ previousBaseData: null,
24
+ previousResultsByCriteria: /* @__PURE__ */ new Map(),
25
+ previousResultSet: null
26
+ }
27
+ });
28
+ //#endregion
29
+ export { e as createFilterRuntime };
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { t as e } from "./chunk-BURK5sks.mjs";
1
+ import { MergeEngines as e } from "./merge/merge-engines.mjs";
2
2
  export { e as MergeEngines };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Indexer class that builds hash-map indexes for exact-value lookups
3
+ * on collection fields, enabling O(1) queries.
4
+ */
5
+ import { CollectionItem } from "./types";
6
+ export interface IndexerStorage<T extends CollectionItem> {
7
+ indexes: Map<string, Map<any, T[]>>;
8
+ itemPositions: Map<string, Map<any, WeakMap<T, number>>>;
9
+ }
10
+ export declare class Indexer<T extends CollectionItem> {
11
+ private readonly storage;
12
+ constructor(storage?: IndexerStorage<T>);
13
+ addItems(items: T[]): void;
14
+ /**
15
+ * Builds an index for the given field and data.
16
+ */
17
+ buildIndex(data: T[], field: keyof T & string): void;
18
+ /**
19
+ * Gets items that match the given value for the field.
20
+ */
21
+ getByValue(field: keyof T & string, value: any): T[];
22
+ /**
23
+ * Gets items that match any of the given values for the field.
24
+ *
25
+ * Note: buildIndex indexes scalar field values, so buckets are always
26
+ * disjoint — deduplication via Set is not needed. If multi-value field
27
+ * indexing is ever added, re-introduce dedup here.
28
+ */
29
+ getByValues(field: keyof T & string, values: any[]): T[];
30
+ hasIndex(field: string): boolean;
31
+ addItem(item: T): void;
32
+ updateItem(previousItem: T, nextItem: T): void;
33
+ removeItem(item: T): void;
34
+ clear(): void;
35
+ getIndexMap(field: string): Map<any, T[]> | undefined;
36
+ private removeItemFromField;
37
+ private updateItemInField;
38
+ private replaceItemReferenceInField;
39
+ private addItemToField;
40
+ }
41
+ //# sourceMappingURL=indexer.d.ts.map
@@ -0,0 +1,101 @@
1
+ //#region src/indexer.ts
2
+ var e = class {
3
+ constructor(e = {
4
+ indexes: /* @__PURE__ */ new Map(),
5
+ itemPositions: /* @__PURE__ */ new Map()
6
+ }) {
7
+ this.storage = e;
8
+ }
9
+ addItems(e) {
10
+ if (!(e.length === 0 || this.storage.indexes.size === 0)) for (let t = 0; t < e.length; t++) this.addItem(e[t]);
11
+ }
12
+ buildIndex(e, t) {
13
+ let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
14
+ for (let i = 0, a = e.length; i < a; i++) {
15
+ let a = e[i], o = a[t];
16
+ if (o == null) continue;
17
+ let s = n.get(o);
18
+ if (s) s.push(a), r.get(o).set(a, s.length - 1);
19
+ else {
20
+ n.set(o, [a]);
21
+ let e = /* @__PURE__ */ new WeakMap();
22
+ e.set(a, 0), r.set(o, e);
23
+ }
24
+ }
25
+ this.storage.indexes.set(t, n), this.storage.itemPositions.set(t, r);
26
+ }
27
+ getByValue(e, t) {
28
+ let n = this.storage.indexes.get(e);
29
+ return n ? n.get(t) ?? [] : [];
30
+ }
31
+ getByValues(e, t) {
32
+ let n = this.storage.indexes.get(e);
33
+ if (!n) return [];
34
+ if (t.length === 1) return n.get(t[0]) ?? [];
35
+ if (t.length === 2) {
36
+ let e = n.get(t[0]), r = n.get(t[1]);
37
+ return e ? r ? e.concat(r) : e : r ?? [];
38
+ }
39
+ let r = [];
40
+ for (let e = 0; e < t.length; e++) {
41
+ let i = n.get(t[e]);
42
+ if (i !== void 0) for (let e = 0; e < i.length; e++) r.push(i[e]);
43
+ }
44
+ return r;
45
+ }
46
+ hasIndex(e) {
47
+ return this.storage.indexes.has(e);
48
+ }
49
+ addItem(e) {
50
+ for (let t of this.storage.indexes.keys()) this.addItemToField(t, e);
51
+ }
52
+ updateItem(e, t) {
53
+ for (let n of this.storage.indexes.keys()) this.updateItemInField(n, e, t);
54
+ }
55
+ removeItem(e) {
56
+ for (let t of this.storage.indexes.keys()) this.removeItemFromField(t, e);
57
+ }
58
+ clear() {
59
+ this.storage.indexes.clear(), this.storage.itemPositions.clear();
60
+ }
61
+ getIndexMap(e) {
62
+ return this.storage.indexes.get(e);
63
+ }
64
+ removeItemFromField(e, t) {
65
+ let n = t[e];
66
+ if (n == null) return;
67
+ let r = this.storage.indexes.get(e), i = this.storage.itemPositions.get(e), a = r?.get(n), o = i?.get(n), s = o?.get(t);
68
+ if (!r || !i || !a || !o || s === void 0) return;
69
+ let c = a.length - 1, l = a[c];
70
+ s !== c && (a[s] = l, o.set(l, s)), a.pop(), o.delete(t), a.length === 0 && (r.delete(n), i.delete(n));
71
+ }
72
+ updateItemInField(e, t, n) {
73
+ let r = t[e];
74
+ if (r === n[e]) {
75
+ if (r == null) return;
76
+ this.replaceItemReferenceInField(e, r, t, n);
77
+ return;
78
+ }
79
+ this.removeItemFromField(e, t), this.addItemToField(e, n);
80
+ }
81
+ replaceItemReferenceInField(e, t, n, r) {
82
+ let i = this.storage.indexes.get(e), a = this.storage.itemPositions.get(e), o = i?.get(t), s = a?.get(t), c = s?.get(n);
83
+ !o || !s || c === void 0 || (o[c] = r, s.delete(n), s.set(r, c));
84
+ }
85
+ addItemToField(e, t) {
86
+ let n = t[e];
87
+ if (n == null) return;
88
+ let r = this.storage.indexes.get(e), i = this.storage.itemPositions.get(e);
89
+ if (!r || !i) return;
90
+ let a = r.get(n), o = i.get(n);
91
+ if (a && o) {
92
+ a.push(t), o.set(t, a.length - 1);
93
+ return;
94
+ }
95
+ r.set(n, [t]);
96
+ let s = /* @__PURE__ */ new WeakMap();
97
+ s.set(t, 0), i.set(n, s);
98
+ }
99
+ };
100
+ //#endregion
101
+ export { e as Indexer };
@@ -0,0 +1,6 @@
1
+ export declare function createChainMethodDescriptor<TValue>(value: TValue): PropertyDescriptor;
2
+ export declare function createNestedFieldDescriptor(fieldPath: string): {
3
+ collectionKey: string;
4
+ nestedKey: string;
5
+ } | null;
6
+ //# sourceMappingURL=internal.d.ts.map
@@ -15,4 +15,4 @@ function t(e) {
15
15
  };
16
16
  }
17
17
  //#endregion
18
- export { t as n, e as t };
18
+ export { e as createChainMethodDescriptor, t as createNestedFieldDescriptor };
@@ -0,0 +1,9 @@
1
+ import type { CollectionItem } from "../types";
2
+ import type { MergeEnginesChain, MergeEnginesChainCallbacks } from "./types";
3
+ export type { MergeEnginesChain, MergeModuleName } from "./types";
4
+ export declare class MergeEnginesChainBuilder<T extends CollectionItem> {
5
+ private readonly callbacks;
6
+ constructor(callbacks: MergeEnginesChainCallbacks<T>);
7
+ create(result: T[]): T[] & MergeEnginesChain<T>;
8
+ }
9
+ //# sourceMappingURL=chain.d.ts.map
@@ -0,0 +1,23 @@
1
+ import { createChainMethodDescriptor as e } from "../internal.mjs";
2
+ //#region src/merge/chain.ts
3
+ var t = class {
4
+ constructor(e) {
5
+ this.callbacks = e;
6
+ }
7
+ create(t) {
8
+ let n = t;
9
+ return Object.defineProperties(n, {
10
+ search: e((e, t) => t === void 0 ? this.callbacks.search(e) : this.callbacks.search(e, t)),
11
+ sort: e((e, n, r) => n === void 0 ? this.callbacks.sort(t, e, r) : this.callbacks.sort(e, n, r)),
12
+ filter: e((e, n) => n === void 0 ? this.callbacks.filter(t, e) : this.callbacks.filter(e, n)),
13
+ add: e((e) => this.callbacks.add(e)),
14
+ update: e((e) => this.callbacks.update(e)),
15
+ clearIndexes: e((e) => (this.callbacks.clearIndexes(e), this.create(t))),
16
+ clearData: e((e) => (this.callbacks.clearData(e), this.create(t))),
17
+ data: e((e) => this.callbacks.data(e)),
18
+ getOriginData: e(() => this.callbacks.getOriginData())
19
+ }), n;
20
+ }
21
+ };
22
+ //#endregion
23
+ export { t as MergeEnginesChainBuilder };
@@ -0,0 +1,6 @@
1
+ export declare const MODULE_TO_ENGINE: {
2
+ readonly search: "TextSearchEngine";
3
+ readonly sort: "SortEngine";
4
+ readonly filter: "FilterEngine";
5
+ };
6
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1,8 @@
1
+ //#region src/merge/constants.ts
2
+ var e = {
3
+ search: "TextSearchEngine",
4
+ sort: "SortEngine",
5
+ filter: "FilterEngine"
6
+ };
7
+ //#endregion
8
+ export { e as MODULE_TO_ENGINE };
@@ -0,0 +1,8 @@
1
+ import type { MergeModuleName } from "./types";
2
+ export declare class MergeEnginesError extends Error {
3
+ constructor(message: string);
4
+ static unavailableEngine(module: MergeModuleName): MergeEnginesError;
5
+ static unavailableGetOriginData(): MergeEnginesError;
6
+ static invalidFilterByPreviousResultOption(): MergeEnginesError;
7
+ }
8
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1,19 @@
1
+ import { MODULE_TO_ENGINE as e } from "./constants.mjs";
2
+ //#region src/merge/errors.ts
3
+ var t = class t extends Error {
4
+ constructor(e) {
5
+ super(e), this.name = "MergeEnginesError";
6
+ }
7
+ static unavailableEngine(n) {
8
+ let r = e[n];
9
+ return new t(`MergeEngines: ${r} is not available.`);
10
+ }
11
+ static unavailableGetOriginData() {
12
+ return new t("MergeEngines: getOriginData is not available.");
13
+ }
14
+ static invalidFilterByPreviousResultOption() {
15
+ return new t("MergeEngines: \"filter.filterByPreviousResult\" is not supported. Configure \"filterByPreviousResult\" on the MergeEngines root options.");
16
+ }
17
+ };
18
+ //#endregion
19
+ export { t as MergeEnginesError };
@@ -1,2 +1,2 @@
1
- import { t as e } from "../chunk-BURK5sks.mjs";
1
+ import { MergeEngines as e } from "./merge-engines.mjs";
2
2
  export { e as MergeEngines };