effect 2.0.3 → 2.0.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.
- package/FiberMap/package.json +6 -0
- package/FiberSet/package.json +6 -0
- package/Trie/package.json +6 -0
- package/dist/cjs/FiberMap.js +176 -0
- package/dist/cjs/FiberMap.js.map +1 -0
- package/dist/cjs/FiberSet.js +150 -0
- package/dist/cjs/FiberSet.js.map +1 -0
- package/dist/cjs/MutableHashMap.js +11 -1
- package/dist/cjs/MutableHashMap.js.map +1 -1
- package/dist/cjs/MutableHashSet.js +7 -1
- package/dist/cjs/MutableHashSet.js.map +1 -1
- package/dist/cjs/MutableList.js +8 -11
- package/dist/cjs/MutableList.js.map +1 -1
- package/dist/cjs/Schedule.js.map +1 -1
- package/dist/cjs/Struct.js +16 -1
- package/dist/cjs/Struct.js.map +1 -1
- package/dist/cjs/Trie.js +680 -0
- package/dist/cjs/Trie.js.map +1 -0
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internal/hashMap/node.js +2 -2
- package/dist/cjs/internal/hashMap/node.js.map +1 -1
- package/dist/cjs/internal/pubsub.js +11 -17
- package/dist/cjs/internal/pubsub.js.map +1 -1
- package/dist/cjs/internal/redBlackTree/node.js +35 -30
- package/dist/cjs/internal/redBlackTree/node.js.map +1 -1
- package/dist/cjs/internal/redBlackTree.js +69 -13
- package/dist/cjs/internal/redBlackTree.js.map +1 -1
- package/dist/cjs/internal/schedule.js +1 -1
- package/dist/cjs/internal/schedule.js.map +1 -1
- package/dist/cjs/internal/stack.js +6 -11
- package/dist/cjs/internal/stack.js.map +1 -1
- package/dist/cjs/internal/trie.js +588 -0
- package/dist/cjs/internal/trie.js.map +1 -0
- package/dist/cjs/internal/version.js +1 -1
- package/dist/dts/FiberMap.d.ts +125 -0
- package/dist/dts/FiberMap.d.ts.map +1 -0
- package/dist/dts/FiberSet.d.ts +99 -0
- package/dist/dts/FiberSet.d.ts.map +1 -0
- package/dist/dts/MutableHashMap.d.ts +4 -0
- package/dist/dts/MutableHashMap.d.ts.map +1 -1
- package/dist/dts/MutableHashSet.d.ts +5 -0
- package/dist/dts/MutableHashSet.d.ts.map +1 -1
- package/dist/dts/MutableList.d.ts.map +1 -1
- package/dist/dts/Schedule.d.ts +2 -1
- package/dist/dts/Schedule.d.ts.map +1 -1
- package/dist/dts/Struct.d.ts +17 -3
- package/dist/dts/Struct.d.ts.map +1 -1
- package/dist/dts/Trie.d.ts +740 -0
- package/dist/dts/Trie.d.ts.map +1 -0
- package/dist/dts/Types.d.ts +4 -0
- package/dist/dts/Types.d.ts.map +1 -1
- package/dist/dts/index.d.ts +26 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/redBlackTree/node.d.ts +8 -0
- package/dist/dts/internal/redBlackTree/node.d.ts.map +1 -1
- package/dist/dts/internal/stack.d.ts +1 -1
- package/dist/dts/internal/stack.d.ts.map +1 -1
- package/dist/dts/internal/trie.d.ts +2 -0
- package/dist/dts/internal/trie.d.ts.map +1 -0
- package/dist/dts/internal/version.d.ts +1 -1
- package/dist/esm/FiberMap.js +140 -0
- package/dist/esm/FiberMap.js.map +1 -0
- package/dist/esm/FiberSet.js +114 -0
- package/dist/esm/FiberSet.js.map +1 -0
- package/dist/esm/MutableHashMap.js +9 -0
- package/dist/esm/MutableHashMap.js.map +1 -1
- package/dist/esm/MutableHashSet.js +5 -0
- package/dist/esm/MutableHashSet.js.map +1 -1
- package/dist/esm/MutableList.js +8 -11
- package/dist/esm/MutableList.js.map +1 -1
- package/dist/esm/Schedule.js.map +1 -1
- package/dist/esm/Struct.js +14 -0
- package/dist/esm/Struct.js.map +1 -1
- package/dist/esm/Trie.js +648 -0
- package/dist/esm/Trie.js.map +1 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/hashMap/node.js +2 -2
- package/dist/esm/internal/hashMap/node.js.map +1 -1
- package/dist/esm/internal/pubsub.js +11 -17
- package/dist/esm/internal/pubsub.js.map +1 -1
- package/dist/esm/internal/redBlackTree/node.js +31 -25
- package/dist/esm/internal/redBlackTree/node.js.map +1 -1
- package/dist/esm/internal/redBlackTree.js +69 -13
- package/dist/esm/internal/redBlackTree.js.map +1 -1
- package/dist/esm/internal/schedule.js +1 -1
- package/dist/esm/internal/schedule.js.map +1 -1
- package/dist/esm/internal/stack.js +4 -9
- package/dist/esm/internal/stack.js.map +1 -1
- package/dist/esm/internal/trie.js +547 -0
- package/dist/esm/internal/trie.js.map +1 -0
- package/dist/esm/internal/version.js +1 -1
- package/package.json +25 -1
- package/src/FiberMap.ts +269 -0
- package/src/FiberSet.ts +194 -0
- package/src/MutableHashMap.ts +10 -0
- package/src/MutableHashSet.ts +6 -0
- package/src/MutableList.ts +15 -7
- package/src/Schedule.ts +2 -1
- package/src/Struct.ts +24 -6
- package/src/Trie.ts +772 -0
- package/src/Types.ts +5 -0
- package/src/index.ts +29 -0
- package/src/internal/hashMap/node.ts +3 -3
- package/src/internal/pubsub.ts +15 -14
- package/src/internal/redBlackTree/node.ts +37 -17
- package/src/internal/redBlackTree.ts +73 -38
- package/src/internal/schedule.ts +2 -2
- package/src/internal/stack.ts +8 -2
- package/src/internal/trie.ts +721 -0
- package/src/internal/version.ts +1 -1
package/src/Types.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -260,6 +260,11 @@ export * as Fiber from "./Fiber.js"
|
|
|
260
260
|
*/
|
|
261
261
|
export * as FiberId from "./FiberId.js"
|
|
262
262
|
|
|
263
|
+
/**
|
|
264
|
+
* @since 2.0.0
|
|
265
|
+
*/
|
|
266
|
+
export * as FiberMap from "./FiberMap.js"
|
|
267
|
+
|
|
263
268
|
/**
|
|
264
269
|
* @since 2.0.0
|
|
265
270
|
*/
|
|
@@ -275,6 +280,11 @@ export * as FiberRefs from "./FiberRefs.js"
|
|
|
275
280
|
*/
|
|
276
281
|
export * as FiberRefsPatch from "./FiberRefsPatch.js"
|
|
277
282
|
|
|
283
|
+
/**
|
|
284
|
+
* @since 2.0.0
|
|
285
|
+
*/
|
|
286
|
+
export * as FiberSet from "./FiberSet.js"
|
|
287
|
+
|
|
278
288
|
/**
|
|
279
289
|
* @since 2.0.0
|
|
280
290
|
*/
|
|
@@ -837,6 +847,25 @@ export * as TestSized from "./TestSized.js"
|
|
|
837
847
|
*/
|
|
838
848
|
export * as Tracer from "./Tracer.js"
|
|
839
849
|
|
|
850
|
+
/**
|
|
851
|
+
* A `Trie` is used for locating specific `string` keys from within a set.
|
|
852
|
+
*
|
|
853
|
+
* It works similar to `HashMap`, but with keys required to be `string`.
|
|
854
|
+
* This constraint unlocks some performance optimizations and new methods to get string prefixes (e.g. `keysWithPrefix`, `longestPrefixOf`).
|
|
855
|
+
*
|
|
856
|
+
* Prefix search is also the main feature that makes a `Trie` more suited than `HashMap` for certain usecases.
|
|
857
|
+
*
|
|
858
|
+
* A `Trie` is often used to store a dictionary (list of words) that can be searched
|
|
859
|
+
* in a manner that allows for efficient generation of completion lists
|
|
860
|
+
* (e.g. predict the rest of a word a user is typing).
|
|
861
|
+
*
|
|
862
|
+
* A `Trie` has O(n) lookup time where `n` is the size of the key,
|
|
863
|
+
* or even less than `n` on search misses.
|
|
864
|
+
*
|
|
865
|
+
* @since 2.0.0
|
|
866
|
+
*/
|
|
867
|
+
export * as Trie from "./Trie.js"
|
|
868
|
+
|
|
840
869
|
/**
|
|
841
870
|
* This module provides utility functions for working with tuples in TypeScript.
|
|
842
871
|
*
|
|
@@ -2,7 +2,7 @@ import { equals } from "../../Equal.js"
|
|
|
2
2
|
import type { HashMap } from "../../HashMap.js"
|
|
3
3
|
import * as O from "../../Option.js"
|
|
4
4
|
import { isTagged } from "../../Predicate.js"
|
|
5
|
-
import
|
|
5
|
+
import * as Stack from "../stack.js"
|
|
6
6
|
import { arraySpliceIn, arraySpliceOut, arrayUpdate } from "./array.js"
|
|
7
7
|
import { fromBitmap, hashFragment, toBitmap } from "./bitwise.js"
|
|
8
8
|
import { MAX_INDEX_NODE, MIN_ARRAY_NODE, SIZE } from "./config.js"
|
|
@@ -370,14 +370,14 @@ function mergeLeaves<K, V>(
|
|
|
370
370
|
h2: number,
|
|
371
371
|
n2: Node<K, V>
|
|
372
372
|
): Node<K, V> {
|
|
373
|
-
let stack: Stack<(node: Node<K, V>) => Node<K, V>> | undefined = undefined
|
|
373
|
+
let stack: Stack.Stack<(node: Node<K, V>) => Node<K, V>> | undefined = undefined
|
|
374
374
|
let currentShift = shift
|
|
375
375
|
// eslint-disable-next-line no-constant-condition
|
|
376
376
|
while (true) {
|
|
377
377
|
const res = mergeLeavesInner(edit, currentShift, h1, n1, h2, n2)
|
|
378
378
|
|
|
379
379
|
if (typeof res === "function") {
|
|
380
|
-
stack =
|
|
380
|
+
stack = Stack.make(res, stack)
|
|
381
381
|
currentShift = currentShift + SIZE
|
|
382
382
|
} else {
|
|
383
383
|
let final = res
|
package/src/internal/pubsub.ts
CHANGED
|
@@ -645,28 +645,25 @@ class BoundedPubSubSingleSubscription<in out A> implements Subscription<A> {
|
|
|
645
645
|
}
|
|
646
646
|
|
|
647
647
|
/** @internal */
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
public next: Node<A> | null
|
|
653
|
-
) {
|
|
654
|
-
}
|
|
648
|
+
interface Node<out A> {
|
|
649
|
+
value: A | AbsentValue
|
|
650
|
+
subscribers: number
|
|
651
|
+
next: Node<A> | null
|
|
655
652
|
}
|
|
656
653
|
|
|
657
654
|
/** @internal */
|
|
658
655
|
class UnboundedPubSub<in out A> implements AtomicPubSub<A> {
|
|
659
|
-
publisherHead
|
|
656
|
+
publisherHead: Node<A> = {
|
|
657
|
+
value: AbsentValue,
|
|
658
|
+
subscribers: 0,
|
|
659
|
+
next: null
|
|
660
|
+
}
|
|
661
|
+
publisherTail = this.publisherHead
|
|
660
662
|
publisherIndex = 0
|
|
661
|
-
publisherTail: Node<A>
|
|
662
663
|
subscribersIndex = 0
|
|
663
664
|
|
|
664
665
|
readonly capacity = Number.MAX_SAFE_INTEGER
|
|
665
666
|
|
|
666
|
-
constructor() {
|
|
667
|
-
this.publisherTail = this.publisherHead
|
|
668
|
-
}
|
|
669
|
-
|
|
670
667
|
isEmpty(): boolean {
|
|
671
668
|
return this.publisherHead === this.publisherTail
|
|
672
669
|
}
|
|
@@ -682,7 +679,11 @@ class UnboundedPubSub<in out A> implements AtomicPubSub<A> {
|
|
|
682
679
|
publish(value: A): boolean {
|
|
683
680
|
const subscribers = this.publisherTail.subscribers
|
|
684
681
|
if (subscribers !== 0) {
|
|
685
|
-
this.publisherTail.next =
|
|
682
|
+
this.publisherTail.next = {
|
|
683
|
+
value,
|
|
684
|
+
subscribers,
|
|
685
|
+
next: null
|
|
686
|
+
}
|
|
686
687
|
this.publisherTail = this.publisherTail.next
|
|
687
688
|
this.publisherIndex += 1
|
|
688
689
|
}
|
|
@@ -10,22 +10,31 @@ export declare namespace Node {
|
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
public right: Node<K, V> | undefined,
|
|
21
|
-
public count: number
|
|
22
|
-
) {}
|
|
13
|
+
export interface Node<out K, out V> {
|
|
14
|
+
color: Node.Color
|
|
15
|
+
key: K
|
|
16
|
+
value: V
|
|
17
|
+
left: Node<K, V> | undefined
|
|
18
|
+
right: Node<K, V> | undefined
|
|
19
|
+
count: number
|
|
23
20
|
}
|
|
24
21
|
|
|
25
22
|
/** @internal */
|
|
26
|
-
export
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
export const clone = <K, V>({
|
|
24
|
+
color,
|
|
25
|
+
count,
|
|
26
|
+
key,
|
|
27
|
+
left,
|
|
28
|
+
right,
|
|
29
|
+
value
|
|
30
|
+
}: Node<K, V>) => ({
|
|
31
|
+
color,
|
|
32
|
+
key,
|
|
33
|
+
value,
|
|
34
|
+
left,
|
|
35
|
+
right,
|
|
36
|
+
count
|
|
37
|
+
})
|
|
29
38
|
|
|
30
39
|
/** @internal */
|
|
31
40
|
export function swap<K, V>(n: Node<K, V>, v: Node<K, V>) {
|
|
@@ -38,11 +47,22 @@ export function swap<K, V>(n: Node<K, V>, v: Node<K, V>) {
|
|
|
38
47
|
}
|
|
39
48
|
|
|
40
49
|
/** @internal */
|
|
41
|
-
export
|
|
42
|
-
|
|
43
|
-
|
|
50
|
+
export const repaint = <K, V>({
|
|
51
|
+
count,
|
|
52
|
+
key,
|
|
53
|
+
left,
|
|
54
|
+
right,
|
|
55
|
+
value
|
|
56
|
+
}: Node<K, V>, color: Node.Color) => ({
|
|
57
|
+
color,
|
|
58
|
+
key,
|
|
59
|
+
value,
|
|
60
|
+
left,
|
|
61
|
+
right,
|
|
62
|
+
count
|
|
63
|
+
})
|
|
44
64
|
|
|
45
65
|
/** @internal */
|
|
46
|
-
export
|
|
66
|
+
export const recount = <K, V>(node: Node<K, V>) => {
|
|
47
67
|
node.count = 1 + (node.left?.count ?? 0) + (node.right?.count ?? 0)
|
|
48
68
|
}
|
|
@@ -11,7 +11,7 @@ import { hasProperty } from "../Predicate.js"
|
|
|
11
11
|
import type * as RBT from "../RedBlackTree.js"
|
|
12
12
|
import { Direction, RedBlackTreeIterator } from "./redBlackTree/iterator.js"
|
|
13
13
|
import * as Node from "./redBlackTree/node.js"
|
|
14
|
-
import
|
|
14
|
+
import * as Stack from "./stack.js"
|
|
15
15
|
|
|
16
16
|
const RedBlackTreeSymbolKey = "effect/RedBlackTree"
|
|
17
17
|
|
|
@@ -288,27 +288,34 @@ export const insert = dual<
|
|
|
288
288
|
}
|
|
289
289
|
}
|
|
290
290
|
// Rebuild path to leaf node
|
|
291
|
-
n_stack.push(
|
|
291
|
+
n_stack.push({
|
|
292
|
+
color: Node.Color.Red,
|
|
293
|
+
key,
|
|
294
|
+
value,
|
|
295
|
+
left: undefined,
|
|
296
|
+
right: undefined,
|
|
297
|
+
count: 1
|
|
298
|
+
})
|
|
292
299
|
for (let s = n_stack.length - 2; s >= 0; --s) {
|
|
293
300
|
const n2 = n_stack[s]!
|
|
294
301
|
if (d_stack[s]! <= 0) {
|
|
295
|
-
n_stack[s] =
|
|
296
|
-
n2.color,
|
|
297
|
-
n2.key,
|
|
298
|
-
n2.value,
|
|
299
|
-
n_stack[s + 1],
|
|
300
|
-
n2.right,
|
|
301
|
-
n2.count + 1
|
|
302
|
-
|
|
302
|
+
n_stack[s] = {
|
|
303
|
+
color: n2.color,
|
|
304
|
+
key: n2.key,
|
|
305
|
+
value: n2.value,
|
|
306
|
+
left: n_stack[s + 1],
|
|
307
|
+
right: n2.right,
|
|
308
|
+
count: n2.count + 1
|
|
309
|
+
}
|
|
303
310
|
} else {
|
|
304
|
-
n_stack[s] =
|
|
305
|
-
n2.color,
|
|
306
|
-
n2.key,
|
|
307
|
-
n2.value,
|
|
308
|
-
n2.left,
|
|
309
|
-
n_stack[s + 1],
|
|
310
|
-
n2.count + 1
|
|
311
|
-
|
|
311
|
+
n_stack[s] = {
|
|
312
|
+
color: n2.color,
|
|
313
|
+
key: n2.key,
|
|
314
|
+
value: n2.value,
|
|
315
|
+
left: n2.left,
|
|
316
|
+
right: n_stack[s + 1],
|
|
317
|
+
count: n2.count + 1
|
|
318
|
+
}
|
|
312
319
|
}
|
|
313
320
|
}
|
|
314
321
|
// Rebalance tree using rotations
|
|
@@ -778,20 +785,34 @@ export const removeFirst = dual<
|
|
|
778
785
|
}
|
|
779
786
|
const cstack = new Array<Node.Node<K, V>>(stack.length)
|
|
780
787
|
let n = stack[stack.length - 1]!
|
|
781
|
-
cstack[cstack.length - 1] =
|
|
782
|
-
n.color,
|
|
783
|
-
n.key,
|
|
784
|
-
n.value,
|
|
785
|
-
n.left,
|
|
786
|
-
n.right,
|
|
787
|
-
n.count
|
|
788
|
-
|
|
788
|
+
cstack[cstack.length - 1] = {
|
|
789
|
+
color: n.color,
|
|
790
|
+
key: n.key,
|
|
791
|
+
value: n.value,
|
|
792
|
+
left: n.left,
|
|
793
|
+
right: n.right,
|
|
794
|
+
count: n.count
|
|
795
|
+
}
|
|
789
796
|
for (let i = stack.length - 2; i >= 0; --i) {
|
|
790
797
|
n = stack[i]!
|
|
791
798
|
if (n.left === stack[i + 1]) {
|
|
792
|
-
cstack[i] =
|
|
799
|
+
cstack[i] = {
|
|
800
|
+
color: n.color,
|
|
801
|
+
key: n.key,
|
|
802
|
+
value: n.value,
|
|
803
|
+
left: cstack[i + 1],
|
|
804
|
+
right: n.right,
|
|
805
|
+
count: n.count
|
|
806
|
+
}
|
|
793
807
|
} else {
|
|
794
|
-
cstack[i] =
|
|
808
|
+
cstack[i] = {
|
|
809
|
+
color: n.color,
|
|
810
|
+
key: n.key,
|
|
811
|
+
value: n.value,
|
|
812
|
+
left: n.left,
|
|
813
|
+
right: cstack[i + 1],
|
|
814
|
+
count: n.count
|
|
815
|
+
}
|
|
795
816
|
}
|
|
796
817
|
}
|
|
797
818
|
// Get node
|
|
@@ -807,13 +828,27 @@ export const removeFirst = dual<
|
|
|
807
828
|
}
|
|
808
829
|
// Copy path to leaf
|
|
809
830
|
const v = cstack[split - 1]
|
|
810
|
-
cstack.push(
|
|
831
|
+
cstack.push({
|
|
832
|
+
color: n.color,
|
|
833
|
+
key: v!.key,
|
|
834
|
+
value: v!.value,
|
|
835
|
+
left: n.left,
|
|
836
|
+
right: n.right,
|
|
837
|
+
count: n.count
|
|
838
|
+
})
|
|
811
839
|
cstack[split - 1]!.key = n.key
|
|
812
840
|
cstack[split - 1]!.value = n.value
|
|
813
841
|
// Fix up stack
|
|
814
842
|
for (let i = cstack.length - 2; i >= split; --i) {
|
|
815
843
|
n = cstack[i]!
|
|
816
|
-
cstack[i] =
|
|
844
|
+
cstack[i] = {
|
|
845
|
+
color: n.color,
|
|
846
|
+
key: n.key,
|
|
847
|
+
value: n.value,
|
|
848
|
+
left: n.left,
|
|
849
|
+
right: cstack[i + 1],
|
|
850
|
+
count: n.count
|
|
851
|
+
}
|
|
817
852
|
}
|
|
818
853
|
cstack[split - 1]!.left = cstack[split]
|
|
819
854
|
}
|
|
@@ -913,11 +948,11 @@ const visitFull = <K, V, A>(
|
|
|
913
948
|
visit: (key: K, value: V) => Option.Option<A>
|
|
914
949
|
): Option.Option<A> => {
|
|
915
950
|
let current: Node.Node<K, V> | undefined = node
|
|
916
|
-
let stack: Stack<Node.Node<K, V>> | undefined = undefined
|
|
951
|
+
let stack: Stack.Stack<Node.Node<K, V>> | undefined = undefined
|
|
917
952
|
let done = false
|
|
918
953
|
while (!done) {
|
|
919
954
|
if (current != null) {
|
|
920
|
-
stack =
|
|
955
|
+
stack = Stack.make(current, stack)
|
|
921
956
|
current = current.left
|
|
922
957
|
} else if (stack != null) {
|
|
923
958
|
const value = visit(stack.value.key, stack.value.value)
|
|
@@ -940,11 +975,11 @@ const visitGreaterThanEqual = <K, V, A>(
|
|
|
940
975
|
visit: (key: K, value: V) => Option.Option<A>
|
|
941
976
|
): Option.Option<A> => {
|
|
942
977
|
let current: Node.Node<K, V> | undefined = node
|
|
943
|
-
let stack: Stack<Node.Node<K, V>> | undefined = undefined
|
|
978
|
+
let stack: Stack.Stack<Node.Node<K, V>> | undefined = undefined
|
|
944
979
|
let done = false
|
|
945
980
|
while (!done) {
|
|
946
981
|
if (current !== undefined) {
|
|
947
|
-
stack =
|
|
982
|
+
stack = Stack.make(current, stack)
|
|
948
983
|
if (ord(min, current.key) <= 0) {
|
|
949
984
|
current = current.left
|
|
950
985
|
} else {
|
|
@@ -973,11 +1008,11 @@ const visitLessThan = <K, V, A>(
|
|
|
973
1008
|
visit: (key: K, value: V) => Option.Option<A>
|
|
974
1009
|
): Option.Option<A> => {
|
|
975
1010
|
let current: Node.Node<K, V> | undefined = node
|
|
976
|
-
let stack: Stack<Node.Node<K, V>> | undefined = undefined
|
|
1011
|
+
let stack: Stack.Stack<Node.Node<K, V>> | undefined = undefined
|
|
977
1012
|
let done = false
|
|
978
1013
|
while (!done) {
|
|
979
1014
|
if (current !== undefined) {
|
|
980
|
-
stack =
|
|
1015
|
+
stack = Stack.make(current, stack)
|
|
981
1016
|
current = current.left
|
|
982
1017
|
} else if (stack !== undefined && ord(max, stack.value.key) > 0) {
|
|
983
1018
|
const value = visit(stack.value.key, stack.value.value)
|
|
@@ -1001,11 +1036,11 @@ const visitBetween = <K, V, A>(
|
|
|
1001
1036
|
visit: (key: K, value: V) => Option.Option<A>
|
|
1002
1037
|
): Option.Option<A> => {
|
|
1003
1038
|
let current: Node.Node<K, V> | undefined = node
|
|
1004
|
-
let stack: Stack<Node.Node<K, V>> | undefined = undefined
|
|
1039
|
+
let stack: Stack.Stack<Node.Node<K, V>> | undefined = undefined
|
|
1005
1040
|
let done = false
|
|
1006
1041
|
while (!done) {
|
|
1007
1042
|
if (current !== undefined) {
|
|
1008
|
-
stack =
|
|
1043
|
+
stack = Stack.make(current, stack)
|
|
1009
1044
|
if (ord(min, current.key) <= 0) {
|
|
1010
1045
|
current = current.left
|
|
1011
1046
|
} else {
|
package/src/internal/schedule.ts
CHANGED
|
@@ -421,8 +421,8 @@ export const mapInputEffect = dual<
|
|
|
421
421
|
)))
|
|
422
422
|
|
|
423
423
|
/** @internal */
|
|
424
|
-
export const cron = (expression: string): Schedule.Schedule<never, unknown, [number, number]> => {
|
|
425
|
-
const parsed = Cron.parse(expression)
|
|
424
|
+
export const cron = (expression: string | Cron.Cron): Schedule.Schedule<never, unknown, [number, number]> => {
|
|
425
|
+
const parsed = Cron.isCron(expression) ? Either.right(expression) : Cron.parse(expression)
|
|
426
426
|
return makeWithState<[boolean, [number, number, number]], never, unknown, [number, number]>(
|
|
427
427
|
[true, [Number.MIN_SAFE_INTEGER, 0, 0]],
|
|
428
428
|
(now, _, [initial, previous]) => {
|
package/src/internal/stack.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
/** @internal */
|
|
2
|
-
export
|
|
3
|
-
|
|
2
|
+
export interface Stack<out A> {
|
|
3
|
+
readonly value: A
|
|
4
|
+
readonly previous: Stack<A> | undefined
|
|
4
5
|
}
|
|
6
|
+
|
|
7
|
+
export const make = <A>(value: A, previous?: Stack<A>): Stack<A> => ({
|
|
8
|
+
value,
|
|
9
|
+
previous
|
|
10
|
+
})
|