@kensio/quando 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.md +135 -4
  2. package/dist/assigned.d.ts +68 -0
  3. package/dist/assigned.d.ts.map +1 -0
  4. package/dist/assigned.js +84 -0
  5. package/dist/assigned.js.map +1 -0
  6. package/dist/build.d.ts +54 -0
  7. package/dist/build.d.ts.map +1 -0
  8. package/dist/build.js +77 -0
  9. package/dist/build.js.map +1 -0
  10. package/dist/canonical-rule.d.ts +23 -0
  11. package/dist/canonical-rule.d.ts.map +1 -0
  12. package/dist/canonical-rule.js +139 -0
  13. package/dist/canonical-rule.js.map +1 -0
  14. package/dist/canonical.d.ts +44 -0
  15. package/dist/canonical.d.ts.map +1 -0
  16. package/dist/canonical.js +53 -0
  17. package/dist/canonical.js.map +1 -0
  18. package/dist/cascade.d.ts +107 -0
  19. package/dist/cascade.d.ts.map +1 -0
  20. package/dist/cascade.js +53 -0
  21. package/dist/cascade.js.map +1 -0
  22. package/dist/context.d.ts +44 -0
  23. package/dist/context.d.ts.map +1 -0
  24. package/dist/context.js +9 -0
  25. package/dist/context.js.map +1 -0
  26. package/dist/day-rules.d.ts +23 -0
  27. package/dist/day-rules.d.ts.map +1 -0
  28. package/dist/day-rules.js +102 -0
  29. package/dist/day-rules.js.map +1 -0
  30. package/dist/index.d.ts +37 -2
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +24 -2
  33. package/dist/index.js.map +1 -1
  34. package/dist/interpret.d.ts +31 -0
  35. package/dist/interpret.d.ts.map +1 -0
  36. package/dist/interpret.js +99 -0
  37. package/dist/interpret.js.map +1 -0
  38. package/dist/interval-stream.d.ts +11 -4
  39. package/dist/interval-stream.d.ts.map +1 -1
  40. package/dist/interval-stream.js.map +1 -1
  41. package/dist/merge.d.ts +43 -0
  42. package/dist/merge.d.ts.map +1 -0
  43. package/dist/merge.js +79 -0
  44. package/dist/merge.js.map +1 -0
  45. package/dist/parse-cascade.d.ts +37 -0
  46. package/dist/parse-cascade.d.ts.map +1 -0
  47. package/dist/parse-cascade.js +105 -0
  48. package/dist/parse-cascade.js.map +1 -0
  49. package/dist/parse-fields.d.ts +27 -0
  50. package/dist/parse-fields.d.ts.map +1 -0
  51. package/dist/parse-fields.js +65 -0
  52. package/dist/parse-fields.js.map +1 -0
  53. package/dist/parse-shape.d.ts +39 -0
  54. package/dist/parse-shape.d.ts.map +1 -0
  55. package/dist/parse-shape.js +77 -0
  56. package/dist/parse-shape.js.map +1 -0
  57. package/dist/parse.d.ts +22 -0
  58. package/dist/parse.d.ts.map +1 -0
  59. package/dist/parse.js +93 -0
  60. package/dist/parse.js.map +1 -0
  61. package/dist/plain-forms.d.ts +22 -0
  62. package/dist/plain-forms.d.ts.map +1 -0
  63. package/dist/plain-forms.js +54 -0
  64. package/dist/plain-forms.js.map +1 -0
  65. package/dist/query.d.ts +73 -0
  66. package/dist/query.d.ts.map +1 -0
  67. package/dist/query.js +127 -0
  68. package/dist/query.js.map +1 -0
  69. package/dist/resolve.d.ts +31 -0
  70. package/dist/resolve.d.ts.map +1 -0
  71. package/dist/resolve.js +95 -0
  72. package/dist/resolve.js.map +1 -0
  73. package/dist/rota.d.ts +49 -0
  74. package/dist/rota.d.ts.map +1 -0
  75. package/dist/rota.js +41 -0
  76. package/dist/rota.js.map +1 -0
  77. package/dist/rule.d.ts +73 -0
  78. package/dist/rule.d.ts.map +1 -0
  79. package/dist/rule.js +20 -0
  80. package/dist/rule.js.map +1 -0
  81. package/dist/schedule.d.ts +69 -0
  82. package/dist/schedule.d.ts.map +1 -0
  83. package/dist/schedule.js +80 -0
  84. package/dist/schedule.js.map +1 -0
  85. package/dist/tally.d.ts +76 -0
  86. package/dist/tally.d.ts.map +1 -0
  87. package/dist/tally.js +80 -0
  88. package/dist/tally.js.map +1 -0
  89. package/dist/time-rules.d.ts +18 -0
  90. package/dist/time-rules.d.ts.map +1 -0
  91. package/dist/time-rules.js +55 -0
  92. package/dist/time-rules.js.map +1 -0
  93. package/dist/valued-stream.d.ts +51 -0
  94. package/dist/valued-stream.d.ts.map +1 -0
  95. package/dist/valued-stream.js +148 -0
  96. package/dist/valued-stream.js.map +1 -0
  97. package/package.json +22 -20
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Streams of intervals that carry values, and the operations resolution needs
3
+ * over them.
4
+ *
5
+ * The same shape as `interval-stream.ts` one level down, and deliberately
6
+ * separate from it. Those sweeps are set algebra over *when*, and nothing in
7
+ * them has an opinion about values. {@link overlay} is where an opinion is
8
+ * needed, and it is handed one rather than choosing.
9
+ */
10
+ import type { Valued } from "./cascade.js";
11
+ import type { Merge } from "./merge.js";
12
+ /**
13
+ * A lazy sequence of valued intervals.
14
+ *
15
+ * Same contract as `IntervalStream` — ascending by start, non-overlapping,
16
+ * coalesced — with one addition: touching intervals carrying the same value
17
+ * are merged, so where two intervals do touch, the values on either side of
18
+ * the boundary differ.
19
+ */
20
+ export type ValuedStream<V> = Iterable<Valued<V>>;
21
+ /**
22
+ * Two streams laid over one another, with `merge` settling the overlap.
23
+ *
24
+ * Where only one covers a moment, its value comes through. Where both do, the
25
+ * two values go to `merge`, `under` first. Where neither does, the moment is
26
+ * absent, the same as everywhere else in the library.
27
+ *
28
+ * It walks both fronts and cuts whichever runs on at the other's boundary, so
29
+ * it pulls only as far as the next piece of the answer and stays lazy over
30
+ * endless sources.
31
+ *
32
+ * Output is not coalesced. Cutting at every boundary splits runs carrying the
33
+ * same value on both sides, and {@link coalesce} over the top puts them back.
34
+ * Teaching this sweep to look ahead instead would buy nothing.
35
+ */
36
+ export declare function overlay<V>(under: ValuedStream<V>, over: ValuedStream<V>, merge: Merge<V>): ValuedStream<V>;
37
+ /**
38
+ * Adjacent intervals carrying the same value are one interval.
39
+ *
40
+ * Without this, a run that happens to be split across two layers comes back as
41
+ * two touching intervals with equal values — the same assignment said twice,
42
+ * and a stream that no longer satisfies the coalesced contract the rest of the
43
+ * library keeps.
44
+ *
45
+ * Sameness is `Object.is`, so primitives and shared references merge while
46
+ * structurally-equal objects do not. That is the conservative way round: it
47
+ * splits an interval that could have been merged rather than merging two the
48
+ * caller meant to keep apart.
49
+ */
50
+ export declare function coalesce<V>(source: ValuedStream<V>): ValuedStream<V>;
51
+ //# sourceMappingURL=valued-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valued-stream.d.ts","sourceRoot":"","sources":["../src/valued-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGxC;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAElD;;;;;;;;;;;;;;GAcG;AACH,wBAAiB,OAAO,CAAC,CAAC,EACxB,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EACtB,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EACrB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GACd,YAAY,CAAC,CAAC,CAAC,CAsDjB;AA+CD;;;;;;;;;;;;GAYG;AACH,wBAAiB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAmBrE"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Streams of intervals that carry values, and the operations resolution needs
3
+ * over them.
4
+ *
5
+ * The same shape as `interval-stream.ts` one level down, and deliberately
6
+ * separate from it. Those sweeps are set algebra over *when*, and nothing in
7
+ * them has an opinion about values. {@link overlay} is where an opinion is
8
+ * needed, and it is handed one rather than choosing.
9
+ */
10
+ import { compareEnds, compareStarts, earlierEnd } from "./interval.js";
11
+ import { peekable } from "./stream.js";
12
+ /**
13
+ * Two streams laid over one another, with `merge` settling the overlap.
14
+ *
15
+ * Where only one covers a moment, its value comes through. Where both do, the
16
+ * two values go to `merge`, `under` first. Where neither does, the moment is
17
+ * absent, the same as everywhere else in the library.
18
+ *
19
+ * It walks both fronts and cuts whichever runs on at the other's boundary, so
20
+ * it pulls only as far as the next piece of the answer and stays lazy over
21
+ * endless sources.
22
+ *
23
+ * Output is not coalesced. Cutting at every boundary splits runs carrying the
24
+ * same value on both sides, and {@link coalesce} over the top puts them back.
25
+ * Teaching this sweep to look ahead instead would buy nothing.
26
+ */
27
+ export function* overlay(under, over, merge) {
28
+ const a = peekable(under);
29
+ const b = peekable(over);
30
+ // What is left of each front interval. A stretch already yielded is cut off
31
+ // the front rather than yielded twice, which is what keeps this to one pass
32
+ // over sources that can only be read forwards.
33
+ let restA = a.peek();
34
+ let restB = b.peek();
35
+ for (;;) {
36
+ if (restA === undefined || restB === undefined) {
37
+ yield* remainder(restA ?? restB, restA === undefined ? b : a);
38
+ return;
39
+ }
40
+ const order = compareStarts(restA.start, restB.start);
41
+ if (order === 0) {
42
+ // Both cover the stretch up to whichever ends first, and that stretch is
43
+ // the only place `merge` is ever called.
44
+ const end = earlierEnd(restA.end, restB.end);
45
+ yield { start: restA.start, end, value: merge(restA.value, restB.value) };
46
+ const cutA = cut(restA, end, a);
47
+ restB = cut(restB, end, b);
48
+ restA = cutA;
49
+ continue;
50
+ }
51
+ // One of them starts first and holds alone until the other begins. Its own
52
+ // end may come first, in which case the whole of it stands alone.
53
+ if (order < 0) {
54
+ const boundary = restB.start;
55
+ if (compareEnds(restA.end, boundary) <= 0) {
56
+ yield restA;
57
+ a.drop();
58
+ restA = a.peek();
59
+ continue;
60
+ }
61
+ yield { start: restA.start, end: boundary, value: restA.value };
62
+ restA = { ...restA, start: boundary };
63
+ continue;
64
+ }
65
+ const boundary = restA.start;
66
+ if (compareEnds(restB.end, boundary) <= 0) {
67
+ yield restB;
68
+ b.drop();
69
+ restB = b.peek();
70
+ continue;
71
+ }
72
+ yield { start: restB.start, end: boundary, value: restB.value };
73
+ restB = { ...restB, start: boundary };
74
+ }
75
+ }
76
+ /**
77
+ * Whatever is left of one side once the other is spent, beginning with the
78
+ * piece already in hand.
79
+ *
80
+ * That piece may have been cut short, so it is yielded from the local rather
81
+ * than read again from the source, and the source's own copy of it dropped.
82
+ */
83
+ function* remainder(held, source) {
84
+ if (held === undefined) {
85
+ return;
86
+ }
87
+ yield held;
88
+ source.drop();
89
+ for (;;) {
90
+ const next = source.peek();
91
+ if (next === undefined) {
92
+ return;
93
+ }
94
+ source.drop();
95
+ yield next;
96
+ }
97
+ }
98
+ /**
99
+ * What is left of an interval once the stretch up to `end` has been yielded.
100
+ *
101
+ * An interval used up entirely is dropped and the next one pulled, so the
102
+ * front always holds something still to yield.
103
+ */
104
+ function cut(interval, end, source) {
105
+ if (end === undefined || compareEnds(interval.end, end) <= 0) {
106
+ source.drop();
107
+ return source.peek();
108
+ }
109
+ return { ...interval, start: end };
110
+ }
111
+ /**
112
+ * Adjacent intervals carrying the same value are one interval.
113
+ *
114
+ * Without this, a run that happens to be split across two layers comes back as
115
+ * two touching intervals with equal values — the same assignment said twice,
116
+ * and a stream that no longer satisfies the coalesced contract the rest of the
117
+ * library keeps.
118
+ *
119
+ * Sameness is `Object.is`, so primitives and shared references merge while
120
+ * structurally-equal objects do not. That is the conservative way round: it
121
+ * splits an interval that could have been merged rather than merging two the
122
+ * caller meant to keep apart.
123
+ */
124
+ export function* coalesce(source) {
125
+ let open;
126
+ for (const next of source) {
127
+ if (open === undefined) {
128
+ open = next;
129
+ continue;
130
+ }
131
+ if (Object.is(open.value, next.value) && touches(open, next)) {
132
+ open = { ...open, end: next.end };
133
+ continue;
134
+ }
135
+ yield open;
136
+ open = next;
137
+ }
138
+ if (open !== undefined) {
139
+ yield open;
140
+ }
141
+ }
142
+ /** Whether one interval ends exactly where the next begins. */
143
+ function touches(open, next) {
144
+ return (open.end !== undefined &&
145
+ next.start !== undefined &&
146
+ Temporal.ZonedDateTime.compare(open.end, next.start) === 0);
147
+ }
148
+ //# sourceMappingURL=valued-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valued-stream.js","sourceRoot":"","sources":["../src/valued-stream.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@kensio/quando",
3
- "version": "0.1.0",
3
+ "version": "1.0.0",
4
4
  "description": "Declarative temporal rules for schedules, deadlines, constraints, and exceptions",
