pareto-core 0.1.257 → 0.1.259
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.
|
@@ -1,30 +1,129 @@
|
|
|
1
1
|
import * as p_di from "../../../interface/data.js";
|
|
2
2
|
import * as p_ri from "../../../interface/refiner.js";
|
|
3
3
|
import { type Abort } from "../../../interface/__internal/Abort.js";
|
|
4
|
+
/**
|
|
5
|
+
* Wraps a dictionary and provides entry lookup and transformation methods.
|
|
6
|
+
*/
|
|
4
7
|
export declare const dictionary: <T extends p_di.Value>(dict: p_di.Dictionary<T>) => {
|
|
8
|
+
/**
|
|
9
|
+
* Retrieves the entry with the given id.
|
|
10
|
+
* Calls `abort.no_such_entry` if no entry with that id exists.
|
|
11
|
+
* @param id the id of the entry to retrieve
|
|
12
|
+
* @param abort callbacks invoked on error; `no_such_entry` is called when the id is not found
|
|
13
|
+
* @returns the value of the entry
|
|
14
|
+
*/
|
|
5
15
|
get_entry(id: string, abort: {
|
|
6
16
|
no_such_entry: Abort<null>;
|
|
7
17
|
}): T;
|
|
18
|
+
/**
|
|
19
|
+
* Retrieves the entry with the given id if it exists, otherwise returns a not-set optional.
|
|
20
|
+
* @param id the id of the entry to retrieve
|
|
21
|
+
* @returns a set optional containing the entry value, or not-set if the id is not found
|
|
22
|
+
*/
|
|
8
23
|
get_possible_entry(id: string): p_di.Optional_Value<T>;
|
|
24
|
+
/**
|
|
25
|
+
* Converts the values of the dictionary to a new type using the provided assign_entry function.
|
|
26
|
+
* @param assign_entry function to convert each entry; receives the current value and the entry id
|
|
27
|
+
* @returns a new dictionary with the same ids and the converted values
|
|
28
|
+
*/
|
|
9
29
|
map: <New_Type extends p_di.Value>(assign_entry: (value: T, id: string) => New_Type) => p_di.Dictionary<New_Type>;
|
|
30
|
+
/**
|
|
31
|
+
* gives the entries in the dictionary a new id.
|
|
32
|
+
* if a duplicate id is found, the duplicate_id function is called to get the target dictionary
|
|
33
|
+
* typically, you will use this function in a way where you can guarantee that there will be no duplicate ids, and the duplicate_id function will never be called,
|
|
34
|
+
* so you typically will have a p_unreachable_code_path() call
|
|
35
|
+
*/
|
|
36
|
+
re_id: (get_id: ($: T, id: string) => string, on_duplicate_id: ($: T, id: string) => never) => p_di.Dictionary<T>;
|
|
37
|
+
/**
|
|
38
|
+
* Maps each entry to a resolved value, supporting cross-entry lookups during resolution.
|
|
39
|
+
*
|
|
40
|
+
* The `acyclic_lookup` allows looking up other entries that should not have any direct or indirect
|
|
41
|
+
* dependency on the current entry; they are resolved on the spot if not yet resolved.
|
|
42
|
+
* A `cycle_detected` abort is triggered if a cycle is found.
|
|
43
|
+
*
|
|
44
|
+
* The `cyclic_lookup` allows referencing entries that may depend on the current entry.
|
|
45
|
+
* It returns a handle whose `get_circular_dependent` must not be called until all entries
|
|
46
|
+
* in the dictionary have been fully resolved; accessing it too early triggers the
|
|
47
|
+
* `accessing_cyclic_sibling_before_it_is_resolved` abort.
|
|
48
|
+
*
|
|
49
|
+
* @param assign_entry function called for each entry with its value, id, and both lookup handles
|
|
50
|
+
* @returns a new dictionary containing the resolved values
|
|
51
|
+
*/
|
|
10
52
|
resolve: <Resolved extends p_di.Value>(assign_entry: (value: T, id: string, acyclic_lookup: p_ri.lookup.Acyclic<Resolved>, cyclic_lookup: p_ri.lookup.Cyclic<Resolved>) => Resolved) => p_di.Dictionary<Resolved>;
|
|
11
53
|
};
|
|
54
|
+
/**
|
|
55
|
+
* Wraps a list and provides conversion and transformation methods.
|
|
56
|
+
*/
|
|
12
57
|
export declare const list: <T extends p_di.Value>(list: p_di.List<T>) => {
|
|
58
|
+
/**
|
|
59
|
+
* Converts the list to a dictionary using the provided id and value functions.
|
|
60
|
+
* first asks for the id of an item, then for the value of that item.
|
|
61
|
+
* Calls `abort.duplicate_id` if two items produce the same id.
|
|
62
|
+
* @param get_id function to derive the dictionary key from each item
|
|
63
|
+
* @param get_value function to derive the dictionary value from each item
|
|
64
|
+
* @param abort callbacks invoked on error; `duplicate_id` is called with the conflicting id
|
|
65
|
+
* @returns a new dictionary built from the list items
|
|
66
|
+
*/
|
|
13
67
|
convert_to_dictionary: <NT extends p_di.Value>(get_id: (item: T) => string, get_value: (item: T) => NT, abort: {
|
|
14
68
|
duplicate_id: Abort<string>;
|
|
15
69
|
}) => p_di.Dictionary<NT>;
|
|
70
|
+
/**
|
|
71
|
+
* Converts the items in the list to a new type using the provided assign_item function.
|
|
72
|
+
* @param assign_item function to convert each item to a new value
|
|
73
|
+
* @returns a new list containing the converted values
|
|
74
|
+
*/
|
|
16
75
|
map: <New_Type extends p_di.Value>(assign_item: (item: T) => New_Type) => p_di.List<New_Type>;
|
|
76
|
+
/**
|
|
77
|
+
* Maps the items in the list to a new type while maintaining a state that is updated with each item.
|
|
78
|
+
* @param initial_state the initial value of the state before processing any items
|
|
79
|
+
* @param assign_item function to convert each item using the current state
|
|
80
|
+
* @param update_state function to produce the next state from the converted item and the current state
|
|
81
|
+
* @param wrapup function called once with the final converted list and the final state to produce the result
|
|
82
|
+
* @returns the result produced by `wrapup`
|
|
83
|
+
*/
|
|
17
84
|
map_with_state: <Target_Item extends p_di.Value, State, Result_Type extends {
|
|
18
85
|
[id: string]: p_di.Value;
|
|
19
86
|
}>(initial_state: State, assign_item: (item: T, state: State) => Target_Item, update_state: (item: Target_Item, state: State) => State, wrapup: (final_list: p_di.List<Target_Item>, final_state: State) => Result_Type) => Result_Type;
|
|
20
87
|
};
|
|
88
|
+
/**
|
|
89
|
+
* Wraps an optional value and provides methods to handle both the set and not-set cases.
|
|
90
|
+
*/
|
|
21
91
|
export declare const optional: <T extends p_di.Value>(optional_value: p_di.Optional_Value<T>) => {
|
|
92
|
+
/**
|
|
93
|
+
* Calls `if_set` with the wrapped value if it is set, otherwise calls `if_not_set`.
|
|
94
|
+
* @param if_set function to call with the value when it is set
|
|
95
|
+
* @param if_not_set function to call when the value is not set
|
|
96
|
+
* @returns the result of whichever function was called
|
|
97
|
+
*/
|
|
22
98
|
decide: <RT extends p_di.Value>(if_set: ($: T) => RT, if_not_set: () => RT) => RT;
|
|
99
|
+
/**
|
|
100
|
+
* Transforms the wrapped value using the provided function if it is set.
|
|
101
|
+
* If the value is not set, returns a not-set optional.
|
|
102
|
+
* @param assign_set_value function to transform the value
|
|
103
|
+
* @returns a new optional containing the transformed value, or not-set if the original was not set
|
|
104
|
+
*/
|
|
23
105
|
map: <New_Type extends p_di.Value>(assign_set_value: (value: T) => New_Type) => p_di.Optional_Value<New_Type>;
|
|
24
106
|
};
|
|
107
|
+
/**
|
|
108
|
+
* Wraps a state value and provides a method to produce a result from it.
|
|
109
|
+
*/
|
|
25
110
|
export declare const state: <State extends p_di.State>(state: State) => {
|
|
111
|
+
/**
|
|
112
|
+
* Passes the state to the provided function and returns the result.
|
|
113
|
+
* @param assign function to produce a result from the state
|
|
114
|
+
* @returns the result produced by `assign`
|
|
115
|
+
*/
|
|
26
116
|
decide: <RT extends p_di.Value>(assign: (output: State) => RT) => RT;
|
|
27
117
|
};
|
|
118
|
+
/**
|
|
119
|
+
* Wraps a string value and provides a method to convert it into a state.
|
|
120
|
+
*/
|
|
28
121
|
export declare const text: (string: string) => {
|
|
122
|
+
/**
|
|
123
|
+
* Converts the string into a state value using the provided function and context.
|
|
124
|
+
* @param context additional context passed to `assign_state`
|
|
125
|
+
* @param assign_state function that receives the context and the string and returns the state
|
|
126
|
+
* @returns the state produced by `assign_state`
|
|
127
|
+
*/
|
|
29
128
|
to_state: <State extends p_di.State, Context extends p_di.Value>(context: Context, assign_state: ($: Context, text: string) => State) => State;
|
|
30
129
|
};
|
|
@@ -3,8 +3,18 @@ import * as p_ri from "../../../interface/refiner.js";
|
|
|
3
3
|
import {} from "../../../interface/__internal/Abort.js";
|
|
4
4
|
import * as lit from "../sync/literal.js";
|
|
5
5
|
import { Dictionary_Class } from "../sync/primitives/Dictionary.js";
|
|
6
|
+
/**
|
|
7
|
+
* Wraps a dictionary and provides entry lookup and transformation methods.
|
|
8
|
+
*/
|
|
6
9
|
export const dictionary = (dict) => {
|
|
7
10
|
return {
|
|
11
|
+
/**
|
|
12
|
+
* Retrieves the entry with the given id.
|
|
13
|
+
* Calls `abort.no_such_entry` if no entry with that id exists.
|
|
14
|
+
* @param id the id of the entry to retrieve
|
|
15
|
+
* @param abort callbacks invoked on error; `no_such_entry` is called when the id is not found
|
|
16
|
+
* @returns the value of the entry
|
|
17
|
+
*/
|
|
8
18
|
get_entry(id, abort) {
|
|
9
19
|
const raw = dict.__get_raw();
|
|
10
20
|
for (let i = 0; i !== raw.length; i += 1) {
|
|
@@ -15,6 +25,11 @@ export const dictionary = (dict) => {
|
|
|
15
25
|
}
|
|
16
26
|
return abort.no_such_entry(null);
|
|
17
27
|
},
|
|
28
|
+
/**
|
|
29
|
+
* Retrieves the entry with the given id if it exists, otherwise returns a not-set optional.
|
|
30
|
+
* @param id the id of the entry to retrieve
|
|
31
|
+
* @returns a set optional containing the entry value, or not-set if the id is not found
|
|
32
|
+
*/
|
|
18
33
|
get_possible_entry(id) {
|
|
19
34
|
const raw = dict.__get_raw();
|
|
20
35
|
for (let i = 0; i !== raw.length; i += 1) {
|
|
@@ -25,6 +40,11 @@ export const dictionary = (dict) => {
|
|
|
25
40
|
}
|
|
26
41
|
return lit.not_set();
|
|
27
42
|
},
|
|
43
|
+
/**
|
|
44
|
+
* Converts the values of the dictionary to a new type using the provided assign_entry function.
|
|
45
|
+
* @param assign_entry function to convert each entry; receives the current value and the entry id
|
|
46
|
+
* @returns a new dictionary with the same ids and the converted values
|
|
47
|
+
*/
|
|
28
48
|
map: (assign_entry) => {
|
|
29
49
|
//this local function helps with type inference
|
|
30
50
|
const temp_d_map = (mapper) => {
|
|
@@ -37,6 +57,40 @@ export const dictionary = (dict) => {
|
|
|
37
57
|
};
|
|
38
58
|
return temp_d_map(assign_entry);
|
|
39
59
|
},
|
|
60
|
+
/**
|
|
61
|
+
* gives the entries in the dictionary a new id.
|
|
62
|
+
* if a duplicate id is found, the duplicate_id function is called to get the target dictionary
|
|
63
|
+
* typically, you will use this function in a way where you can guarantee that there will be no duplicate ids, and the duplicate_id function will never be called,
|
|
64
|
+
* so you typically will have a p_unreachable_code_path() call
|
|
65
|
+
*/
|
|
66
|
+
re_id: (get_id, on_duplicate_id) => {
|
|
67
|
+
const temp = {};
|
|
68
|
+
dict.__get_raw().forEach(([id, value]) => {
|
|
69
|
+
const new_id = get_id(value, id);
|
|
70
|
+
if (temp[new_id] !== undefined) {
|
|
71
|
+
return on_duplicate_id(value, id);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
temp[new_id] = value;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return lit.dictionary(temp);
|
|
78
|
+
},
|
|
79
|
+
/**
|
|
80
|
+
* Maps each entry to a resolved value, supporting cross-entry lookups during resolution.
|
|
81
|
+
*
|
|
82
|
+
* The `acyclic_lookup` allows looking up other entries that should not have any direct or indirect
|
|
83
|
+
* dependency on the current entry; they are resolved on the spot if not yet resolved.
|
|
84
|
+
* A `cycle_detected` abort is triggered if a cycle is found.
|
|
85
|
+
*
|
|
86
|
+
* The `cyclic_lookup` allows referencing entries that may depend on the current entry.
|
|
87
|
+
* It returns a handle whose `get_circular_dependent` must not be called until all entries
|
|
88
|
+
* in the dictionary have been fully resolved; accessing it too early triggers the
|
|
89
|
+
* `accessing_cyclic_sibling_before_it_is_resolved` abort.
|
|
90
|
+
*
|
|
91
|
+
* @param assign_entry function called for each entry with its value, id, and both lookup handles
|
|
92
|
+
* @returns a new dictionary containing the resolved values
|
|
93
|
+
*/
|
|
40
94
|
resolve: (assign_entry) => {
|
|
41
95
|
const source = dict;
|
|
42
96
|
const out = {};
|
|
@@ -119,8 +173,20 @@ export const dictionary = (dict) => {
|
|
|
119
173
|
},
|
|
120
174
|
};
|
|
121
175
|
};
|
|
176
|
+
/**
|
|
177
|
+
* Wraps a list and provides conversion and transformation methods.
|
|
178
|
+
*/
|
|
122
179
|
export const list = (list) => {
|
|
123
180
|
return {
|
|
181
|
+
/**
|
|
182
|
+
* Converts the list to a dictionary using the provided id and value functions.
|
|
183
|
+
* first asks for the id of an item, then for the value of that item.
|
|
184
|
+
* Calls `abort.duplicate_id` if two items produce the same id.
|
|
185
|
+
* @param get_id function to derive the dictionary key from each item
|
|
186
|
+
* @param get_value function to derive the dictionary value from each item
|
|
187
|
+
* @param abort callbacks invoked on error; `duplicate_id` is called with the conflicting id
|
|
188
|
+
* @returns a new dictionary built from the list items
|
|
189
|
+
*/
|
|
124
190
|
convert_to_dictionary: (get_id, get_value, abort) => {
|
|
125
191
|
const temp = {};
|
|
126
192
|
list.__get_raw().forEach(($) => {
|
|
@@ -132,11 +198,24 @@ export const list = (list) => {
|
|
|
132
198
|
});
|
|
133
199
|
return lit.dictionary(temp);
|
|
134
200
|
},
|
|
201
|
+
/**
|
|
202
|
+
* Converts the items in the list to a new type using the provided assign_item function.
|
|
203
|
+
* @param assign_item function to convert each item to a new value
|
|
204
|
+
* @returns a new list containing the converted values
|
|
205
|
+
*/
|
|
135
206
|
map: (assign_item) => {
|
|
136
207
|
return lit.list(list.__get_raw().map((entry) => {
|
|
137
208
|
return assign_item(entry);
|
|
138
209
|
}));
|
|
139
210
|
},
|
|
211
|
+
/**
|
|
212
|
+
* Maps the items in the list to a new type while maintaining a state that is updated with each item.
|
|
213
|
+
* @param initial_state the initial value of the state before processing any items
|
|
214
|
+
* @param assign_item function to convert each item using the current state
|
|
215
|
+
* @param update_state function to produce the next state from the converted item and the current state
|
|
216
|
+
* @param wrapup function called once with the final converted list and the final state to produce the result
|
|
217
|
+
* @returns the result produced by `wrapup`
|
|
218
|
+
*/
|
|
140
219
|
map_with_state: (initial_state, assign_item, update_state, wrapup) => {
|
|
141
220
|
let current_state = initial_state;
|
|
142
221
|
return wrapup(lit.list(list.__get_raw().map(($) => {
|
|
@@ -147,14 +226,29 @@ export const list = (list) => {
|
|
|
147
226
|
},
|
|
148
227
|
};
|
|
149
228
|
};
|
|
229
|
+
/**
|
|
230
|
+
* Wraps an optional value and provides methods to handle both the set and not-set cases.
|
|
231
|
+
*/
|
|
150
232
|
export const optional = (optional_value) => {
|
|
151
233
|
return {
|
|
234
|
+
/**
|
|
235
|
+
* Calls `if_set` with the wrapped value if it is set, otherwise calls `if_not_set`.
|
|
236
|
+
* @param if_set function to call with the value when it is set
|
|
237
|
+
* @param if_not_set function to call when the value is not set
|
|
238
|
+
* @returns the result of whichever function was called
|
|
239
|
+
*/
|
|
152
240
|
decide: (if_set, if_not_set) => {
|
|
153
241
|
const raw = optional_value.__get_raw();
|
|
154
242
|
return raw === null
|
|
155
243
|
? if_not_set()
|
|
156
244
|
: if_set(raw[0]);
|
|
157
245
|
},
|
|
246
|
+
/**
|
|
247
|
+
* Transforms the wrapped value using the provided function if it is set.
|
|
248
|
+
* If the value is not set, returns a not-set optional.
|
|
249
|
+
* @param assign_set_value function to transform the value
|
|
250
|
+
* @returns a new optional containing the transformed value, or not-set if the original was not set
|
|
251
|
+
*/
|
|
158
252
|
map: (assign_set_value) => {
|
|
159
253
|
const raw = optional_value.__get_raw();
|
|
160
254
|
return raw === null
|
|
@@ -163,16 +257,33 @@ export const optional = (optional_value) => {
|
|
|
163
257
|
}
|
|
164
258
|
};
|
|
165
259
|
};
|
|
260
|
+
/**
|
|
261
|
+
* Wraps a state value and provides a method to produce a result from it.
|
|
262
|
+
*/
|
|
166
263
|
export const state = (state) => {
|
|
167
264
|
return {
|
|
265
|
+
/**
|
|
266
|
+
* Passes the state to the provided function and returns the result.
|
|
267
|
+
* @param assign function to produce a result from the state
|
|
268
|
+
* @returns the result produced by `assign`
|
|
269
|
+
*/
|
|
168
270
|
decide: (assign) => {
|
|
169
271
|
return assign(state);
|
|
170
272
|
}
|
|
171
273
|
};
|
|
172
274
|
};
|
|
275
|
+
/**
|
|
276
|
+
* Wraps a string value and provides a method to convert it into a state.
|
|
277
|
+
*/
|
|
173
278
|
export const text = (string) => {
|
|
174
279
|
return {
|
|
280
|
+
/**
|
|
281
|
+
* Converts the string into a state value using the provided function and context.
|
|
282
|
+
* @param context additional context passed to `assign_state`
|
|
283
|
+
* @param assign_state function that receives the context and the string and returns the state
|
|
284
|
+
* @returns the state produced by `assign_state`
|
|
285
|
+
*/
|
|
175
286
|
to_state: (context, assign_state) => assign_state(context, string)
|
|
176
287
|
};
|
|
177
288
|
};
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
289
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbXBsZW1lbnRhdGlvbi9fX2ludGVybmFsL3JlZmluZXIvZnJvbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLDRCQUE0QixDQUFBO0FBQ2xELE9BQU8sS0FBSyxJQUFJLE1BQU0sK0JBQStCLENBQUE7QUFDckQsT0FBTyxFQUFjLE1BQU0sd0NBQXdDLENBQUE7QUFDbkUsT0FBTyxLQUFLLEdBQUcsTUFBTSxvQkFBb0IsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTtBQUVuRTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUN0QixJQUF3QixFQUMxQixFQUFFO0lBQ0EsT0FBTztRQUVIOzs7Ozs7V0FNRztRQUNILFNBQVMsQ0FDTCxFQUFVLEVBQ1YsS0FFQztZQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtZQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUUsQ0FBQTtnQkFDekIsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7b0JBQ3RCLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUN2QixDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNwQyxDQUFDO1FBRUQ7Ozs7V0FJRztRQUNILGtCQUFrQixDQUNkLEVBQVU7WUFFVixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7WUFDNUIsS0FBSyxJQUFJLENB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
|