@fireflysemantics/slice 15.0.18 → 15.0.24
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.
- package/README.md +1 -0
- package/esm2020/lib/AbstractStore.mjs +296 -0
- package/{esm2015/lib/EStore.js → esm2020/lib/EStore.mjs} +10 -10
- package/esm2020/lib/Slice.mjs +222 -0
- package/esm2020/lib/utilities.mjs +226 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +1 -1
- package/fesm2015/{fireflysemantics-slice.js → fireflysemantics-slice.mjs} +35 -22
- package/fesm2015/fireflysemantics-slice.mjs.map +1 -0
- package/fesm2020/fireflysemantics-slice.mjs +1494 -0
- package/fesm2020/fireflysemantics-slice.mjs.map +1 -0
- package/lib/models/Predicate.d.ts +1 -1
- package/lib/models/scrollPosition.d.ts +1 -1
- package/lib/utilities.d.ts +12 -1
- package/package.json +22 -9
- package/bundles/fireflysemantics-slice.umd.js +0 -1891
- package/bundles/fireflysemantics-slice.umd.js.map +0 -1
- package/esm2015/lib/AbstractStore.js +0 -296
- package/esm2015/lib/Slice.js +0 -222
- package/esm2015/lib/utilities.js +0 -213
- package/fesm2015/fireflysemantics-slice.js.map +0 -1
- /package/{esm2015/fireflysemantics-slice.js → esm2020/fireflysemantics-slice.mjs} +0 -0
- /package/{esm2015/lib/OStore.js → esm2020/lib/OStore.mjs} +0 -0
- /package/{esm2015/lib/models/ActionTypes.js → esm2020/lib/models/ActionTypes.mjs} +0 -0
- /package/{esm2015/lib/models/Delta.js → esm2020/lib/models/Delta.mjs} +0 -0
- /package/{esm2015/lib/models/Entity.js → esm2020/lib/models/Entity.mjs} +0 -0
- /package/{esm2015/lib/models/Predicate.js → esm2020/lib/models/Predicate.mjs} +0 -0
- /package/{esm2015/lib/models/StoreConfig.js → esm2020/lib/models/StoreConfig.mjs} +0 -0
- /package/{esm2015/lib/models/constants.js → esm2020/lib/models/constants.mjs} +0 -0
- /package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
- /package/{esm2015/lib/models/scrollPosition.js → esm2020/lib/models/scrollPosition.mjs} +0 -0
- /package/{fireflysemantics-slice.d.ts → index.d.ts} +0 -0
@@ -0,0 +1,222 @@
|
|
1
|
+
import { AbstractStore } from "./AbstractStore";
|
2
|
+
const { isArray } = Array;
|
3
|
+
export class Slice extends AbstractStore {
|
4
|
+
/**
|
5
|
+
* perform initial notification to all observers,
|
6
|
+
* such that operations like {@link combineLatest}{}
|
7
|
+
* will execute at least once.
|
8
|
+
*
|
9
|
+
* @param label The slice label
|
10
|
+
* @param predicate The slice predicate
|
11
|
+
* @param eStore The EStore instance containing the elements considered for slicing
|
12
|
+
*
|
13
|
+
* @example
|
14
|
+
<pre>
|
15
|
+
//Empty slice
|
16
|
+
new Slice<Todo>(Todo.COMPLETE, todo=>!todo.complete);
|
17
|
+
|
18
|
+
//Initialized slice
|
19
|
+
let todos = [new Todo(false, "You complete me!"),
|
20
|
+
new Todo(true, "You completed me!")];
|
21
|
+
new Slice<Todo>(Todo.COMPLETE, todo=>!todo.complete, todos);
|
22
|
+
</pre>
|
23
|
+
*/
|
24
|
+
constructor(label, predicate, eStore) {
|
25
|
+
super();
|
26
|
+
this.label = label;
|
27
|
+
this.predicate = predicate;
|
28
|
+
this.eStore = eStore;
|
29
|
+
/* The slice element entries */
|
30
|
+
this.entries = new Map();
|
31
|
+
const entities = eStore.allSnapshot();
|
32
|
+
this.config = eStore.config;
|
33
|
+
let passed = this.test(predicate, entities);
|
34
|
+
const delta = { type: "Initialize" /* ActionTypes.INTIALIZE */, entries: passed };
|
35
|
+
this.post(passed);
|
36
|
+
this.notifyDelta.next(delta);
|
37
|
+
}
|
38
|
+
/**
|
39
|
+
* Add the element if it satisfies the predicate
|
40
|
+
* and notify subscribers that an element was added.
|
41
|
+
*
|
42
|
+
* @param e The element to be considered for slicing
|
43
|
+
*/
|
44
|
+
post(e) {
|
45
|
+
if (isArray(e)) {
|
46
|
+
this.postA(e);
|
47
|
+
}
|
48
|
+
else {
|
49
|
+
if (this.predicate(e)) {
|
50
|
+
const id = e[this.config.guidKey];
|
51
|
+
this.entries.set(id, e);
|
52
|
+
const delta = { type: "Post" /* ActionTypes.POST */, entries: [e] };
|
53
|
+
this.notifyAll([...Array.from(this.entries.values())], delta);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
57
|
+
/**
|
58
|
+
* Add the elements if they satisfy the predicate
|
59
|
+
* and notify subscribers that elements were added.
|
60
|
+
*
|
61
|
+
* @param e The element to be considered for slicing
|
62
|
+
*/
|
63
|
+
postN(...e) {
|
64
|
+
this.postA(e);
|
65
|
+
}
|
66
|
+
/**
|
67
|
+
* Add the elements if they satisfy the predicate
|
68
|
+
* and notify subscribers that elements were added.
|
69
|
+
*
|
70
|
+
* @param e The element to be considered for slicing
|
71
|
+
*/
|
72
|
+
postA(e) {
|
73
|
+
const d = [];
|
74
|
+
e.forEach(e => {
|
75
|
+
if (this.predicate(e)) {
|
76
|
+
const id = e[this.config.guidKey];
|
77
|
+
this.entries.set(id, e);
|
78
|
+
d.push(e);
|
79
|
+
}
|
80
|
+
});
|
81
|
+
const delta = { type: "Post" /* ActionTypes.POST */, entries: d };
|
82
|
+
this.notifyAll([...Array.from(this.entries.values())], delta);
|
83
|
+
}
|
84
|
+
/**
|
85
|
+
* Delete an element from the slice.
|
86
|
+
*
|
87
|
+
* @param e The element to be deleted if it satisfies the predicate
|
88
|
+
*/
|
89
|
+
delete(e) {
|
90
|
+
if (isArray(e)) {
|
91
|
+
this.deleteA(e);
|
92
|
+
}
|
93
|
+
else {
|
94
|
+
if (this.predicate(e)) {
|
95
|
+
const id = e[this.config.guidKey];
|
96
|
+
this.entries.delete(id);
|
97
|
+
const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: [e] };
|
98
|
+
this.notifyAll(Array.from(this.entries.values()), delta);
|
99
|
+
}
|
100
|
+
}
|
101
|
+
}
|
102
|
+
/**
|
103
|
+
* @param e The elements to be deleted if it satisfies the predicate
|
104
|
+
*/
|
105
|
+
deleteN(...e) {
|
106
|
+
this.deleteA(e);
|
107
|
+
}
|
108
|
+
/**
|
109
|
+
* @param e The elements to be deleted if they satisfy the predicate
|
110
|
+
*/
|
111
|
+
deleteA(e) {
|
112
|
+
const d = [];
|
113
|
+
e.forEach(e => {
|
114
|
+
if (this.predicate(e)) {
|
115
|
+
const id = e[this.config.guidKey];
|
116
|
+
d.push(this.entries.get(id));
|
117
|
+
this.entries.delete(id);
|
118
|
+
}
|
119
|
+
});
|
120
|
+
const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: d };
|
121
|
+
this.notifyAll([...Array.from(this.entries.values())], delta);
|
122
|
+
}
|
123
|
+
/**
|
124
|
+
* Update the slice when an Entity instance mutates.
|
125
|
+
*
|
126
|
+
* @param e The element to be added or deleted depending on predicate reevaluation
|
127
|
+
*/
|
128
|
+
put(e) {
|
129
|
+
if (isArray(e)) {
|
130
|
+
this.putA(e);
|
131
|
+
}
|
132
|
+
else {
|
133
|
+
const id = e[this.config.guidKey];
|
134
|
+
if (this.entries.get(id)) {
|
135
|
+
if (!this.predicate(e)) {
|
136
|
+
//Note that this is a ActionTypes.DELETE because we are removing the
|
137
|
+
//entity from the slice.
|
138
|
+
const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: [e] };
|
139
|
+
this.entries.delete(id);
|
140
|
+
this.notifyAll([...Array.from(this.entries.values())], delta);
|
141
|
+
}
|
142
|
+
}
|
143
|
+
else if (this.predicate(e)) {
|
144
|
+
this.entries.set(id, e);
|
145
|
+
const delta = { type: "Put" /* ActionTypes.PUT */, entries: [e] };
|
146
|
+
this.notifyAll([...Array.from(this.entries.values())], delta);
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
/**
|
151
|
+
* Update the slice with mutated Entity instances.
|
152
|
+
*
|
153
|
+
* @param e The elements to be deleted if it satisfies the predicate
|
154
|
+
*/
|
155
|
+
putN(...e) {
|
156
|
+
this.putA(e);
|
157
|
+
}
|
158
|
+
/**
|
159
|
+
* @param e The elements to be put
|
160
|
+
*/
|
161
|
+
putA(e) {
|
162
|
+
const d = []; //instances to delete
|
163
|
+
const u = []; //instances to update
|
164
|
+
e.forEach(e => {
|
165
|
+
const id = e[this.config.guidKey];
|
166
|
+
if (this.entries.get(id)) {
|
167
|
+
if (!this.predicate(e)) {
|
168
|
+
d.push(this.entries.get(id));
|
169
|
+
}
|
170
|
+
}
|
171
|
+
else if (this.predicate(e)) {
|
172
|
+
u.push(e);
|
173
|
+
}
|
174
|
+
});
|
175
|
+
if (d.length > 0) {
|
176
|
+
d.forEach(e => {
|
177
|
+
this.entries.delete(e[this.config.guidKey]);
|
178
|
+
});
|
179
|
+
const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: d };
|
180
|
+
this.notifyAll([...Array.from(this.entries.values())], delta);
|
181
|
+
}
|
182
|
+
if (u.length > 0) {
|
183
|
+
u.forEach(e => {
|
184
|
+
this.entries.set(e[this.config.guidKey], e);
|
185
|
+
});
|
186
|
+
const delta = { type: "Put" /* ActionTypes.PUT */, entries: u };
|
187
|
+
this.notifyAll([...Array.from(this.entries.values())], delta);
|
188
|
+
}
|
189
|
+
}
|
190
|
+
/**
|
191
|
+
* Resets the slice to empty.
|
192
|
+
*/
|
193
|
+
reset() {
|
194
|
+
let delta = {
|
195
|
+
type: "Reset" /* ActionTypes.RESET */,
|
196
|
+
entries: [...Array.from(this.entries.values())]
|
197
|
+
};
|
198
|
+
this.notifyAll([], delta);
|
199
|
+
this.entries = new Map();
|
200
|
+
}
|
201
|
+
/**
|
202
|
+
* Utility method that applies the predicate to an array
|
203
|
+
* of entities and return the ones that pass the test.
|
204
|
+
*
|
205
|
+
* Used to create an initial set of values
|
206
|
+
* that should be part of the `Slice`.
|
207
|
+
*
|
208
|
+
* @param p
|
209
|
+
* @param e
|
210
|
+
* @return The the array of entities that pass the predicate test.
|
211
|
+
*/
|
212
|
+
test(p, e) {
|
213
|
+
let v = [];
|
214
|
+
e.forEach((e) => {
|
215
|
+
if (p(e)) {
|
216
|
+
v.push(e);
|
217
|
+
}
|
218
|
+
});
|
219
|
+
return v;
|
220
|
+
}
|
221
|
+
}
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2xpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zbGljZS9zcmMvbGliL1NsaWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUcvQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFBO0FBRXpCLE1BQU0sT0FBTyxLQUFTLFNBQVEsYUFBZ0I7SUFNMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCxZQUNXLEtBQWEsRUFDYixTQUF1QixFQUN2QixNQUFpQjtRQUN4QixLQUFLLEVBQUUsQ0FBQztRQUhELFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQVc7UUExQjVCLCtCQUErQjtRQUNmLFlBQU8sR0FBbUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQTJCaEQsTUFBTSxRQUFRLEdBQVEsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQTtRQUMzQixJQUFJLE1BQU0sR0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBYSxFQUFFLElBQUksMENBQXVCLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ3pFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBSSxDQUFDLENBQVU7UUFDWCxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FD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YTtZQUNsQixJQUFJLGlDQUFtQjtZQUN2QixPQUFPLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ2xELENBQUM7UUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxJQUFJLENBQUMsQ0FBZSxFQUFFLENBQU07UUFDL0IsSUFBSSxDQUFDLEdBQVEsRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFJLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNOLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDYjtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWx0YSwgQWN0aW9uVHlwZXMsIFByZWRpY2F0ZSB9IGZyb20gXCIuL21vZGVsc1wiXG5pbXBvcnQgeyBBYnN0cmFjdFN0b3JlIH0gZnJvbSBcIi4vQWJzdHJhY3RTdG9yZVwiXG5pbXBvcnQgeyBFU3RvcmUgfSBmcm9tIFwiLi9FU3RvcmVcIjtcblxuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheVxuXG5leHBvcnQgY2xhc3MgU2xpY2U8RT4gZXh0ZW5kcyBBYnN0cmFjdFN0b3JlPEU+IHtcblxuXG4gICAgLyogVGhlIHNsaWNlIGVsZW1lbnQgZW50cmllcyAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBlbnRyaWVzOiBNYXA8c3RyaW5nLCBFPiA9IG5ldyBNYXAoKTtcblxuICAgIC8qKlxuICAgICAqIHBlcmZvcm0gaW5pdGlhbCBub3RpZmljYXRpb24gdG8gYWxsIG9ic2VydmVycyxcbiAgICAgKiBzdWNoIHRoYXQgb3BlcmF0aW9ucyBsaWtlIHtAbGluayBjb21iaW5lTGF0ZXN0fXt9XG4gICAgICogd2lsbCBleGVjdXRlIGF0IGxlYXN0IG9uY2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBzbGljZSBsYWJlbFxuICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgVGhlIHNsaWNlIHByZWRpY2F0ZVxuICAgICAqIEBwYXJhbSBlU3RvcmUgVGhlIEVTdG9yZSBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBjb25zaWRlcmVkIGZvciBzbGljaW5nXG4gICAgICogXG4gICAgICogQGV4YW1wbGUgXG4gICAgICAgPHByZT5cbiAgICAgICAvL0VtcHR5IHNsaWNlXG4gICAgICAgbmV3IFNsaWNlPFRvZG8+KFRvZG8uQ09NUExFVEUsIHRvZG89PiF0b2RvLmNvbXBsZXRlKTtcbiAgXG4gICAgICAgLy9Jbml0aWFsaXplZCBzbGljZVxuICAgICAgIGxldCB0b2RvcyA9IFtuZXcgVG9kbyhmYWxzZSwgXCJZb3UgY29tcGxldGUgbWUhXCIpLCBcbiAgICAgICAgICAgICAgICAgICAgbmV3IFRvZG8odHJ1ZSwgXCJZb3UgY29tcGxldGVkIG1lIVwiKV07XG4gICAgICAgbmV3IFNsaWNlPFRvZG8+KFRvZG8uQ09NUExFVEUsIHRvZG89PiF0b2RvLmNvbXBsZXRlLCB0b2Rvcyk7XG4gICAgICAgPC9wcmU+XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBsYWJlbDogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcHJlZGljYXRlOiBQcmVkaWNhdGU8RT4sXG4gICAgICAgIHB1YmxpYyBlU3RvcmU6IEVTdG9yZTxFPikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBjb25zdCBlbnRpdGllczogRVtdID0gZVN0b3JlLmFsbFNuYXBzaG90KClcbiAgICAgICAgdGhpcy5jb25maWcgPSBlU3RvcmUuY29uZmlnXG4gICAgICAgIGxldCBwYXNzZWQ6IEVbXSA9IHRoaXMudGVzdChwcmVkaWNhdGUsIGVudGl0aWVzKTtcbiAgICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5JTlRJQUxJWkUsIGVudHJpZXM6IHBhc3NlZCB9O1xuICAgICAgICB0aGlzLnBvc3QocGFzc2VkKTtcbiAgICAgICAgdGhpcy5ub3RpZnlEZWx0YS5uZXh0KGRlbHRhKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGUgZWxlbWVudCBpZiBpdCBzYXRpc2ZpZXMgdGhlIHByZWRpY2F0ZVxuICAgICAqIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMgdGhhdCBhbiBlbGVtZW50IHdhcyBhZGRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlIFRoZSBlbGVtZW50IHRvIGJlIGNvbnNpZGVyZWQgZm9yIHNsaWNpbmdcbiAgICAgKi9cbiAgICBwb3N0KGU6IEUgfCBFW10pIHtcbiAgICAgICAgaWYgKGlzQXJyYXkoZSkpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdEEoZSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZWRpY2F0ZShlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gKDxhbnk+ZSlbdGhpcy5jb25maWcuZ3VpZEtleV07XG4gICAgICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChpZCwgZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QT1NULCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUFsbChbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXSwgZGVsdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHRoZSBlbGVtZW50cyBpZiB0aGV5IHNhdGlzZnkgdGhlIHByZWRpY2F0ZVxuICAgICAqIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMgdGhhdCBlbGVtZW50cyB3ZXJlIGFkZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnQgdG8gYmUgY29uc2lkZXJlZCBmb3Igc2xpY2luZ1xuICAgICAqL1xuICAgIHBvc3ROKC4uLmU6IEVbXSkge1xuICAgICAgICB0aGlzLnBvc3RBKGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGUgZWxlbWVudHMgaWYgdGhleSBzYXRpc2Z5IHRoZSBwcmVkaWNhdGVcbiAgICAgKiBhbmQgbm90aWZ5IHN1YnNjcmliZXJzIHRoYXQgZWxlbWVudHMgd2VyZSBhZGRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlIFRoZSBlbGVtZW50IHRvIGJlIGNvbnNpZGVyZWQgZm9yIHNsaWNpbmdcbiAgICAgKi9cbiAgICBwb3N0QShlOiBFW10pIHtcbiAgICAgICAgY29uc3QgZDogRVtdID0gW107XG4gICAgICAgIGUuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZWRpY2F0ZShlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gKDxhbnk+ZSlbdGhpcy5jb25maWcuZ3VpZEtleV07XG4gICAgICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChpZCwgZSk7XG4gICAgICAgICAgICAgICAgZC5wdXNoKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QT1NULCBlbnRyaWVzOiBkIH07XG4gICAgICAgIHRoaXMubm90aWZ5QWxsKFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldLCBkZWx0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGFuIGVsZW1lbnQgZnJvbSB0aGUgc2xpY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZSBUaGUgZWxlbWVudCB0byBiZSBkZWxldGVkIGlmIGl0IHNhdGlzZmllcyB0aGUgcHJlZGljYXRlXG4gICAgICovXG4gICAgZGVsZXRlKGU6IEUgfCBFW10pIHtcbiAgICAgICAgaWYgKGlzQXJyYXkoZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlQShlKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJlZGljYXRlKGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSAoPGFueT5lKVt0aGlzLmNvbmZpZy5ndWlkS2V5XVxuICAgICAgICAgICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoaWQpXG4gICAgICAgICAgICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5ERUxFVEUsIGVudHJpZXM6IFtlXSB9XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlBbGwoQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLCBkZWx0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBlIFRoZSBlbGVtZW50cyB0byBiZSBkZWxldGVkIGlmIGl0IHNhdGlzZmllcyB0aGUgcHJlZGljYXRlXG4gICAgICovXG4gICAgZGVsZXRlTiguLi5lOiBFW10pIHtcbiAgICAgICAgdGhpcy5kZWxldGVBKGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBlIFRoZSBlbGVtZW50cyB0byBiZSBkZWxldGVkIGlmIHRoZXkgc2F0aXNmeSB0aGUgcHJlZGljYXRlXG4gICAgICovXG4gICAgZGVsZXRlQShlOiBFW10pIHtcbiAgICAgICAgY29uc3QgZDogRVtdID0gW11cbiAgICAgICAgZS5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJlZGljYXRlKGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSAoPGFueT5lKVt0aGlzLmNvbmZpZy5ndWlkS2V5XVxuICAgICAgICAgICAgICAgIGQucHVzaCh0aGlzLmVudHJpZXMuZ2V0KGlkKSEpXG4gICAgICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShpZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBkIH07XG4gICAgICAgIHRoaXMubm90aWZ5QWxsKFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldLCBkZWx0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBzbGljZSB3aGVuIGFuIEVudGl0eSBpbnN0YW5jZSBtdXRhdGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnQgdG8gYmUgYWRkZWQgb3IgZGVsZXRlZCBkZXBlbmRpbmcgb24gcHJlZGljYXRlIHJlZXZhbHVhdGlvblxuICAgICAqL1xuICAgIHB1dChlOiBFIHwgRVtdKSB7XG4gICAgICAgIGlmIChpc0FycmF5KGUpKSB7XG4gICAgICAgICAgICB0aGlzLnB1dEEoZSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gKDxhbnk+ZSlbdGhpcy5jb25maWcuZ3VpZEtleV07XG4gICAgICAgICAgICBpZiAodGhpcy5lbnRyaWVzLmdldChpZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucHJlZGljYXRlKGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vTm90ZSB0aGF0IHRoaXMgaXMgYSBBY3Rpb25UeXBlcy5ERUxFVEUgYmVjYXVzZSB3ZSBhcmUgcmVtb3ZpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vZW50aXR5IGZyb20gdGhlIHNsaWNlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLkRFTEVURSwgZW50cmllczogW2VdIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUFsbChbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXSwgZGVsdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGlkLCBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBVVCwgZW50cmllczogW2VdIH07XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlBbGwoWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV0sIGRlbHRhKTtcbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHNsaWNlIHdpdGggbXV0YXRlZCBFbnRpdHkgaW5zdGFuY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnRzIHRvIGJlIGRlbGV0ZWQgaWYgaXQgc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGVcbiAgICAgKi9cbiAgICBwdXROKC4uLmU6IEVbXSkge1xuICAgICAgICB0aGlzLnB1dEEoZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnRzIHRvIGJlIHB1dFxuICAgICAqL1xuICAgIHB1dEEoZTogRVtdKSB7XG4gICAgICAgIGNvbnN0IGQ6IEVbXSA9IFtdOyAvL2luc3RhbmNlcyB0byBkZWxldGVcbiAgICAgICAgY29uc3QgdTogRVtdID0gW107IC8vaW5zdGFuY2VzIHRvIHVwZGF0ZVxuICAgICAgICBlLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9ICg8YW55PmUpW3RoaXMuY29uZmlnLmd1aWRLZXldO1xuICAgICAgICAgICAgaWYgKHRoaXMuZW50cmllcy5nZXQoaWQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnByZWRpY2F0ZShlKSkge1xuICAgICAgICAgICAgICAgICAgICBkLnB1c2godGhpcy5lbnRyaWVzLmdldChpZCkhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJlZGljYXRlKGUpKSB7XG4gICAgICAgICAgICAgICAgdS5wdXNoKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZC5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoKDxhbnk+ZSlbdGhpcy5jb25maWcuZ3VpZEtleV0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBkIH07XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUFsbChbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXSwgZGVsdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHUuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KCg8YW55PmUpW3RoaXMuY29uZmlnLmd1aWRLZXldLCBlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QVVQsIGVudHJpZXM6IHUgfTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5QWxsKFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldLCBkZWx0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHNsaWNlIHRvIGVtcHR5LlxuICAgICAqL1xuICAgIHJlc2V0KCkge1xuICAgICAgICBsZXQgZGVsdGE6IERlbHRhPEU+ID0ge1xuICAgICAgICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUkVTRVQsXG4gICAgICAgICAgICBlbnRyaWVzOiBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm5vdGlmeUFsbChbXSwgZGVsdGEpO1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCBhcHBsaWVzIHRoZSBwcmVkaWNhdGUgdG8gYW4gYXJyYXlcbiAgICAgKiBvZiBlbnRpdGllcyBhbmQgcmV0dXJuIHRoZSBvbmVzIHRoYXQgcGFzcyB0aGUgdGVzdC5cbiAgICAgKlxuICAgICAqIFVzZWQgdG8gY3JlYXRlIGFuIGluaXRpYWwgc2V0IG9mIHZhbHVlc1xuICAgICAqIHRoYXQgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIGBTbGljZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcFxuICAgICAqIEBwYXJhbSBlXG4gICAgICogQHJldHVybiBUaGUgdGhlIGFycmF5IG9mIGVudGl0aWVzIHRoYXQgcGFzcyB0aGUgcHJlZGljYXRlIHRlc3QuXG4gICAgICovXG4gICAgcHVibGljIHRlc3QocDogUHJlZGljYXRlPEU+LCBlOiBFW10pOiBFW10ge1xuICAgICAgICBsZXQgdjogRVtdID0gW107XG4gICAgICAgIGUuZm9yRWFjaCgoZTogRSkgPT4ge1xuICAgICAgICAgICAgaWYgKHAoZSkpIHtcbiAgICAgICAgICAgICAgICB2LnB1c2goZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdjtcbiAgICB9XG59XG4iXX0=
|
@@ -0,0 +1,226 @@
|
|
1
|
+
import { ESTORE_CONFIG_DEFAULT } from "./AbstractStore";
|
2
|
+
import { fromEvent, of } from 'rxjs';
|
3
|
+
import { switchMap, pairwise, debounceTime, distinctUntilChanged, map, filter } from 'rxjs/operators';
|
4
|
+
import { nanoid } from "nanoid";
|
5
|
+
/**
|
6
|
+
* Returns all the entities are distinct by the
|
7
|
+
* `property` value argument.
|
8
|
+
*
|
9
|
+
* Note that the implementation uses a `Map<string, E>` to
|
10
|
+
* index the entities by key. Therefore the more recent occurences
|
11
|
+
* matching a key instance will overwrite the previous ones.
|
12
|
+
*
|
13
|
+
* @param property The name of the property to check for distinct values by.
|
14
|
+
* @param entities The entities in the array.
|
15
|
+
*
|
16
|
+
* @example
|
17
|
+
```
|
18
|
+
let todos: Todo[] = [
|
19
|
+
{ id: 1, title: "Lets do it!" },
|
20
|
+
{ id: 1, title: "Lets do it again!" },
|
21
|
+
{ id: 2, title: "All done!" }
|
22
|
+
];
|
23
|
+
|
24
|
+
let todos2: Todo[] = [
|
25
|
+
{ id: 1, title: "Lets do it!" },
|
26
|
+
{ id: 2, title: "All done!" }
|
27
|
+
];
|
28
|
+
|
29
|
+
expect(distinct(todos, "id").length).toEqual(2);
|
30
|
+
expect(distinct(todos2, "id").length).toEqual(2);
|
31
|
+
|
32
|
+
```
|
33
|
+
*/
|
34
|
+
export function distinct(entities, property) {
|
35
|
+
const entitiesByProperty = new Map(entities.map(e => [e[property], e]));
|
36
|
+
return Array.from(entitiesByProperty.values());
|
37
|
+
}
|
38
|
+
/**
|
39
|
+
* Returns true if all the entities are distinct by the
|
40
|
+
* `property` value argument.
|
41
|
+
*
|
42
|
+
* @param property The name of the property to check for distinct values by.
|
43
|
+
* @param entities The entities in the array.
|
44
|
+
*
|
45
|
+
* @example
|
46
|
+
*
|
47
|
+
```
|
48
|
+
let todos: Todo[] = [
|
49
|
+
{ id: 1, title: "Lets do it!" },
|
50
|
+
{ id: 1, title: "Lets do it again!" },
|
51
|
+
{ id: 2, title: "All done!" }
|
52
|
+
];
|
53
|
+
|
54
|
+
let todos2: Todo[] = [
|
55
|
+
{ id: 1, title: "Lets do it!" },
|
56
|
+
{ id: 2, title: "All done!" }
|
57
|
+
];
|
58
|
+
|
59
|
+
expect(unique(todos, "id")).toBeFalsy();
|
60
|
+
expect(unique(todos2, "id")).toBeTruthy();
|
61
|
+
```
|
62
|
+
*/
|
63
|
+
export function unique(entities, property) {
|
64
|
+
return entities.length == distinct(entities, property).length ? true : false;
|
65
|
+
}
|
66
|
+
/**
|
67
|
+
* Create a global ID
|
68
|
+
* @return The global id.
|
69
|
+
*
|
70
|
+
* @example
|
71
|
+
* let e.guid = GUID();
|
72
|
+
*/
|
73
|
+
export function GUID() {
|
74
|
+
return nanoid();
|
75
|
+
}
|
76
|
+
/**
|
77
|
+
* Set the global identfication property on the instance.
|
78
|
+
*
|
79
|
+
* @param e Entity we want to set the global identifier on.
|
80
|
+
* @param gid The name of the `gid` property. If not specified it defaults to `ESTORE_CONFIG_DEFAULT.guidKey`.
|
81
|
+
*/
|
82
|
+
export function attachGUID(e, gid) {
|
83
|
+
const guidKey = gid ? gid : ESTORE_CONFIG_DEFAULT.guidKey;
|
84
|
+
let id = nanoid();
|
85
|
+
e[guidKey] = id;
|
86
|
+
return id;
|
87
|
+
}
|
88
|
+
/**
|
89
|
+
* Set the global identfication property on the instance.
|
90
|
+
*
|
91
|
+
* @param e[] Entity array we want to set the global identifiers on.
|
92
|
+
* @param gid The name of the `gid` property. If not specified it defaults to `gid`.
|
93
|
+
*/
|
94
|
+
export function attachGUIDs(e, gid) {
|
95
|
+
e.forEach(e => {
|
96
|
+
attachGUID(e, gid);
|
97
|
+
});
|
98
|
+
}
|
99
|
+
/**
|
100
|
+
* Create a shallow copy of the argument.
|
101
|
+
* @param o The object to copy
|
102
|
+
*/
|
103
|
+
export function shallowCopy(o) {
|
104
|
+
return { ...o };
|
105
|
+
}
|
106
|
+
/**
|
107
|
+
* Create a deep copy of the argument.
|
108
|
+
* @param o The object to copy
|
109
|
+
*/
|
110
|
+
export function deepCopy(o) {
|
111
|
+
return JSON.parse(JSON.stringify(o));
|
112
|
+
}
|
113
|
+
/**
|
114
|
+
* Gets the current active value from the `active`
|
115
|
+
* Map.
|
116
|
+
*
|
117
|
+
* This is used for the scenario where we are managing
|
118
|
+
* a single active instance. For example
|
119
|
+
* when selecting a book from a collection of books.
|
120
|
+
*
|
121
|
+
* The selected `Book` instance becomes the active value.
|
122
|
+
*
|
123
|
+
* @example
|
124
|
+
* const book:Book = getActiveValue(bookStore.active);
|
125
|
+
* @param m
|
126
|
+
*/
|
127
|
+
export function getActiveValue(m) {
|
128
|
+
if (m.size) {
|
129
|
+
return m.entries().next().value[1];
|
130
|
+
}
|
131
|
+
return null;
|
132
|
+
}
|
133
|
+
/**
|
134
|
+
* The method can be used to exclude keys from an instance
|
135
|
+
* of type `E`.
|
136
|
+
*
|
137
|
+
* We can use this to exclude values when searching an object.
|
138
|
+
*
|
139
|
+
* @param entity An instance of type E
|
140
|
+
* @param exclude The keys to exclude
|
141
|
+
*
|
142
|
+
* @example
|
143
|
+
* todo = { id: '1', description: 'Do it!' }
|
144
|
+
* let keys = excludeKeys<Todo>(todo, ['id]);
|
145
|
+
* // keys = ['description']
|
146
|
+
*/
|
147
|
+
export function excludeKeys(entity, exclude) {
|
148
|
+
const keys = Object.keys(entity);
|
149
|
+
return keys.filter((key) => {
|
150
|
+
return exclude.indexOf(key) < 0;
|
151
|
+
});
|
152
|
+
}
|
153
|
+
/**
|
154
|
+
*
|
155
|
+
* @param entities The entity to search
|
156
|
+
* @param exclude Keys to exclude from each entity
|
157
|
+
*
|
158
|
+
* @return E[] Array of entities with properties containing the search term.
|
159
|
+
*/
|
160
|
+
export function search(query = '', entities, exclude = []) {
|
161
|
+
const { isArray } = Array;
|
162
|
+
query = query.toLowerCase();
|
163
|
+
return entities.filter(function (e) {
|
164
|
+
//Do the keys calculation on each instance e:E
|
165
|
+
//because an instance can have optional parameters,
|
166
|
+
//and thus we have to check each instance, not just
|
167
|
+
//the first one in the array.
|
168
|
+
const keys = excludeKeys(e, exclude);
|
169
|
+
return keys.some((key) => {
|
170
|
+
const value = e[key];
|
171
|
+
if (!value) {
|
172
|
+
return false;
|
173
|
+
}
|
174
|
+
if (isArray(value)) {
|
175
|
+
return value.some(v => {
|
176
|
+
return String(v).toLowerCase().includes(query);
|
177
|
+
});
|
178
|
+
}
|
179
|
+
else {
|
180
|
+
return String(value).toLowerCase().includes(query);
|
181
|
+
}
|
182
|
+
});
|
183
|
+
});
|
184
|
+
}
|
185
|
+
/**
|
186
|
+
* @param scrollable The element being scrolled
|
187
|
+
* @param debounceMS The number of milliseconds to debounce scroll events
|
188
|
+
* @param sp The function returning the scroll position coordinates.
|
189
|
+
* @return A boolean valued observable indicating whether the element is scrolling up or down
|
190
|
+
*/
|
191
|
+
export function scrollingUp(scrollable, debounceMS, sp) {
|
192
|
+
return fromEvent(scrollable, 'scroll').pipe(debounceTime(debounceMS), distinctUntilChanged(), map(v => sp()), pairwise(), switchMap(p => {
|
193
|
+
const y1 = p[0][1];
|
194
|
+
const y2 = p[1][1];
|
195
|
+
return y1 - y2 > 0 ? of(false) : of(true);
|
196
|
+
}));
|
197
|
+
}
|
198
|
+
/**
|
199
|
+
* Filters the entities properties to the set contained in the
|
200
|
+
* `keys` array.
|
201
|
+
*
|
202
|
+
* @param keys The array of keys that the entity be limited to
|
203
|
+
* @param entity The entity to map
|
204
|
+
* @return An entity instance that has only the keys provided in the keys array
|
205
|
+
*/
|
206
|
+
export function mapEntity(keys, entity) {
|
207
|
+
const result = {};
|
208
|
+
keys.forEach(k => {
|
209
|
+
result[k] = entity[k];
|
210
|
+
});
|
211
|
+
return result;
|
212
|
+
}
|
213
|
+
/**
|
214
|
+
* Returns an `Observable<E>` instance that
|
215
|
+
* filters for arguments where the property
|
216
|
+
* value matches the provided value.
|
217
|
+
*
|
218
|
+
* @param value The value targeted
|
219
|
+
* @param propertyName The name of the property to contain the value
|
220
|
+
* @param obs The Slice Object Store Observable
|
221
|
+
* @returns Observable<E>
|
222
|
+
*/
|
223
|
+
export function onFilteredEvent(value, propertyName, obs) {
|
224
|
+
return obs.pipe(filter((e) => !!(e && e[propertyName] === value)));
|
225
|
+
}
|
226
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2xpY2Uvc3JjL2xpYi91dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFjLFNBQVMsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNyRyxPQUFPLEVBQUUsTUFBTSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBRzlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBdUIsUUFBYSxFQUFFLFFBQVc7SUFDdkUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBSSxRQUFhLEVBQUUsUUFBaUI7SUFDeEQsT0FBTyxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUMvRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLElBQUk7SUFDbEIsT0FBTyxNQUFNLEVBQUUsQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFJLENBQUksRUFBRSxHQUFZO0lBQzlDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUE7SUFDekQsSUFBSSxFQUFFLEdBQVcsTUFBTSxFQUFFLENBQUM7SUFDcEIsQ0FBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUN0QixPQUFPLEVBQUUsQ0FBQTtBQUNYLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUksQ0FBTSxFQUFFLEdBQVk7SUFDakQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNaLFVBQVUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBSSxDQUFJO0lBQ2pDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ2xCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFJLENBQUk7SUFDOUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUksQ0FBYztJQUM5QyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUU7UUFDVixPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBSSxNQUFXLEVBQUUsT0FBaUI7SUFDM0QsTUFBTSxJQUFJLEdBQWEsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUN6QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxNQUFNLENBQUksUUFBZ0IsRUFBRSxFQUFFLFFBQWEsRUFBRSxVQUFvQixFQUFFO0lBQ2pGLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFFekIsS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUc1QixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFJO1FBQ25DLDhDQUE4QztRQUM5QyxtREFBbUQ7UUFDbkQsbURBQW1EO1FBQ25ELDZCQUE2QjtRQUM3QixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3hCLE1BQU0sS0FBSyxHQUFJLENBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNWLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDbEIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNwQixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pELENBQUMsQ0FBQyxDQUFDO2FBQ0o7aUJBQ0k7Z0JBQ0gsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BEO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3pCLFVBQWUsRUFDZixVQUFrQixFQUNsQixFQUFrQjtJQUNsQixPQUFPLFNBQVMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUN6QyxZQUFZLENBQUMsVUFBVSxDQUFDLEVBQ3hCLG9CQUFvQixFQUFFLEVBQ3RCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQ2QsUUFBUSxFQUFFLEVBQ1YsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2xCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNsQixPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMzQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQWEsRUFBRSxNQUFVO0lBQ2pELE1BQU0sTUFBTSxHQUFPLEVBQUUsQ0FBQTtJQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQSxFQUFFO1FBQ2QsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN2QixDQUFDLENBQUMsQ0FBQTtJQUNGLE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNGLE1BQU0sVUFBVSxlQUFlLENBQzlCLEtBQVUsRUFDVixZQUFvQixFQUNwQixHQUFrQjtJQUVsQixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRVNUT1JFX0NPTkZJR19ERUZBVUxUIH0gZnJvbSBcIi4vQWJzdHJhY3RTdG9yZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbUV2ZW50LCBvZiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHBhaXJ3aXNlLCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgbmFub2lkfSBmcm9tIFwibmFub2lkXCJcbmltcG9ydCB7IHNjcm9sbFBvc2l0aW9uIH0gZnJvbSBcIi4vbW9kZWxzL3Njcm9sbFBvc2l0aW9uXCI7XG5cbi8qKlxuICogUmV0dXJucyBhbGwgdGhlIGVudGl0aWVzIGFyZSBkaXN0aW5jdCBieSB0aGUgXG4gKiBgcHJvcGVydHlgIHZhbHVlIGFyZ3VtZW50LiAgXG4gKiBcbiAqIE5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gdXNlcyBhIGBNYXA8c3RyaW5nLCBFPmAgdG9cbiAqIGluZGV4IHRoZSBlbnRpdGllcyBieSBrZXkuICBUaGVyZWZvcmUgdGhlIG1vcmUgcmVjZW50IG9jY3VyZW5jZXMgXG4gKiBtYXRjaGluZyBhIGtleSBpbnN0YW5jZSB3aWxsIG92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgb25lcy5cbiAqIFxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3IgZGlzdGluY3QgdmFsdWVzIGJ5LlxuICogQHBhcmFtIGVudGl0aWVzIFRoZSBlbnRpdGllcyBpbiB0aGUgYXJyYXkuXG4gKiBcbiAqIEBleGFtcGxlXG4gYGBgXG4gIGxldCB0b2RvczogVG9kb1tdID0gW1xuICAgIHsgaWQ6IDEsIHRpdGxlOiBcIkxldHMgZG8gaXQhXCIgfSxcbiAgICB7IGlkOiAxLCB0aXRsZTogXCJMZXRzIGRvIGl0IGFnYWluIVwiIH0sXG4gICAgeyBpZDogMiwgdGl0bGU6IFwiQWxsIGRvbmUhXCIgfVxuICBdO1xuXG4gIGxldCB0b2RvczI6IFRvZG9bXSA9IFtcbiAgICB7IGlkOiAxLCB0aXRsZTogXCJMZXRzIGRvIGl0IVwiIH0sXG4gICAgeyBpZDogMiwgdGl0bGU6IFwiQWxsIGRvbmUhXCIgfVxuICBdO1xuXG4gIGV4cGVjdChkaXN0aW5jdCh0b2RvcywgXCJpZFwiKS5sZW5ndGgpLnRvRXF1YWwoMik7XG4gIGV4cGVjdChkaXN0aW5jdCh0b2RvczIsIFwiaWRcIikubGVuZ3RoKS50b0VxdWFsKDIpO1xuXG4gYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0aW5jdDxFLCBLIGV4dGVuZHMga2V5b2YgRT4oZW50aXRpZXM6IEVbXSwgcHJvcGVydHk6IEspOiBFW10ge1xuICBjb25zdCBlbnRpdGllc0J5UHJvcGVydHkgPSBuZXcgTWFwKGVudGl0aWVzLm1hcChlID0+IFtlW3Byb3BlcnR5XSwgZV0gYXMgW0VbS10sIEVdKSk7XG4gIHJldHVybiBBcnJheS5mcm9tKGVudGl0aWVzQnlQcm9wZXJ0eS52YWx1ZXMoKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFsbCB0aGUgZW50aXRpZXMgYXJlIGRpc3RpbmN0IGJ5IHRoZSBcbiAqIGBwcm9wZXJ0eWAgdmFsdWUgYXJndW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2sgZm9yIGRpc3RpbmN0IHZhbHVlcyBieS5cbiAqIEBwYXJhbSBlbnRpdGllcyBUaGUgZW50aXRpZXMgaW4gdGhlIGFycmF5LlxuICogXG4gKiBAZXhhbXBsZVxuICogXG4gYGBgXG4gIGxldCB0b2RvczogVG9kb1tdID0gW1xuICAgIHsgaWQ6IDEsIHRpdGxlOiBcIkxldHMgZG8gaXQhXCIgfSxcbiAgICB7IGlkOiAxLCB0aXRsZTogXCJMZXRzIGRvIGl0IGFnYWluIVwiIH0sXG4gICAgeyBpZDogMiwgdGl0bGU6IFwiQWxsIGRvbmUhXCIgfVxuICBdO1xuXG4gIGxldCB0b2RvczI6IFRvZG9bXSA9IFtcbiAgICB7IGlkOiAxLCB0aXRsZTogXCJMZXRzIGRvIGl0IVwiIH0sXG4gICAgeyBpZDogMiwgdGl0bGU6IFwiQWxsIGRvbmUhXCIgfVxuICBdO1xuXG4gIGV4cGVjdCh1bmlxdWUodG9kb3MsIFwiaWRcIikpLnRvQmVGYWxzeSgpO1xuICBleHBlY3QodW5pcXVlKHRvZG9zMiwgXCJpZFwiKSkudG9CZVRydXRoeSgpO1xuIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlPEU+KGVudGl0aWVzOiBFW10sIHByb3BlcnR5OiBrZXlvZiBFKTpib29sZWFuIHtcbiAgcmV0dXJuIGVudGl0aWVzLmxlbmd0aCA9PSBkaXN0aW5jdChlbnRpdGllcywgcHJvcGVydHkpLmxlbmd0aCA/IHRydWUgOiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBnbG9iYWwgSURcbiAqIEByZXR1cm4gVGhlIGdsb2JhbCBpZC5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGxldCBlLmd1aWQgPSBHVUlEKCk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHVUlEKCkge1xuICByZXR1cm4gbmFub2lkKCk7XG59XG5cbi8qKlxuICogU2V0IHRoZSBnbG9iYWwgaWRlbnRmaWNhdGlvbiBwcm9wZXJ0eSBvbiB0aGUgaW5zdGFuY2UuXG4gKiBcbiAqIEBwYXJhbSBlIEVudGl0eSB3ZSB3YW50IHRvIHNldCB0aGUgZ2xvYmFsIGlkZW50aWZpZXIgb24uXG4gKiBAcGFyYW0gZ2lkIFRoZSBuYW1lIG9mIHRoZSBgZ2lkYCBwcm9wZXJ0eS4gIElmIG5vdCBzcGVjaWZpZWQgaXQgZGVmYXVsdHMgdG8gYEVTVE9SRV9DT05GSUdfREVGQVVMVC5ndWlkS2V5YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaEdVSUQ8RT4oZTogRSwgZ2lkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZ3VpZEtleSA9IGdpZCA/IGdpZCA6IEVTVE9SRV9DT05GSUdfREVGQVVMVC5ndWlkS2V5XG4gIGxldCBpZDogc3RyaW5nID0gbmFub2lkKCk7XG4gICg8YW55PmUpW2d1aWRLZXldID0gaWRcbiAgcmV0dXJuIGlkXG59XG5cbi8qKlxuICogU2V0IHRoZSBnbG9iYWwgaWRlbnRmaWNhdGlvbiBwcm9wZXJ0eSBvbiB0aGUgaW5zdGFuY2UuXG4gKiBcbiAqIEBwYXJhbSBlW10gRW50aXR5IGFycmF5IHdlIHdhbnQgdG8gc2V0IHRoZSBnbG9iYWwgaWRlbnRpZmllcnMgb24uXG4gKiBAcGFyYW0gZ2lkIFRoZSBuYW1lIG9mIHRoZSBgZ2lkYCBwcm9wZXJ0eS4gIElmIG5vdCBzcGVjaWZpZWQgaXQgZGVmYXVsdHMgdG8gYGdpZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hHVUlEczxFPihlOiBFW10sIGdpZD86IHN0cmluZykge1xuICBlLmZvckVhY2goZSA9PiB7XG4gICAgYXR0YWNoR1VJRChlLCBnaWQpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBzaGFsbG93IGNvcHkgb2YgdGhlIGFyZ3VtZW50LlxuICogQHBhcmFtIG8gVGhlIG9iamVjdCB0byBjb3B5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93Q29weTxFPihvOiBFKSB7XG4gIHJldHVybiB7IC4uLm8gfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBkZWVwIGNvcHkgb2YgdGhlIGFyZ3VtZW50LlxuICogQHBhcmFtIG8gVGhlIG9iamVjdCB0byBjb3B5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ29weTxFPihvOiBFKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG8pKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50IGFjdGl2ZSB2YWx1ZSBmcm9tIHRoZSBgYWN0aXZlYFxuICogTWFwLiAgXG4gKiBcbiAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIHNjZW5hcmlvIHdoZXJlIHdlIGFyZSBtYW5hZ2luZ1xuICogYSBzaW5nbGUgYWN0aXZlIGluc3RhbmNlLiAgRm9yIGV4YW1wbGUgXG4gKiB3aGVuIHNlbGVjdGluZyBhIGJvb2sgZnJvbSBhIGNvbGxlY3Rpb24gb2YgYm9va3MuICBcbiAqIFxuICogVGhlIHNlbGVjdGVkIGBCb29rYCBpbnN0YW5jZSBiZWNvbWVzIHRoZSBhY3RpdmUgdmFsdWUuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBib29rOkJvb2sgPSBnZXRBY3RpdmVWYWx1ZShib29rU3RvcmUuYWN0aXZlKTtcbiAqIEBwYXJhbSBtIFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlVmFsdWU8RT4obTogTWFwPGFueSwgRT4pIHtcbiAgaWYgKG0uc2l6ZSkge1xuICAgIHJldHVybiBtLmVudHJpZXMoKS5uZXh0KCkudmFsdWVbMV07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogVGhlIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBleGNsdWRlIGtleXMgZnJvbSBhbiBpbnN0YW5jZVxuICogb2YgdHlwZSBgRWAuICBcbiAqIFxuICogV2UgY2FuIHVzZSB0aGlzIHRvIGV4Y2x1ZGUgdmFsdWVzIHdoZW4gc2VhcmNoaW5nIGFuIG9iamVjdC5cbiAqIFxuICogQHBhcmFtIGVudGl0eSBBbiBpbnN0YW5jZSBvZiB0eXBlIEVcbiAqIEBwYXJhbSBleGNsdWRlIFRoZSBrZXlzIHRvIGV4Y2x1ZGVcbiAqIFxuICogQGV4YW1wbGVcbiAqIHRvZG8gPSB7IGlkOiAnMScsIGRlc2NyaXB0aW9uOiAnRG8gaXQhJyB9XG4gKiBsZXQga2V5cyA9IGV4Y2x1ZGVLZXlzPFRvZG8+KHRvZG8sIFsnaWRdKTtcbiAqIC8vIGtleXMgPSBbJ2Rlc2NyaXB0aW9uJ11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4Y2x1ZGVLZXlzPEU+KGVudGl0eTogYW55LCBleGNsdWRlOiBzdHJpbmdbXSkge1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGVudGl0eSk7XG4gIHJldHVybiBrZXlzLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgcmV0dXJuIGV4Y2x1ZGUuaW5kZXhPZihrZXkpIDwgMDtcbiAgfSk7XG59XG5cbi8qKlxuICogXG4gKiBAcGFyYW0gZW50aXRpZXMgVGhlIGVudGl0eSB0byBzZWFyY2hcbiAqIEBwYXJhbSBleGNsdWRlIEtleXMgdG8gZXhjbHVkZSBmcm9tIGVhY2ggZW50aXR5XG4gKiBcbiAqIEByZXR1cm4gRVtdIEFycmF5IG9mIGVudGl0aWVzIHdpdGggcHJvcGVydGllcyBjb250YWluaW5nIHRoZSBzZWFyY2ggdGVybS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaDxFPihxdWVyeTogc3RyaW5nID0gJycsIGVudGl0aWVzOiBFW10sIGV4Y2x1ZGU6IHN0cmluZ1tdID0gW10pOiBFW10ge1xuICBjb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5XG5cbiAgcXVlcnkgPSBxdWVyeS50b0xvd2VyQ2FzZSgpO1xuXG5cbiAgcmV0dXJuIGVudGl0aWVzLmZpbHRlcihmdW5jdGlvbiAoZTogRSkge1xuICAgIC8vRG8gdGhlIGtleXMgY2FsY3VsYXRpb24gb24gZWFjaCBpbnN0YW5jZSBlOkVcbiAgICAvL2JlY2F1c2UgYW4gaW5zdGFuY2UgY2FuIGhhdmUgb3B0aW9uYWwgcGFyYW1ldGVycyxcbiAgICAvL2FuZCB0aHVzIHdlIGhhdmUgdG8gY2hlY2sgZWFjaCBpbnN0YW5jZSwgbm90IGp1c3RcbiAgICAvL3RoZSBmaXJzdCBvbmUgaW4gdGhlIGFycmF5LlxuICAgIGNvbnN0IGtleXMgPSBleGNsdWRlS2V5cyhlLCBleGNsdWRlKVxuICAgIHJldHVybiBrZXlzLnNvbWUoIChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gKGUgYXMgYW55KVtrZXldO1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNvbWUodiA9PiB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2KS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSk7XG4gICAgICB9XG4gICAgfSlcbiAgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHNjcm9sbGFibGUgVGhlIGVsZW1lbnQgYmVpbmcgc2Nyb2xsZWRcbiAqIEBwYXJhbSBkZWJvdW5jZU1TIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlYm91bmNlIHNjcm9sbCBldmVudHNcbiAqIEBwYXJhbSBzcCBUaGUgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzY3JvbGwgcG9zaXRpb24gY29vcmRpbmF0ZXMuXG4gKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZWQgb2JzZXJ2YWJsZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgc2Nyb2xsaW5nIHVwIG9yIGRvd25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbGluZ1VwKFxuICBzY3JvbGxhYmxlOiBhbnksIFxuICBkZWJvdW5jZU1TOiBudW1iZXIsIFxuICBzcDogc2Nyb2xsUG9zaXRpb24pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGZyb21FdmVudChzY3JvbGxhYmxlLCAnc2Nyb2xsJykucGlwZShcbiAgICBkZWJvdW5jZVRpbWUoZGVib3VuY2VNUyksIFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIFxuICAgIG1hcCh2ID0+IHNwKCkpLCBcbiAgICBwYWlyd2lzZSgpLCBcbiAgICBzd2l0Y2hNYXAocCA9PiB7XG4gICAgY29uc3QgeTEgPSBwWzBdWzFdXG4gICAgY29uc3QgeTIgPSBwWzFdWzFdXG4gICAgcmV0dXJuIHkxIC0geTIgPiAwID8gb2YoZmFsc2UpIDogb2YodHJ1ZSlcbiAgfSkpXG59XG5cbi8qKlxuICogRmlsdGVycyB0aGUgZW50aXRpZXMgcHJvcGVydGllcyB0byB0aGUgc2V0IGNvbnRhaW5lZCBpbiB0aGUgXG4gKiBga2V5c2AgYXJyYXkuXG4gKiAgXG4gKiBAcGFyYW0ga2V5cyBUaGUgYXJyYXkgb2Yga2V5cyB0aGF0IHRoZSBlbnRpdHkgYmUgbGltaXRlZCB0b1xuICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IHRvIG1hcFxuICogQHJldHVybiBBbiBlbnRpdHkgaW5zdGFuY2UgdGhhdCBoYXMgb25seSB0aGUga2V5cyBwcm92aWRlZCBpbiB0aGUga2V5cyBhcnJheSBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcEVudGl0eShrZXlzOnN0cmluZ1tdLCBlbnRpdHk6YW55KSB7XG4gIGNvbnN0IHJlc3VsdDphbnkgPSB7fVxuICBrZXlzLmZvckVhY2goaz0+e1xuICAgIHJlc3VsdFtrXSA9IGVudGl0eVtrXVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBgT2JzZXJ2YWJsZTxFPmAgaW5zdGFuY2UgdGhhdCBcbiAqIGZpbHRlcnMgZm9yIGFyZ3VtZW50cyB3aGVyZSB0aGUgcHJvcGVydHkgXG4gKiB2YWx1ZSBtYXRjaGVzIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAqIFxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0YXJnZXRlZFxuICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29udGFpbiB0aGUgdmFsdWVcbiAqIEBwYXJhbSBvYnMgVGhlIFNsaWNlIE9iamVjdCBTdG9yZSBPYnNlcnZhYmxlXG4gKiBAcmV0dXJucyBPYnNlcnZhYmxlPEU+XG4gKi9cbiBleHBvcnQgZnVuY3Rpb24gb25GaWx0ZXJlZEV2ZW50PEU+KFxuICB2YWx1ZTogYW55LFxuICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgb2JzOiBPYnNlcnZhYmxlPEU+XG4pOiBPYnNlcnZhYmxlPEU+IHtcbiAgcmV0dXJuIG9icy5waXBlKGZpbHRlcigoZTphbnkpID0+ICEhKGUgJiYgZVtwcm9wZXJ0eU5hbWVdID09PSB2YWx1ZSkpKTtcbn0iXX0=
|
@@ -7,4 +7,4 @@ export * from './lib/EStore';
|
|
7
7
|
export * from './lib/OStore';
|
8
8
|
export * from './lib/Slice';
|
9
9
|
export * from './lib/utilities';
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NsaWNlL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxlQUFlLENBQUE7QUFDN0IsY0FBYyxxQkFBcUIsQ0FBQTtBQUNuQyxjQUFjLGNBQWMsQ0FBQTtBQUM1QixjQUFjLGNBQWMsQ0FBQTtBQUM1QixjQUFjLGFBQWEsQ0FBQTtBQUMzQixjQUFjLGlCQUFpQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBzbGljZVxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy8nXG5leHBvcnQgKiBmcm9tICcuL2xpYi9BYnN0cmFjdFN0b3JlJ1xuZXhwb3J0ICogZnJvbSAnLi9saWIvRVN0b3JlJ1xuZXhwb3J0ICogZnJvbSAnLi9saWIvT1N0b3JlJ1xuZXhwb3J0ICogZnJvbSAnLi9saWIvU2xpY2UnXG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlsaXRpZXMnXG4iXX0=
|