@sparted/shared-library 0.0.11 → 0.0.13
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/_virtual/_tslib.js +88 -0
- package/_virtual/_tslib.js.map +1 -0
- package/array/array-to-map.d.ts +14 -0
- package/array/array-to-map.js +19 -0
- package/array/array-to-map.js.map +1 -0
- package/array/get-values-from-keys.d.ts +1 -0
- package/array/get-values-from-keys.js +6 -0
- package/array/get-values-from-keys.js.map +1 -0
- package/array/index.d.ts +2 -0
- package/array/index.js +3 -0
- package/array/index.js.map +1 -0
- package/date/constants.d.ts +4 -0
- package/date/constants.js +7 -0
- package/date/constants.js.map +1 -0
- package/date/convert.d.ts +2 -0
- package/date/convert.js +7 -0
- package/date/convert.js.map +1 -0
- package/date/format-minutes.d.ts +1 -0
- package/date/format-minutes.js +12 -0
- package/date/format-minutes.js.map +1 -0
- package/date/get-time-diff-as-string.d.ts +47 -0
- package/date/get-time-diff-as-string.js +126 -0
- package/date/get-time-diff-as-string.js.map +1 -0
- package/date/index.d.ts +4 -0
- package/date/index.js +4 -0
- package/date/index.js.map +1 -0
- package/formatting/format-number.d.ts +1 -0
- package/formatting/format-number.js +14 -0
- package/formatting/format-number.js.map +1 -0
- package/formatting/index.d.ts +1 -0
- package/formatting/index.js +2 -0
- package/formatting/index.js.map +1 -0
- package/fp/index.d.ts +1 -0
- package/fp/index.js +2 -0
- package/fp/index.js.map +1 -0
- package/fp/run-while.d.ts +31 -0
- package/fp/run-while.js +26 -0
- package/fp/run-while.js.map +1 -0
- package/http/encode-search-object.d.ts +7 -0
- package/http/encode-search-object.js +31 -0
- package/http/encode-search-object.js.map +1 -0
- package/http/fetch-with-timeout.d.ts +8 -0
- package/http/fetch-with-timeout.js +18 -0
- package/http/fetch-with-timeout.js.map +1 -0
- package/http/index.d.ts +2 -0
- package/http/index.js +3 -0
- package/http/index.js.map +1 -0
- package/index.d.ts +13 -0
- package/index.js +13 -0
- package/index.js.map +1 -0
- package/linked-list/apply-diff-linked-list.d.ts +2 -0
- package/linked-list/apply-diff-linked-list.js +27 -0
- package/linked-list/apply-diff-linked-list.js.map +1 -0
- package/linked-list/create-linked-list.d.ts +2 -0
- package/linked-list/create-linked-list.js +66 -0
- package/linked-list/create-linked-list.js.map +1 -0
- package/linked-list/find-linked-list.d.ts +2 -0
- package/linked-list/find-linked-list.js +25 -0
- package/linked-list/find-linked-list.js.map +1 -0
- package/linked-list/get-linked-list.d.ts +2 -0
- package/linked-list/get-linked-list.js +9 -0
- package/linked-list/get-linked-list.js.map +1 -0
- package/linked-list/index.d.ts +2 -0
- package/linked-list/index.js +2 -0
- package/linked-list/index.js.map +1 -0
- package/linked-list/insert-linked-list.d.ts +2 -0
- package/linked-list/insert-linked-list.js +30 -0
- package/linked-list/insert-linked-list.js.map +1 -0
- package/linked-list/linked-list-utils.d.ts +23 -0
- package/linked-list/linked-list-utils.js +97 -0
- package/linked-list/linked-list-utils.js.map +1 -0
- package/linked-list/reduce-linked-list.d.ts +2 -0
- package/linked-list/reduce-linked-list.js +17 -0
- package/linked-list/reduce-linked-list.js.map +1 -0
- package/linked-list/remove-linked-list.d.ts +2 -0
- package/linked-list/remove-linked-list.js +25 -0
- package/linked-list/remove-linked-list.js.map +1 -0
- package/linked-list/type.d.ts +34 -0
- package/linked-list/update-linked-list.d.ts +2 -0
- package/linked-list/update-linked-list.js +21 -0
- package/linked-list/update-linked-list.js.map +1 -0
- package/linked-list/walk-list-item-record.d.ts +15 -0
- package/linked-list/while-linked-list.d.ts +2 -0
- package/linked-list/while-linked-list.js +29 -0
- package/linked-list/while-linked-list.js.map +1 -0
- package/math/clamp-number.d.ts +2 -0
- package/math/clamp-number.js +10 -0
- package/math/clamp-number.js.map +1 -0
- package/math/index.d.ts +4 -0
- package/math/index.js +5 -0
- package/math/index.js.map +1 -0
- package/math/interpolate.d.ts +2 -0
- package/math/interpolate.js +16 -0
- package/math/interpolate.js.map +1 -0
- package/math/number-range.d.ts +6 -0
- package/math/number-range.js +13 -0
- package/math/number-range.js.map +1 -0
- package/math/random-number.d.ts +2 -0
- package/math/random-number.js +10 -0
- package/math/random-number.js.map +1 -0
- package/object/index.d.ts +1 -0
- package/object/index.js +2 -0
- package/object/index.js.map +1 -0
- package/object/merge-deep.d.ts +2 -0
- package/object/merge-deep.js +24 -0
- package/object/merge-deep.js.map +1 -0
- package/package.json +4 -2
- package/parsing/index.d.ts +3 -0
- package/parsing/index.js +4 -0
- package/parsing/index.js.map +1 -0
- package/parsing/parse-boolean.d.ts +4 -0
- package/parsing/parse-boolean.js +12 -0
- package/parsing/parse-boolean.js.map +1 -0
- package/parsing/parse-enum.d.ts +5 -0
- package/parsing/parse-enum.js +13 -0
- package/parsing/parse-enum.js.map +1 -0
- package/parsing/parse-number.d.ts +4 -0
- package/parsing/parse-number.js +13 -0
- package/parsing/parse-number.js.map +1 -0
- package/predicates/index.d.ts +5 -0
- package/predicates/index.js +6 -0
- package/predicates/index.js.map +1 -0
- package/predicates/is-function.d.ts +1 -0
- package/predicates/is-function.js +6 -0
- package/predicates/is-function.js.map +1 -0
- package/predicates/is-null.d.ts +1 -0
- package/predicates/is-null.js +6 -0
- package/predicates/is-null.js.map +1 -0
- package/predicates/is-object.d.ts +1 -0
- package/predicates/is-object.js +6 -0
- package/predicates/is-object.js.map +1 -0
- package/predicates/is-primitive.d.ts +3 -0
- package/predicates/is-primitive.js +17 -0
- package/predicates/is-primitive.js.map +1 -0
- package/predicates/is-undefined.d.ts +1 -0
- package/predicates/is-undefined.js +6 -0
- package/predicates/is-undefined.js.map +1 -0
- package/predicates/is-uuid.d.ts +1 -0
- package/promise/delay.d.ts +1 -0
- package/promise/delay.js +6 -0
- package/promise/delay.js.map +1 -0
- package/promise/execute-or-resolve-default.d.ts +5 -0
- package/promise/execute-or-resolve-default.js +10 -0
- package/promise/execute-or-resolve-default.js.map +1 -0
- package/promise/execute-with-delay.d.ts +1 -0
- package/promise/execute-with-delay.js +16 -0
- package/promise/execute-with-delay.js.map +1 -0
- package/promise/index.d.ts +3 -0
- package/promise/index.js +4 -0
- package/promise/index.js.map +1 -0
- package/string/index.d.ts +1 -0
- package/string/index.js +2 -0
- package/string/index.js.map +1 -0
- package/string/replace-in-template.d.ts +14 -0
- package/string/replace-in-template.js +35 -0
- package/string/replace-in-template.js.map +1 -0
- package/types/function.d.ts +1 -0
- package/types/general.d.ts +3 -0
- package/types/index.d.ts +4 -0
- package/types/index.js +2 -0
- package/types/index.js.map +1 -0
- package/types/object.d.ts +35 -0
- package/types/search.d.ts +24 -0
package/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './array';
|
|
2
|
+
export * from './date';
|
|
3
|
+
export * from './formatting';
|
|
4
|
+
export * from './fp';
|
|
5
|
+
export * from './http';
|
|
6
|
+
export * from './linked-list';
|
|
7
|
+
export * from './math';
|
|
8
|
+
export * from './object';
|
|
9
|
+
export * from './parsing';
|
|
10
|
+
export * from './predicates';
|
|
11
|
+
export * from './promise';
|
|
12
|
+
export * from './string';
|
|
13
|
+
export * from './types';
|
package/index.js
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
export { arrayToMap } from './array/array-to-map.js';
|
|
2
2
|
export { valuesFromKeys } from './array/get-values-from-keys.js';
|
|
3
|
+
export { MS_DAY, MS_HOUR, MS_MINUTE, MS_SECOND } from './date/constants.js';
|
|
4
|
+
export { formatMinutes } from './date/format-minutes.js';
|
|
5
|
+
export { getTimeDiffAsString } from './date/get-time-diff-as-string.js';
|
|
6
|
+
export { formatNumber } from './formatting/format-number.js';
|
|
3
7
|
export { runWhile } from './fp/run-while.js';
|
|
8
|
+
export { encodeSearchObject, encodeSearchValue } from './http/encode-search-object.js';
|
|
9
|
+
export { fetchWithTimeout } from './http/fetch-with-timeout.js';
|
|
10
|
+
export { createLinkedList } from './linked-list/create-linked-list.js';
|
|
11
|
+
export { clampNumber } from './math/clamp-number.js';
|
|
12
|
+
export { interpolate } from './math/interpolate.js';
|
|
13
|
+
export { assertNumberRange, isNumberInRange } from './math/number-range.js';
|
|
14
|
+
export { randomNumber } from './math/random-number.js';
|
|
15
|
+
export { mergeDeep } from './object/merge-deep.js';
|
|
4
16
|
export { parseBoolean } from './parsing/parse-boolean.js';
|
|
5
17
|
export { createEnumParser } from './parsing/parse-enum.js';
|
|
6
18
|
export { parseNumber } from './parsing/parse-number.js';
|
|
@@ -11,5 +23,6 @@ export { isArrayOfPrimitive, isPrimitive } from './predicates/is-primitive.js';
|
|
|
11
23
|
export { isUndefined } from './predicates/is-undefined.js';
|
|
12
24
|
export { executeOrResolveDefault } from './promise/execute-or-resolve-default.js';
|
|
13
25
|
export { executeWithDelay } from './promise/execute-with-delay.js';
|
|
26
|
+
export { delay } from './promise/delay.js';
|
|
14
27
|
export { replaceInTemplate } from './string/replace-in-template.js';
|
|
15
28
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
var applyDiffLinkedList = function (before, after, list) {
|
|
2
|
+
// Delete
|
|
3
|
+
if (!after && before) {
|
|
4
|
+
return list.remove(before.id);
|
|
5
|
+
}
|
|
6
|
+
// Insert
|
|
7
|
+
if (!before && after) {
|
|
8
|
+
return list.insert(after);
|
|
9
|
+
}
|
|
10
|
+
// For the following commands, none of the 2 items can be null
|
|
11
|
+
// We dont use && because checks are already done above, but ts cannot infer that they cannot be null afterwards
|
|
12
|
+
if (!before || !after) {
|
|
13
|
+
throw new Error('Cannot have both before & after as null');
|
|
14
|
+
}
|
|
15
|
+
if (before.id !== after.id) {
|
|
16
|
+
throw new Error('Cannot change id of a ListNode');
|
|
17
|
+
}
|
|
18
|
+
var listWithPotentialReorder = before.nextId === after.nextId
|
|
19
|
+
? list
|
|
20
|
+
: list
|
|
21
|
+
.remove(before.id)
|
|
22
|
+
.insert(after);
|
|
23
|
+
return listWithPotentialReorder.update(after);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { applyDiffLinkedList };
|
|
27
|
+
//# sourceMappingURL=apply-diff-linked-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-diff-linked-list.js","sources":["../../src/linked-list/apply-diff-linked-list.ts"],"sourcesContent":["import { LinkedList, LinkedListItem, ManipulationConfig } from './type';\n\nexport const applyDiffLinkedList = <T extends LinkedListItem>(\n before: T | null,\n after: T | null,\n list: LinkedList<T>,\n) => {\n // Delete\n if (!after && before) {\n return list.remove(before.id);\n }\n\n // Insert\n if (!before && after) {\n return list.insert(after);\n }\n\n // For the following commands, none of the 2 items can be null\n // We dont use && because checks are already done above, but ts cannot infer that they cannot be null afterwards\n if (!before || !after) {\n throw new Error('Cannot have both before & after as null');\n }\n\n if (before.id !== after.id) {\n throw new Error('Cannot change id of a ListNode');\n }\n\n const listWithPotentialReorder = before.nextId === after.nextId\n ? list\n : list\n .remove(before.id)\n .insert(after);\n\n return listWithPotentialReorder.update(after);\n};"],"names":[],"mappings":"IAEa,mBAAmB,GAAG,UACjC,MAAgB,EAChB,KAAe,EACf,IAAmB,EAAA;;AAGnB,IAAA,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC/B,KAAA;;AAGD,IAAA,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE;AACpB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3B,KAAA;;;AAID,IAAA,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;AACrB,QAAA,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC5D,KAAA;AAED,IAAA,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,EAAE;AAC1B,QAAA,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;AACnD,KAAA;IAED,IAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;AAC7D,UAAE,IAAI;AACN,UAAE,IAAI;AACH,aAAA,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;aACjB,MAAM,CAAC,KAAK,CAAC,CAAC;AAEnB,IAAA,OAAO,wBAAwB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChD;;;;"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { reduceLinkedList } from './reduce-linked-list.js';
|
|
2
|
+
import { findLinkedList } from './find-linked-list.js';
|
|
3
|
+
import { whileLinkedList } from './while-linked-list.js';
|
|
4
|
+
import { walkListItemRecord } from './linked-list-utils.js';
|
|
5
|
+
import { removeLinkedList } from './remove-linked-list.js';
|
|
6
|
+
import { insertLinkedList } from './insert-linked-list.js';
|
|
7
|
+
import { getLinkedList } from './get-linked-list.js';
|
|
8
|
+
import { updateLinkedList } from './update-linked-list.js';
|
|
9
|
+
import { applyDiffLinkedList } from './apply-diff-linked-list.js';
|
|
10
|
+
|
|
11
|
+
var createLinkedList = function (headId, items) {
|
|
12
|
+
var head = headId ? items[headId] : null;
|
|
13
|
+
if (head === undefined) {
|
|
14
|
+
throw new Error('Cannot find the head.');
|
|
15
|
+
}
|
|
16
|
+
var list = { headId: headId, items: items };
|
|
17
|
+
var _a = walkListItemRecord(function (acc, current) {
|
|
18
|
+
var newCount = acc.count + 1;
|
|
19
|
+
var isDoubleLinked = current.previousId !== undefined;
|
|
20
|
+
var incompatibleFormats = acc.isDoubleLinked !== undefined && acc.isDoubleLinked !== isDoubleLinked;
|
|
21
|
+
if (incompatibleFormats || (isDoubleLinked && current.previousId !== acc.previousId)) {
|
|
22
|
+
throw new Error('Invalid previous node in the linked list');
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
result: {
|
|
26
|
+
previousId: current.id,
|
|
27
|
+
count: newCount,
|
|
28
|
+
isDoubleLinked: isDoubleLinked,
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}, {
|
|
32
|
+
initValue: {
|
|
33
|
+
isDoubleLinked: undefined,
|
|
34
|
+
count: 0,
|
|
35
|
+
previousId: null,
|
|
36
|
+
},
|
|
37
|
+
startId: headId,
|
|
38
|
+
items: items,
|
|
39
|
+
}), isDoubleLinked = _a.isDoubleLinked, count = _a.count;
|
|
40
|
+
var manipulationConfig = {
|
|
41
|
+
factory: function (list) { return createLinkedList(list.headId, list.items); },
|
|
42
|
+
/**
|
|
43
|
+
* At this point isDoubleLinked cannot be undefined
|
|
44
|
+
*/
|
|
45
|
+
isDoubleLinkList: isDoubleLinked,
|
|
46
|
+
list: list,
|
|
47
|
+
};
|
|
48
|
+
var linkedList = {
|
|
49
|
+
head: head,
|
|
50
|
+
items: items,
|
|
51
|
+
size: count,
|
|
52
|
+
isDoubleLinked: isDoubleLinked,
|
|
53
|
+
reduce: function (cb, initValue) { return reduceLinkedList(cb, initValue, list); },
|
|
54
|
+
find: function (predicate) { return findLinkedList(predicate, list); },
|
|
55
|
+
while: function (predicate, startId) { return whileLinkedList(predicate, list, startId); },
|
|
56
|
+
remove: function (id) { return removeLinkedList(id, manipulationConfig); },
|
|
57
|
+
insert: function (item) { return insertLinkedList(item, manipulationConfig); },
|
|
58
|
+
get: function (id) { return getLinkedList(id, list); },
|
|
59
|
+
update: function (item) { return updateLinkedList(item, manipulationConfig); },
|
|
60
|
+
applyDiff: function (before, after) { return applyDiffLinkedList(before, after, linkedList); },
|
|
61
|
+
};
|
|
62
|
+
return linkedList;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export { createLinkedList };
|
|
66
|
+
//# sourceMappingURL=create-linked-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-linked-list.js","sources":["../../src/linked-list/create-linked-list.ts"],"sourcesContent":["import { LinkedListItem, LinkedList, ManipulationConfig } from './type';\n\nimport { reduceLinkedList } from './reduce-linked-list';\nimport { findLinkedList } from './find-linked-list';\nimport { whileLinkedList } from './while-linked-list';\nimport { walkListItemRecord } from './linked-list-utils';\nimport { removeLinkedList } from './remove-linked-list';\nimport { insertLinkedList } from './insert-linked-list';\nimport { getLinkedList } from './get-linked-list';\nimport { updateLinkedList } from './update-linked-list';\nimport { applyDiffLinkedList } from './apply-diff-linked-list';\n\ntype LinkedListValidation = {\n isDoubleLinked?: boolean,\n previousId: null | string,\n count: number,\n}\n\nexport const createLinkedList = <T extends LinkedListItem>(headId: string | null, items: Record<string, T>): LinkedList<T> => {\n const head = headId ? items[headId] : null;\n\n if (head === undefined) {\n throw new Error('Cannot find the head.');\n }\n\n const list = { headId, items };\n\n const { isDoubleLinked, count } = walkListItemRecord((acc, current) => {\n const newCount = acc.count + 1;\n const isDoubleLinked = current.previousId !== undefined;\n const incompatibleFormats = acc.isDoubleLinked !== undefined && acc.isDoubleLinked !== isDoubleLinked;\n\n if (incompatibleFormats || (isDoubleLinked && current.previousId !== acc.previousId)) {\n throw new Error('Invalid previous node in the linked list');\n }\n\n return {\n result: {\n previousId: current.id,\n count: newCount,\n isDoubleLinked,\n }\n }\n }, {\n initValue: {\n isDoubleLinked: undefined,\n count: 0,\n previousId: null,\n } as LinkedListValidation,\n startId: headId,\n items,\n });\n\n const manipulationConfig: ManipulationConfig<T> = {\n factory: (list) => createLinkedList(list.headId, list.items),\n /**\n * At this point isDoubleLinked cannot be undefined\n */\n isDoubleLinkList: isDoubleLinked!,\n list,\n };\n\n const linkedList: LinkedList<T> = {\n head,\n items,\n size: count,\n isDoubleLinked: isDoubleLinked!,\n reduce: (cb, initValue) => reduceLinkedList(cb, initValue, list),\n find: (predicate) => findLinkedList(predicate, list),\n while: (predicate, startId) => whileLinkedList(predicate, list, startId),\n remove: (id) => removeLinkedList(id, manipulationConfig),\n insert: (item) => insertLinkedList(item, manipulationConfig),\n get: (id) => getLinkedList(id, list),\n update: (item) => updateLinkedList(item, manipulationConfig),\n applyDiff: (before, after) => applyDiffLinkedList(before, after, linkedList),\n };\n\n return linkedList;\n};"],"names":[],"mappings":";;;;;;;;;;AAkBa,IAAA,gBAAgB,GAAG,UAA2B,MAAqB,EAAE,KAAwB,EAAA;AACxG,IAAA,IAAM,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAE3C,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,QAAA,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;AAC1C,KAAA;IAED,IAAM,IAAI,GAAG,EAAE,MAAM,QAAA,EAAE,KAAK,EAAA,KAAA,EAAE,CAAC;AAEzB,IAAA,IAAA,KAA4B,kBAAkB,CAAC,UAAC,GAAG,EAAE,OAAO,EAAA;AAChE,QAAA,IAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;AAC/B,QAAA,IAAM,cAAc,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC;AACxD,QAAA,IAAM,mBAAmB,GAAG,GAAG,CAAC,cAAc,KAAK,SAAS,IAAI,GAAG,CAAC,cAAc,KAAK,cAAc,CAAC;AAEtG,QAAA,IAAI,mBAAmB,KAAK,cAAc,IAAI,OAAO,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU,CAAC,EAAE;AACpF,YAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC7D,SAAA;QAED,OAAO;AACL,YAAA,MAAM,EAAE;gBACN,UAAU,EAAE,OAAO,CAAC,EAAE;AACtB,gBAAA,KAAK,EAAE,QAAQ;AACf,gBAAA,cAAc,EAAA,cAAA;AACf,aAAA;SACF,CAAA;AACH,KAAC,EAAE;AACD,QAAA,SAAS,EAAE;AACT,YAAA,cAAc,EAAE,SAAS;AACzB,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,UAAU,EAAE,IAAI;AACO,SAAA;AACzB,QAAA,OAAO,EAAE,MAAM;AACf,QAAA,KAAK,EAAA,KAAA;AACN,KAAA,CAAC,EAxBM,cAAc,GAAA,EAAA,CAAA,cAAA,EAAE,KAAK,WAwB3B,CAAC;AAEH,IAAA,IAAM,kBAAkB,GAA0B;AAChD,QAAA,OAAO,EAAE,UAAC,IAAI,EAAK,EAAA,OAAA,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAA;AAC5D;;AAEG;AACH,QAAA,gBAAgB,EAAE,cAAe;AACjC,QAAA,IAAI,EAAA,IAAA;KACL,CAAC;AAEF,IAAA,IAAM,UAAU,GAAkB;AAChC,QAAA,IAAI,EAAA,IAAA;AACJ,QAAA,KAAK,EAAA,KAAA;AACL,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,cAAc,EAAE,cAAe;AAC/B,QAAA,MAAM,EAAE,UAAC,EAAE,EAAE,SAAS,IAAK,OAAA,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAA;AAChE,QAAA,IAAI,EAAE,UAAC,SAAS,EAAA,EAAK,OAAA,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA,EAAA;AACpD,QAAA,KAAK,EAAE,UAAC,SAAS,EAAE,OAAO,IAAK,OAAA,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,GAAA;AACxE,QAAA,MAAM,EAAE,UAAC,EAAE,EAAA,EAAK,OAAA,gBAAgB,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAA,EAAA;AACxD,QAAA,MAAM,EAAE,UAAC,IAAI,EAAA,EAAK,OAAA,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA,EAAA;AAC5D,QAAA,GAAG,EAAE,UAAC,EAAE,EAAA,EAAK,OAAA,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA,EAAA;AACpC,QAAA,MAAM,EAAE,UAAC,IAAI,EAAA,EAAK,OAAA,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA,EAAA;AAC5D,QAAA,SAAS,EAAE,UAAC,MAAM,EAAE,KAAK,IAAK,OAAA,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,GAAA;KAC7E,CAAC;AAEF,IAAA,OAAO,UAAU,CAAC;AACpB;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { walkListItemRecord } from './linked-list-utils.js';
|
|
2
|
+
|
|
3
|
+
var findLinkedList = function (predicate, list) {
|
|
4
|
+
list.headId;
|
|
5
|
+
return walkListItemRecord(function (acc, item) {
|
|
6
|
+
if (predicate(item)) {
|
|
7
|
+
return {
|
|
8
|
+
result: item,
|
|
9
|
+
control: {
|
|
10
|
+
stop: true,
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
result: acc,
|
|
16
|
+
};
|
|
17
|
+
}, {
|
|
18
|
+
initValue: null,
|
|
19
|
+
items: list.items,
|
|
20
|
+
startId: list.headId,
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { findLinkedList };
|
|
25
|
+
//# sourceMappingURL=find-linked-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-linked-list.js","sources":["../../src/linked-list/find-linked-list.ts"],"sourcesContent":["import { LinkedListItem, ItemPredicate, HeadAndItems } from './type';\nimport { walkListItemRecord } from './linked-list-utils';\n\nexport const findLinkedList = <Item extends LinkedListItem>(\n predicate: ItemPredicate<Item>,\n list: HeadAndItems<Item>,\n): Item | null => {\n const { headId } = list;\n\n return walkListItemRecord(\n (acc, item) => {\n if (predicate(item)) {\n return {\n result: item,\n control: {\n stop: true,\n },\n };\n };\n\n return {\n result: acc,\n };\n }, {\n initValue: null as Item | null,\n items: list.items,\n startId: list.headId,\n },\n );\n};\n"],"names":[],"mappings":";;AAGa,IAAA,cAAc,GAAG,UAC5B,SAA8B,EAC9B,IAAwB,EAAA;AAEhB,IAAW,IAAI,CAAA,OAAC;AAExB,IAAA,OAAO,kBAAkB,CACvB,UAAC,GAAG,EAAE,IAAI,EAAA;AACR,QAAA,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE;YACnB,OAAO;AACL,gBAAA,MAAM,EAAE,IAAI;AACZ,gBAAA,OAAO,EAAE;AACP,oBAAA,IAAI,EAAE,IAAI;AACX,iBAAA;aACF,CAAC;AACH,SAAA;QAED,OAAO;AACL,YAAA,MAAM,EAAE,GAAG;SACZ,CAAC;AACJ,KAAC,EAAE;AACD,QAAA,SAAS,EAAE,IAAmB;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,MAAM;AACrB,KAAA,CACF,CAAC;AACJ;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-linked-list.js","sources":["../../src/linked-list/get-linked-list.ts"],"sourcesContent":["import { HeadAndItems, LinkedListItem } from './type';\n\nexport const getLinkedList = <T extends LinkedListItem>(id: string, list: HeadAndItems<T>) => {\n if (list.items[id]) {\n return list.items[id];\n }\n\n return null;\n}"],"names":[],"mappings":"AAEa,IAAA,aAAa,GAAG,UAA2B,EAAU,EAAE,IAAqB,EAAA;AACvF,IAAA,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;AAClB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACvB,KAAA;AAED,IAAA,OAAO,IAAI,CAAC;AACd;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { __assign } from '../_virtual/_tslib.js';
|
|
2
|
+
import { assertItemCompatibility, assertPresence, findPreviousId, assertNewNodePosition } from './linked-list-utils.js';
|
|
3
|
+
|
|
4
|
+
var insertLinkedList = function (item, config) {
|
|
5
|
+
var _a, _b, _c;
|
|
6
|
+
var isDoubleLinkList = config.isDoubleLinkList, list = config.list, factory = config.factory;
|
|
7
|
+
assertItemCompatibility(item, isDoubleLinkList);
|
|
8
|
+
assertPresence(item.nextId, list.items);
|
|
9
|
+
assertPresence(item.previousId, list.items);
|
|
10
|
+
var previousId = isDoubleLinkList
|
|
11
|
+
? item.previousId
|
|
12
|
+
: findPreviousId(item.nextId, list);
|
|
13
|
+
assertNewNodePosition(item, {
|
|
14
|
+
previousId: previousId,
|
|
15
|
+
list: list,
|
|
16
|
+
});
|
|
17
|
+
var newHeadId = item.nextId === list.headId ? item.id : list.headId;
|
|
18
|
+
var newItems = __assign(__assign(__assign(__assign({}, list.items), (previousId ? (_a = {},
|
|
19
|
+
_a[previousId] = __assign(__assign({}, list.items[previousId]), { nextId: item.id }),
|
|
20
|
+
_a) : {})), (isDoubleLinkList && item.nextId ? (_b = {},
|
|
21
|
+
_b[item.nextId] = __assign(__assign({}, list.items[item.nextId]), (isDoubleLinkList ? { previousId: item.id } : {})),
|
|
22
|
+
_b) : {})), (_c = {}, _c[item.id] = item, _c));
|
|
23
|
+
return factory({
|
|
24
|
+
headId: newHeadId,
|
|
25
|
+
items: newItems,
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export { insertLinkedList };
|
|
30
|
+
//# sourceMappingURL=insert-linked-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert-linked-list.js","sources":["../../src/linked-list/insert-linked-list.ts"],"sourcesContent":["import { ManipulationConfig, LinkedListItem } from './type';\n\nimport {\n findPreviousId,\n assertItemCompatibility,\n assertPresence,\n assertNewNodePosition,\n} from './linked-list-utils';\n\nexport const insertLinkedList = <T extends LinkedListItem>(item: T, config: ManipulationConfig<T>) => {\n const { isDoubleLinkList, list, factory } = config;\n\n assertItemCompatibility(item, isDoubleLinkList);\n assertPresence(item.nextId, list.items);\n assertPresence(item.previousId, list.items);\n\n const previousId = isDoubleLinkList\n ? item.previousId!\n : findPreviousId(item.nextId, list);\n\n assertNewNodePosition(item, {\n previousId,\n list,\n });\n\n const newHeadId = item.nextId === list.headId ? item.id : list.headId;\n const newItems = {\n ...list.items,\n ...(previousId ? {\n [previousId]: {\n ...list.items[previousId],\n nextId: item.id,\n },\n } : {}),\n ...(isDoubleLinkList && item.nextId ? {\n [item.nextId]: {\n ...list.items[item.nextId],\n ...(isDoubleLinkList ? { previousId: item.id } : {}),\n },\n } : {}),\n [item.id]: item,\n };\n\n return factory({\n headId: newHeadId,\n items: newItems,\n });\n};\n"],"names":[],"mappings":";;;AASa,IAAA,gBAAgB,GAAG,UAA2B,IAAO,EAAE,MAA6B,EAAA;;AACvF,IAAA,IAAA,gBAAgB,GAAoB,MAAM,CAAA,gBAA1B,EAAE,IAAI,GAAc,MAAM,CAAA,IAApB,EAAE,OAAO,GAAK,MAAM,QAAX,CAAY;AAEnD,IAAA,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAChD,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAM,UAAU,GAAG,gBAAgB;UAC/B,IAAI,CAAC,UAAW;UAChB,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEtC,qBAAqB,CAAC,IAAI,EAAE;AAC1B,QAAA,UAAU,EAAA,UAAA;AACV,QAAA,IAAI,EAAA,IAAA;AACL,KAAA,CAAC,CAAC;IAEH,IAAM,SAAS,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;IACtE,IAAM,QAAQ,2CACT,IAAI,CAAC,KAAK,CACV,GAAC,UAAU,IAAE,EAAA,GAAA,EAAA;AACd,QAAA,EAAA,CAAC,UAAU,CAAA,GAAA,QAAA,CAAA,QAAA,CAAA,EAAA,EACN,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA,EAAA,EACzB,MAAM,EAAE,IAAI,CAAC,EAAE,EAChB,CAAA;cACC,EAAE,EACH,GAAC,gBAAgB,IAAI,IAAI,CAAC,MAAM,IAAE,EAAA,GAAA,EAAA;AACnC,QAAA,EAAA,CAAC,IAAI,CAAC,MAAM,CAAA,GAAA,QAAA,CAAA,QAAA,CAAA,EAAA,EACP,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IACtB,gBAAgB,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,EACpD;cACC,EAAE,EACL,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,CAAA,IAAI,CAAC,EAAE,CAAA,GAAG,IAAI,EAAA,EAAA,EAChB,CAAC;AAEF,IAAA,OAAO,OAAO,CAAC;AACb,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,KAAK,EAAE,QAAQ;AAChB,KAAA,CAAC,CAAC;AACL;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { LinkedListItem, HeadAndItems } from './type';
|
|
2
|
+
export declare type WalkConfig<T extends LinkedListItem, Result> = {
|
|
3
|
+
startId: string | null;
|
|
4
|
+
items: Record<string, T>;
|
|
5
|
+
initValue: Result;
|
|
6
|
+
};
|
|
7
|
+
declare type WalkCallbackResult<R> = {
|
|
8
|
+
result: R;
|
|
9
|
+
control?: {
|
|
10
|
+
stop?: boolean;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export declare type WalkCallback<Item, Result> = (accumulator: Result, current: Item) => WalkCallbackResult<Result>;
|
|
14
|
+
export declare const walkListItemRecord: <T extends LinkedListItem, Result>(callback: WalkCallback<T, Result>, config: WalkConfig<T, Result>) => Result;
|
|
15
|
+
export declare const findPreviousId: <T extends LinkedListItem>(id: string | null, list: HeadAndItems<T>) => string | null;
|
|
16
|
+
export declare const assertItemCompatibility: <T extends LinkedListItem>(item: T, isDoubleLinkList: boolean) => void;
|
|
17
|
+
export declare const assertPresence: (id: string | null | undefined, items: Record<string, unknown>) => void;
|
|
18
|
+
declare type PositionAssertionConfig = {
|
|
19
|
+
previousId: string | null;
|
|
20
|
+
list: HeadAndItems<LinkedListItem>;
|
|
21
|
+
};
|
|
22
|
+
export declare const assertNewNodePosition: <T extends LinkedListItem>(item: T, config: PositionAssertionConfig) => void;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { runWhile } from '../fp/run-while.js';
|
|
2
|
+
|
|
3
|
+
var walkListItemRecord = function (callback, config) {
|
|
4
|
+
var _a;
|
|
5
|
+
var items = config.items, startId = config.startId, initValue = config.initValue;
|
|
6
|
+
var visited = new Set();
|
|
7
|
+
var totalNodes = Object.keys(items).length;
|
|
8
|
+
var _b = runWhile({
|
|
9
|
+
iterationLimit: totalNodes + 1,
|
|
10
|
+
initialValue: {
|
|
11
|
+
currentId: startId,
|
|
12
|
+
accumulator: initValue,
|
|
13
|
+
control: {
|
|
14
|
+
stop: false,
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
predicate: function (_a) {
|
|
18
|
+
var control = _a.control, currentId = _a.currentId;
|
|
19
|
+
var stop = control === null || control === void 0 ? void 0 : control.stop;
|
|
20
|
+
var forcedStop = stop === undefined ? false : stop;
|
|
21
|
+
/**
|
|
22
|
+
* Stop early or when the end is reached
|
|
23
|
+
*/
|
|
24
|
+
return !forcedStop && currentId !== null;
|
|
25
|
+
},
|
|
26
|
+
callback: function (current) {
|
|
27
|
+
if (visited.has(current.currentId)) {
|
|
28
|
+
throw new Error('Infinite loop found');
|
|
29
|
+
}
|
|
30
|
+
visited.add(current.currentId);
|
|
31
|
+
var currentItem = items[current.currentId];
|
|
32
|
+
if (!currentItem) {
|
|
33
|
+
throw new Error('Cul de sac detected');
|
|
34
|
+
}
|
|
35
|
+
var _a = callback(current.accumulator, currentItem), result = _a.result, control = _a.control;
|
|
36
|
+
return {
|
|
37
|
+
accumulator: result,
|
|
38
|
+
currentId: currentItem.nextId,
|
|
39
|
+
control: control,
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
}), iterationCount = _b.iterationCount, result = _b.result;
|
|
43
|
+
/**
|
|
44
|
+
* When force stopping the walk, we will always have unvisited
|
|
45
|
+
* nodes, so we skip this check.
|
|
46
|
+
*/
|
|
47
|
+
if (iterationCount !== totalNodes && ((_a = result.control) === null || _a === void 0 ? void 0 : _a.stop) !== true) {
|
|
48
|
+
throw new Error('Isolated nodes found');
|
|
49
|
+
}
|
|
50
|
+
return result.accumulator;
|
|
51
|
+
};
|
|
52
|
+
var findPreviousId = function (id, list) {
|
|
53
|
+
if (id === list.headId) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
return walkListItemRecord(function (acc, current) {
|
|
57
|
+
if (current.nextId === id) {
|
|
58
|
+
return {
|
|
59
|
+
result: current.id,
|
|
60
|
+
control: {
|
|
61
|
+
stop: true,
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
result: acc,
|
|
67
|
+
};
|
|
68
|
+
}, {
|
|
69
|
+
initValue: null,
|
|
70
|
+
startId: list.headId,
|
|
71
|
+
items: list.items,
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
var assertItemCompatibility = function (item, isDoubleLinkList) {
|
|
75
|
+
var incompatibleWithDoubleLinks = item.previousId === undefined && isDoubleLinkList;
|
|
76
|
+
var incompatibleWithSingleLink = item.previousId !== undefined && !isDoubleLinkList;
|
|
77
|
+
if (incompatibleWithDoubleLinks || incompatibleWithSingleLink) {
|
|
78
|
+
throw new Error("Node is incompatible with the list (id: ".concat(item.id, ")"));
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
var assertPresence = function (id, items) {
|
|
82
|
+
if (id && !items[id]) {
|
|
83
|
+
throw new Error("Node not found in the list (id: ".concat(id, ")"));
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
var assertNewNodePosition = function (item, config) {
|
|
87
|
+
var previousId = config.previousId, list = config.list;
|
|
88
|
+
var insertionMiddleError = previousId && list.items[previousId].nextId !== item.nextId;
|
|
89
|
+
var insertionTailError = previousId && item.nextId === null && list.items[previousId].nextId !== null;
|
|
90
|
+
var insertionHeadError = previousId === null && item.nextId !== list.headId;
|
|
91
|
+
if (insertionMiddleError || insertionTailError || insertionHeadError) {
|
|
92
|
+
throw new Error("Invalid position for given node (id: ".concat(item.id, ")"));
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export { assertItemCompatibility, assertNewNodePosition, assertPresence, findPreviousId, walkListItemRecord };
|
|
97
|
+
//# sourceMappingURL=linked-list-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linked-list-utils.js","sources":["../../src/linked-list/linked-list-utils.ts"],"sourcesContent":["import { runWhile } from '../fp';\nimport { LinkedListItem, HeadAndItems} from './type';\n\nexport type WalkConfig<T extends LinkedListItem, Result> = {\n startId: string | null,\n items: Record<string, T>,\n initValue: Result,\n}\n\ntype WalkCallbackResult<R> = {\n result: R,\n control?: {\n stop?: boolean,\n },\n};\n\nexport type WalkCallback<Item, Result> = (accumulator: Result, current: Item) => WalkCallbackResult<Result>;\n\ntype RunWhileValue<T> = {\n currentId: string | null,\n accumulator: T,\n control: WalkCallbackResult<any>['control'],\n}\n\nexport const walkListItemRecord = <T extends LinkedListItem, Result>(\n callback: WalkCallback<T, Result>,\n config: WalkConfig<T, Result>,\n) => {\n const { items, startId, initValue } = config;\n const visited = new Set();\n const totalNodes = Object.keys(items).length;\n\n const { iterationCount, result } = runWhile({\n iterationLimit: totalNodes + 1,\n initialValue: {\n currentId: startId, \n accumulator: initValue,\n control: {\n stop: false,\n },\n } as RunWhileValue<Result>,\n predicate: ({ control, currentId }) => {\n const stop = control?.stop;\n const forcedStop = stop === undefined ? false : stop;\n\n /**\n * Stop early or when the end is reached\n */\n return !forcedStop && currentId !== null;\n },\n callback: (current) => {\n if (visited.has(current.currentId)) {\n throw new Error('Infinite loop found');\n }\n\n visited.add(current.currentId);\n\n const currentItem = items[current.currentId!];\n\n if (!currentItem) {\n throw new Error('Cul de sac detected');\n }\n\n const { result, control } = callback(current.accumulator, currentItem);\n\n return {\n accumulator: result,\n currentId: currentItem.nextId,\n control: control,\n };\n },\n });\n\n /**\n * When force stopping the walk, we will always have unvisited\n * nodes, so we skip this check.\n */\n if (iterationCount !== totalNodes && result.control?.stop !== true) {\n throw new Error('Isolated nodes found');\n }\n\n return result.accumulator;\n};\n\nexport const findPreviousId = <T extends LinkedListItem>(id: string | null, list: HeadAndItems<T>) => {\n if (id === list.headId) {\n return null;\n }\n\n return walkListItemRecord(\n (acc, current) => {\n if (current.nextId === id) {\n return {\n result: current.id,\n control: {\n stop: true,\n },\n };\n }\n\n return {\n result: acc,\n }\n },\n {\n initValue: null as null | string,\n startId: list.headId,\n items: list.items,\n }\n )\n};\n\nexport const assertItemCompatibility = <T extends LinkedListItem>(item: T, isDoubleLinkList: boolean) => {\n const incompatibleWithDoubleLinks = item.previousId === undefined && isDoubleLinkList;\n const incompatibleWithSingleLink = item.previousId !== undefined && !isDoubleLinkList;\n\n if (incompatibleWithDoubleLinks || incompatibleWithSingleLink) {\n throw new Error(`Node is incompatible with the list (id: ${item.id})`);\n }\n}\n\nexport const assertPresence = (id: string | null | undefined, items: Record<string, unknown>) => {\n if (id && !items[id]) {\n throw new Error(`Node not found in the list (id: ${id})`);\n }\n}\n\ntype PositionAssertionConfig = {\n previousId: string | null,\n list: HeadAndItems<LinkedListItem>,\n};\n\nexport const assertNewNodePosition = <T extends LinkedListItem>(item: T, config: PositionAssertionConfig) => {\n const { previousId, list } = config;\n\n const insertionMiddleError = previousId && list.items[previousId].nextId !== item.nextId;\n const insertionTailError = previousId && item.nextId === null && list.items[previousId].nextId !== null;\n const insertionHeadError = previousId === null && item.nextId !== list.headId;\n\n if (insertionMiddleError || insertionTailError || insertionHeadError) {\n throw new Error(`Invalid position for given node (id: ${item.id})`);\n }\n}"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { walkListItemRecord } from './linked-list-utils.js';
|
|
2
|
+
|
|
3
|
+
var reduceLinkedList = function (cb, initValue, list) {
|
|
4
|
+
var items = list.items, headId = list.headId;
|
|
5
|
+
return walkListItemRecord(function (acc, current) {
|
|
6
|
+
return {
|
|
7
|
+
result: cb(acc, current),
|
|
8
|
+
};
|
|
9
|
+
}, {
|
|
10
|
+
startId: headId,
|
|
11
|
+
items: items,
|
|
12
|
+
initValue: initValue,
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export { reduceLinkedList };
|
|
17
|
+
//# sourceMappingURL=reduce-linked-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reduce-linked-list.js","sources":["../../src/linked-list/reduce-linked-list.ts"],"sourcesContent":["import { ReduceCallback, LinkedListItem, HeadAndItems } from './type';\nimport { walkListItemRecord } from './linked-list-utils';\n\nexport const reduceLinkedList = <Item extends LinkedListItem, Result>(\n cb: ReduceCallback<Item, Result>,\n initValue: Result,\n list: HeadAndItems<Item>,\n): Result => {\n const { items, headId } = list;\n\n return walkListItemRecord((acc, current) => {\n return {\n result: cb(acc, current),\n };\n }, {\n startId: headId,\n items,\n initValue,\n });\n};\n"],"names":[],"mappings":";;IAGa,gBAAgB,GAAG,UAC9B,EAAgC,EAChC,SAAiB,EACjB,IAAwB,EAAA;IAEhB,IAAA,KAAK,GAAa,IAAI,CAAA,KAAjB,EAAE,MAAM,GAAK,IAAI,CAAA,MAAT,CAAU;AAE/B,IAAA,OAAO,kBAAkB,CAAC,UAAC,GAAG,EAAE,OAAO,EAAA;QACrC,OAAO;AACL,YAAA,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC;SACzB,CAAC;AACJ,KAAC,EAAE;AACD,QAAA,OAAO,EAAE,MAAM;AACf,QAAA,KAAK,EAAA,KAAA;AACL,QAAA,SAAS,EAAA,SAAA;AACV,KAAA,CAAC,CAAC;AACL;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { __rest, __assign } from '../_virtual/_tslib.js';
|
|
2
|
+
import { assertPresence, findPreviousId } from './linked-list-utils.js';
|
|
3
|
+
|
|
4
|
+
var removeLinkedList = function (id, config) {
|
|
5
|
+
var _a, _b;
|
|
6
|
+
var isDoubleLinkList = config.isDoubleLinkList, list = config.list, factory = config.factory;
|
|
7
|
+
var _c = list.items, _d = id, itemToDelete = _c[_d], otherItems = __rest(_c, [typeof _d === "symbol" ? _d : _d + ""]);
|
|
8
|
+
assertPresence(id, list.items);
|
|
9
|
+
var previousId = isDoubleLinkList
|
|
10
|
+
? itemToDelete.previousId
|
|
11
|
+
: findPreviousId(id, list);
|
|
12
|
+
var newHeadId = previousId === null ? itemToDelete.nextId : list.headId;
|
|
13
|
+
var newItems = __assign(__assign(__assign({}, otherItems), (previousId ? (_a = {},
|
|
14
|
+
_a[previousId] = __assign(__assign({}, otherItems[previousId]), { nextId: itemToDelete.nextId }),
|
|
15
|
+
_a) : {})), (isDoubleLinkList && itemToDelete.nextId ? (_b = {},
|
|
16
|
+
_b[itemToDelete.nextId] = __assign(__assign({}, otherItems[itemToDelete.nextId]), (isDoubleLinkList ? { previousId: previousId } : {})),
|
|
17
|
+
_b) : {}));
|
|
18
|
+
return factory({
|
|
19
|
+
headId: newHeadId,
|
|
20
|
+
items: newItems,
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { removeLinkedList };
|
|
25
|
+
//# sourceMappingURL=remove-linked-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-linked-list.js","sources":["../../src/linked-list/remove-linked-list.ts"],"sourcesContent":["import { ManipulationConfig, LinkedListItem } from './type';\nimport { assertPresence, findPreviousId } from './linked-list-utils';\n\nexport const removeLinkedList = <T extends LinkedListItem>(id: string, config: ManipulationConfig<T>) => {\n const { isDoubleLinkList, list, factory } = config;\n const { [id]: itemToDelete, ...otherItems } = list.items;\n\n assertPresence(id, list.items);\n\n const previousId = isDoubleLinkList\n ? itemToDelete.previousId!\n : findPreviousId(id, list);\n\n const newHeadId = previousId === null ? itemToDelete.nextId : list.headId;\n const newItems = {\n ...otherItems,\n ...(previousId ? {\n [previousId]: {\n ...otherItems[previousId],\n nextId: itemToDelete.nextId,\n },\n } : {}),\n ...(isDoubleLinkList && itemToDelete.nextId ? {\n [itemToDelete.nextId]: {\n ...otherItems[itemToDelete.nextId],\n ...(isDoubleLinkList ? { previousId } : {}),\n }\n } : {}),\n };\n\n return factory({\n headId: newHeadId,\n items: newItems,\n });\n};"],"names":[],"mappings":";;;AAGa,IAAA,gBAAgB,GAAG,UAA2B,EAAU,EAAE,MAA6B,EAAA;;AAC1F,IAAA,IAAA,gBAAgB,GAAoB,MAAM,CAAA,gBAA1B,EAAE,IAAI,GAAc,MAAM,CAAA,IAApB,EAAE,OAAO,GAAK,MAAM,QAAX,CAAY;AACnD,IAAA,IAA8C,EAAA,GAAA,IAAI,CAAC,KAAK,EAAhD,EAAC,GAAA,EAAG,EAAE,YAAY,SAAA,EAAK,UAAU,GAAnC,MAAA,CAAA,EAAA,EAAA,CAAA,OAAA,EAAA,KAAA,QAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,CAAqC,CAAa,CAAC;AAEzD,IAAA,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAE/B,IAAM,UAAU,GAAG,gBAAgB;UAC/B,YAAY,CAAC,UAAW;AAC1B,UAAE,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAE7B,IAAA,IAAM,SAAS,GAAG,UAAU,KAAK,IAAI,GAAG,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC1E,IAAA,IAAM,QAAQ,GACT,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,EAAA,EAAA,UAAU,IACT,UAAU,IAAE,EAAA,GAAA,EAAA;AACd,QAAA,EAAA,CAAC,UAAU,CAAA,GAAA,QAAA,CAAA,QAAA,CAAA,EAAA,EACN,UAAU,CAAC,UAAU,CAAC,CACzB,EAAA,EAAA,MAAM,EAAE,YAAY,CAAC,MAAM,EAC5B,CAAA;cACC,EAAE,EACH,GAAC,gBAAgB,IAAI,YAAY,CAAC,MAAM,IAAE,EAAA,GAAA,EAAA;QAC3C,EAAC,CAAA,YAAY,CAAC,MAAM,CACf,GAAA,QAAA,CAAA,QAAA,CAAA,EAAA,EAAA,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAC/B,GAAC,gBAAgB,GAAG,EAAE,UAAU,EAAA,UAAA,EAAE,GAAG,EAAE,EAC3C;AACD,QAAA,EAAA,IAAE,EAAE,EACP,CAAC;AAEF,IAAA,OAAO,OAAO,CAAC;AACb,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,KAAK,EAAE,QAAQ;AAChB,KAAA,CAAC,CAAC;AACL;;;;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare type LinkedListItem = {
|
|
2
|
+
id: string;
|
|
3
|
+
nextId: string | null;
|
|
4
|
+
previousId?: string | null;
|
|
5
|
+
};
|
|
6
|
+
export declare type HeadAndItems<T extends LinkedListItem> = {
|
|
7
|
+
headId: string | null;
|
|
8
|
+
items: {
|
|
9
|
+
[id: string]: T;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export declare type ReduceCallback<Item, Result> = (accumulator: Result, current: Item) => Result;
|
|
13
|
+
export declare type ItemPredicate<Item> = (item: Item) => boolean;
|
|
14
|
+
export declare type ManipulationConfig<T extends LinkedListItem> = {
|
|
15
|
+
isDoubleLinkList: boolean;
|
|
16
|
+
list: HeadAndItems<T>;
|
|
17
|
+
factory: (list: HeadAndItems<T>) => LinkedList<T>;
|
|
18
|
+
};
|
|
19
|
+
export declare type LinkedList<T extends LinkedListItem> = {
|
|
20
|
+
readonly head: T | null;
|
|
21
|
+
readonly items: {
|
|
22
|
+
[id: string]: T;
|
|
23
|
+
};
|
|
24
|
+
readonly size: number;
|
|
25
|
+
readonly isDoubleLinked: boolean;
|
|
26
|
+
readonly reduce: <Result>(cb: ReduceCallback<T, Result>, init: Result) => Result;
|
|
27
|
+
readonly find: (predicate: ItemPredicate<T>) => T | null;
|
|
28
|
+
readonly while: (predicate: ItemPredicate<T>, startId?: string) => string[];
|
|
29
|
+
readonly remove: (id: string) => LinkedList<T>;
|
|
30
|
+
readonly insert: (item: T) => LinkedList<T>;
|
|
31
|
+
readonly get: (id: string) => T | null;
|
|
32
|
+
readonly update: (item: T) => LinkedList<T>;
|
|
33
|
+
readonly applyDiff: (before: T | null, after: T | null) => LinkedList<T>;
|
|
34
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { __rest, __assign } from '../_virtual/_tslib.js';
|
|
2
|
+
import { assertPresence } from './linked-list-utils.js';
|
|
3
|
+
|
|
4
|
+
var updateLinkedList = function (item, config) {
|
|
5
|
+
var _a;
|
|
6
|
+
var list = config.list, factory = config.factory;
|
|
7
|
+
assertPresence(item.id, list.items);
|
|
8
|
+
/**
|
|
9
|
+
* This method should not update any ids.
|
|
10
|
+
*/
|
|
11
|
+
item.nextId; item.previousId; item.id; var updatableProperties = __rest(item, ["nextId", "previousId", "id"]);
|
|
12
|
+
var currentItem = list.items[item.id];
|
|
13
|
+
var newItems = __assign(__assign({}, list.items), (_a = {}, _a[item.id] = __assign(__assign({}, currentItem), updatableProperties), _a));
|
|
14
|
+
return factory({
|
|
15
|
+
headId: list.headId,
|
|
16
|
+
items: newItems,
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { updateLinkedList };
|
|
21
|
+
//# sourceMappingURL=update-linked-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-linked-list.js","sources":["../../src/linked-list/update-linked-list.ts"],"sourcesContent":["import { ManipulationConfig, LinkedListItem } from './type';\nimport { assertPresence } from './linked-list-utils';\n\nexport const updateLinkedList = <T extends LinkedListItem>(item: T, config: ManipulationConfig<T>) => {\n const { list, factory } = config;\n\n assertPresence(item.id, list.items);\n\n /**\n * This method should not update any ids.\n */\n const { nextId, previousId, id, ...updatableProperties } = item;\n const currentItem = list.items[item.id];\n\n const newItems = {\n ...list.items,\n [item.id]: {\n ...currentItem,\n ...updatableProperties,\n },\n };\n\n return factory({\n headId: list.headId,\n items: newItems,\n });\n};\n"],"names":[],"mappings":";;;AAGa,IAAA,gBAAgB,GAAG,UAA2B,IAAO,EAAG,MAA6B,EAAA;;IACxF,IAAA,IAAI,GAAc,MAAM,CAAA,IAApB,EAAE,OAAO,GAAK,MAAM,CAAA,OAAX,CAAY;IAEjC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AAEpC;;AAEG;IACwD,IAAI,CAAA,MAAjD,EAA6C,IAAI,CAArC,UAAA,CAAA,CAAiC,IAAI,GAAjC,CAAK,KAAA,mBAAmB,UAAK,IAAI,EAAzD,CAAkD,QAAA,EAAA,YAAA,EAAA,IAAA,CAAA,EAAQ;IAChE,IAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAExC,IAAA,IAAM,QAAQ,GAAA,QAAA,CAAA,QAAA,CAAA,EAAA,EACT,IAAI,CAAC,KAAK,CACZ,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,CAAA,IAAI,CAAC,EAAE,CACH,GAAA,QAAA,CAAA,QAAA,CAAA,EAAA,EAAA,WAAW,CACX,EAAA,mBAAmB,OAEzB,CAAC;AAEF,IAAA,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;AACnB,QAAA,KAAK,EAAE,QAAQ;AAChB,KAAA,CAAC,CAAC;AACL;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { LinkedListItem } from './type';
|
|
2
|
+
export declare type WalkConfig<T extends LinkedListItem, Result> = {
|
|
3
|
+
startId: string | null;
|
|
4
|
+
items: Record<string, T>;
|
|
5
|
+
initValue: Result;
|
|
6
|
+
};
|
|
7
|
+
declare type WalkCallbackResult<R> = {
|
|
8
|
+
result: R;
|
|
9
|
+
control?: {
|
|
10
|
+
stop?: boolean;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export declare type WalkCallback<Item, Result> = (accumulator: Result, current: Item) => WalkCallbackResult<Result>;
|
|
14
|
+
export declare const walkListItemRecord: <T extends LinkedListItem, Result>(callback: WalkCallback<T, Result>, config: WalkConfig<T, Result>) => Result;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { __spreadArray } from '../_virtual/_tslib.js';
|
|
2
|
+
import { walkListItemRecord } from './linked-list-utils.js';
|
|
3
|
+
|
|
4
|
+
var whileLinkedList = function (predicate, list, startId) {
|
|
5
|
+
if (startId && !list.items[startId]) {
|
|
6
|
+
throw new Error('Cannot start from a node that does not exist');
|
|
7
|
+
}
|
|
8
|
+
return walkListItemRecord(function (acc, item) {
|
|
9
|
+
var itemMatched = predicate(item);
|
|
10
|
+
if (itemMatched) {
|
|
11
|
+
return {
|
|
12
|
+
result: __spreadArray(__spreadArray([], acc, true), [item.id], false),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
result: acc,
|
|
17
|
+
control: {
|
|
18
|
+
stop: true,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}, {
|
|
22
|
+
initValue: [],
|
|
23
|
+
startId: startId || list.headId,
|
|
24
|
+
items: list.items,
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export { whileLinkedList };
|
|
29
|
+
//# sourceMappingURL=while-linked-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"while-linked-list.js","sources":["../../src/linked-list/while-linked-list.ts"],"sourcesContent":["\n\nimport { LinkedListItem, ItemPredicate, HeadAndItems } from './type';\nimport { walkListItemRecord } from './linked-list-utils';\n\nexport const whileLinkedList = <Item extends LinkedListItem>(\n predicate: ItemPredicate<Item>,\n list: HeadAndItems<Item>,\n startId?: string,\n): string[] => {\n if (startId && !list.items[startId]) {\n throw new Error('Cannot start from a node that does not exist');\n }\n\n return walkListItemRecord(\n (acc, item) => {\n const itemMatched = predicate(item);\n\n if (itemMatched) {\n return {\n result: [...acc, item.id],\n };\n }\n\n return {\n result: acc,\n control: {\n stop: true,\n },\n };\n }, {\n initValue: [] as string[],\n startId: startId || list.headId,\n items: list.items,\n },\n );\n};\n"],"names":[],"mappings":";;;IAKa,eAAe,GAAG,UAC7B,SAA8B,EAC9B,IAAwB,EACxB,OAAgB,EAAA;IAEhB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;AACnC,QAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;AACjE,KAAA;AAED,IAAA,OAAO,kBAAkB,CACvB,UAAC,GAAG,EAAE,IAAI,EAAA;AACR,QAAA,IAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAEpC,QAAA,IAAI,WAAW,EAAE;YACf,OAAO;AACL,gBAAA,MAAM,kCAAM,GAAG,EAAA,IAAA,CAAA,EAAA,CAAE,IAAI,CAAC,EAAE,CAAC,EAAA,KAAA,CAAA;aAC1B,CAAC;AACH,SAAA;QAED,OAAO;AACL,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,OAAO,EAAE;AACP,gBAAA,IAAI,EAAE,IAAI;AACX,aAAA;SACF,CAAC;AACJ,KAAC,EAAE;AACD,QAAA,SAAS,EAAE,EAAc;AACzB,QAAA,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM;QAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;AAClB,KAAA,CACF,CAAC;AACJ;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { assertNumberRange } from './number-range.js';
|
|
2
|
+
|
|
3
|
+
var clampNumber = function (num, _a) {
|
|
4
|
+
var min = _a.min, max = _a.max;
|
|
5
|
+
assertNumberRange({ min: min, max: max });
|
|
6
|
+
return Math.min(Math.max(num, min), max);
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export { clampNumber };
|
|
10
|
+
//# sourceMappingURL=clamp-number.js.map
|