xcraft-core-pickaxe 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,92 @@
1
+ /* eslint-disable jsdoc/require-returns */
2
+ // @ts-check
3
+
4
+ const $ = require('xcraft-core-pickaxe/lib/operators.js');
5
+ const {RecordPick, ValuePick} = require('./picks.js');
6
+ const {StringType, NumberType} = require('xcraft-core-stones');
7
+
8
+ /**
9
+ * @typedef {Record<string, number>} LevelSet
10
+ * @typedef {RecordPick<StringType, NumberType>} LevelSetPick
11
+ * @typedef {LevelSet | LevelSetPick} LevelSetArg
12
+ */
13
+
14
+ /**
15
+ * @param {LevelSetPick} set
16
+ * @param {string | ValuePick<StringType>} key
17
+ * @param {number | ValuePick<NumberType>} value
18
+ */
19
+ function levelSetHasValue(set, key, value) {
20
+ return set.some((v, k) => $.and(k.eq(key), v.gte(value)));
21
+ }
22
+
23
+ /**
24
+ * @param {LevelSet} set
25
+ * @param {ValuePick<StringType>} key
26
+ * @param {ValuePick<NumberType>} value
27
+ */
28
+ function levelSetHasValue2(set, key, value) {
29
+ return $.or(
30
+ ...Object.entries(set).map(([k, v]) => $.and(key.eq(k), value.lte(v)))
31
+ );
32
+ }
33
+
34
+ /**
35
+ * @param {LevelSetArg} set
36
+ */
37
+ function levelSetIsEmpty(set) {
38
+ if (!(set instanceof RecordPick)) {
39
+ return $.value(Object.keys(set).length === 0);
40
+ }
41
+ return set.keys().length.eq(0);
42
+ }
43
+
44
+ /**
45
+ * @param {LevelSetPick} set1
46
+ * @param {LevelSet} set2
47
+ */
48
+ function levelSetIsSubsetOf(set1, set2) {
49
+ return set1.every((value, name) => levelSetHasValue2(set2, name, value));
50
+ }
51
+
52
+ /**
53
+ * @param {LevelSetPick} set1
54
+ * @param {LevelSet} set2
55
+ */
56
+ function levelSetIsSupersetOf(set1, set2) {
57
+ return $.and(
58
+ ...Object.entries(set2).map(([k, v]) => levelSetHasValue(set1, k, v))
59
+ );
60
+ }
61
+
62
+ /**
63
+ * @param {LevelSetPick} set1
64
+ * @param {LevelSet} set2
65
+ */
66
+ function levelSetHasIntersectionWith(set1, set2) {
67
+ return $.or(
68
+ levelSetIsEmpty(set1),
69
+ levelSetIsEmpty(set2),
70
+ set1.some((value, name) => levelSetHasValue2(set2, name, value))
71
+ );
72
+ }
73
+
74
+ /**
75
+ * @param {LevelSetPick} set1
76
+ * @param {LevelSet} set2
77
+ */
78
+ function levelSetIsEqualTo(set1, set2) {
79
+ return $.and(
80
+ levelSetIsSubsetOf(set1, set2),
81
+ levelSetIsSupersetOf(set1, set2)
82
+ );
83
+ }
84
+
85
+ module.exports = {
86
+ levelSetHasValue,
87
+ levelSetIsEmpty,
88
+ levelSetIsSubsetOf,
89
+ levelSetIsSupersetOf,
90
+ levelSetHasIntersectionWith,
91
+ levelSetIsEqualTo,
92
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xcraft-core-pickaxe",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Query builder",
5
5
  "main": "index.js",
6
6
  "scripts": {