5
- "repository": "https://github.com/KensioSoftware/quando",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/KensioSoftware/quando"
8
+ },
6
9
  "homepage": "https://quandojs.dev",
7
10
  "bugs": "https://github.com/KensioSoftware/quando/issues",
8
11
  "main": "./dist/index.js",
@@ -23,25 +26,11 @@
23
26
  "imports": {
24
27
  "#test/*": "./test/*"
25
28
  },
26
- "packageManager": "pnpm@11.21.0+sha512.521705bce689924eac72f5a3587122f362689ef6571e55ba80076fd637c11132ecffada26fad4ea79c485bfddbfd3d5a2a5b05805a77e893de71ec8a6cca3bb1",
27
29
  "engines": {
28
30
  "node": ">=26.0.0"
29
31
  },
30
- "scripts": {
31
- "build": "rm -rf dist && tsc -p tsconfig.build.json",
32
- "prepack": "pnpm build",
33
- "build:check": "tsc -p tsconfig.json --noEmit",
34
- "fmt": "oxlint --fix . && oxfmt .",
35
- "lint": "oxlint . && oxfmt --check .",
36
- "lint:ci": "oxlint --format=github . && oxfmt --check .",
37
- "docs:check": "./scripts/sh/docs-check.sh",
38
- "fta": "./scripts/sh/fta.sh",
39
- "test": "vitest run",
40
- "test:coverage": "vitest run --coverage",
41
- "pack:check": "./scripts/sh/pack-check.sh",
42
- "check": "pnpm fmt && pnpm docs:check && pnpm fta && pnpm build:check && pnpm pack:check && pnpm test:coverage"
43
- },
44
32
  "devDependencies": {
33
+ "@faker-js/faker": "^10.6.0",
45
34
  "@kensio/smartass": "^1.33.0",
46
35
  "@semantic-release/exec": "7.1.0",
47
36
  "@types/node": "^26.0.0",
@@ -49,7 +38,7 @@
49
38
  "@vitest/coverage-v8": "^4.1.10",
50
39
  "conventional-changelog-conventionalcommits": "9.3.1",
51
40
  "fta-cli": "^3.0.0",
52
- "oxfmt": "^0.62.0",
41
+ "oxfmt": "^0.65.0",
53
42
  "oxlint": "^1.77.0",
54
43
  "oxlint-tsgolint": "^7.0.2001",
55
44
  "semantic-release": "25.0.9",
@@ -67,5 +56,18 @@
67
56
  },
68
57
  "author": "Kensio Software",
69
58
  "license": "Apache-2.0",
70
- "type": "module"
71
- }
59
+ "type": "module",
60
+ "scripts": {
61
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
62
+ "build:check": "tsc -p tsconfig.json --noEmit",
63
+ "fmt": "oxlint --fix . && oxfmt .",
64
+ "lint": "oxlint . && oxfmt --check .",
65
+ "lint:ci": "oxlint --format=github . && oxfmt --check .",
66
+ "docs:check": "./scripts/sh/docs-check.sh",
67
+ "fta": "./scripts/sh/fta.sh",
68
+ "test": "vitest run",
69
+ "test:coverage": "vitest run --coverage",
70
+ "pack:check": "./scripts/sh/pack-check.sh",
71
+ "check": "pnpm fmt && pnpm docs:check && pnpm fta && pnpm build:check && pnpm pack:check && pnpm test:coverage"
72
+ }
73
+ }