effect 2.0.2 → 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.
Files changed (127) hide show
  1. package/Cron/package.json +6 -0
  2. package/FiberMap/package.json +6 -0
  3. package/FiberSet/package.json +6 -0
  4. package/Trie/package.json +6 -0
  5. package/dist/cjs/Cron.js +457 -0
  6. package/dist/cjs/Cron.js.map +1 -0
  7. package/dist/cjs/Fiber.js.map +1 -1
  8. package/dist/cjs/FiberMap.js +176 -0
  9. package/dist/cjs/FiberMap.js.map +1 -0
  10. package/dist/cjs/FiberSet.js +150 -0
  11. package/dist/cjs/FiberSet.js.map +1 -0
  12. package/dist/cjs/MutableHashMap.js +11 -1
  13. package/dist/cjs/MutableHashMap.js.map +1 -1
  14. package/dist/cjs/MutableHashSet.js +7 -1
  15. package/dist/cjs/MutableHashSet.js.map +1 -1
  16. package/dist/cjs/MutableList.js +8 -11
  17. package/dist/cjs/MutableList.js.map +1 -1
  18. package/dist/cjs/Schedule.js +12 -1
  19. package/dist/cjs/Schedule.js.map +1 -1
  20. package/dist/cjs/Struct.js +16 -1
  21. package/dist/cjs/Struct.js.map +1 -1
  22. package/dist/cjs/Trie.js +680 -0
  23. package/dist/cjs/Trie.js.map +1 -0
  24. package/dist/cjs/index.js +10 -2
  25. package/dist/cjs/index.js.map +1 -1
  26. package/dist/cjs/internal/hashMap/node.js +2 -2
  27. package/dist/cjs/internal/hashMap/node.js.map +1 -1
  28. package/dist/cjs/internal/pubsub.js +11 -17
  29. package/dist/cjs/internal/pubsub.js.map +1 -1
  30. package/dist/cjs/internal/redBlackTree/node.js +35 -30
  31. package/dist/cjs/internal/redBlackTree/node.js.map +1 -1
  32. package/dist/cjs/internal/redBlackTree.js +69 -13
  33. package/dist/cjs/internal/redBlackTree.js.map +1 -1
  34. package/dist/cjs/internal/schedule.js +29 -2
  35. package/dist/cjs/internal/schedule.js.map +1 -1
  36. package/dist/cjs/internal/stack.js +6 -11
  37. package/dist/cjs/internal/stack.js.map +1 -1
  38. package/dist/cjs/internal/trie.js +588 -0
  39. package/dist/cjs/internal/trie.js.map +1 -0
  40. package/dist/cjs/internal/version.js +1 -1
  41. package/dist/dts/Cron.d.ts +170 -0
  42. package/dist/dts/Cron.d.ts.map +1 -0
  43. package/dist/dts/Fiber.d.ts +6 -0
  44. package/dist/dts/Fiber.d.ts.map +1 -1
  45. package/dist/dts/FiberMap.d.ts +125 -0
  46. package/dist/dts/FiberMap.d.ts.map +1 -0
  47. package/dist/dts/FiberSet.d.ts +99 -0
  48. package/dist/dts/FiberSet.d.ts.map +1 -0
  49. package/dist/dts/MutableHashMap.d.ts +4 -0
  50. package/dist/dts/MutableHashMap.d.ts.map +1 -1
  51. package/dist/dts/MutableHashSet.d.ts +5 -0
  52. package/dist/dts/MutableHashSet.d.ts.map +1 -1
  53. package/dist/dts/MutableList.d.ts.map +1 -1
  54. package/dist/dts/Schedule.d.ts +12 -0
  55. package/dist/dts/Schedule.d.ts.map +1 -1
  56. package/dist/dts/Struct.d.ts +17 -3
  57. package/dist/dts/Struct.d.ts.map +1 -1
  58. package/dist/dts/Trie.d.ts +740 -0
  59. package/dist/dts/Trie.d.ts.map +1 -0
  60. package/dist/dts/Types.d.ts +4 -0
  61. package/dist/dts/Types.d.ts.map +1 -1
  62. package/dist/dts/index.d.ts +30 -0
  63. package/dist/dts/index.d.ts.map +1 -1
  64. package/dist/dts/internal/redBlackTree/node.d.ts +8 -0
  65. package/dist/dts/internal/redBlackTree/node.d.ts.map +1 -1
  66. package/dist/dts/internal/stack.d.ts +1 -1
  67. package/dist/dts/internal/stack.d.ts.map +1 -1
  68. package/dist/dts/internal/trie.d.ts +2 -0
  69. package/dist/dts/internal/trie.d.ts.map +1 -0
  70. package/dist/dts/internal/version.d.ts +1 -1
  71. package/dist/esm/Cron.js +418 -0
  72. package/dist/esm/Cron.js.map +1 -0
  73. package/dist/esm/Fiber.js.map +1 -1
  74. package/dist/esm/FiberMap.js +140 -0
  75. package/dist/esm/FiberMap.js.map +1 -0
  76. package/dist/esm/FiberSet.js +114 -0
  77. package/dist/esm/FiberSet.js.map +1 -0
  78. package/dist/esm/MutableHashMap.js +9 -0
  79. package/dist/esm/MutableHashMap.js.map +1 -1
  80. package/dist/esm/MutableHashSet.js +5 -0
  81. package/dist/esm/MutableHashSet.js.map +1 -1
  82. package/dist/esm/MutableList.js +8 -11
  83. package/dist/esm/MutableList.js.map +1 -1
  84. package/dist/esm/Schedule.js +11 -0
  85. package/dist/esm/Schedule.js.map +1 -1
  86. package/dist/esm/Struct.js +14 -0
  87. package/dist/esm/Struct.js.map +1 -1
  88. package/dist/esm/Trie.js +648 -0
  89. package/dist/esm/Trie.js.map +1 -0
  90. package/dist/esm/index.js +30 -0
  91. package/dist/esm/index.js.map +1 -1
  92. package/dist/esm/internal/hashMap/node.js +2 -2
  93. package/dist/esm/internal/hashMap/node.js.map +1 -1
  94. package/dist/esm/internal/pubsub.js +11 -17
  95. package/dist/esm/internal/pubsub.js.map +1 -1
  96. package/dist/esm/internal/redBlackTree/node.js +31 -25
  97. package/dist/esm/internal/redBlackTree/node.js.map +1 -1
  98. package/dist/esm/internal/redBlackTree.js +69 -13
  99. package/dist/esm/internal/redBlackTree.js.map +1 -1
  100. package/dist/esm/internal/schedule.js +26 -0
  101. package/dist/esm/internal/schedule.js.map +1 -1
  102. package/dist/esm/internal/stack.js +4 -9
  103. package/dist/esm/internal/stack.js.map +1 -1
  104. package/dist/esm/internal/trie.js +547 -0
  105. package/dist/esm/internal/trie.js.map +1 -0
  106. package/dist/esm/internal/version.js +1 -1
  107. package/package.json +33 -1
  108. package/src/Cron.ts +525 -0
  109. package/src/Fiber.ts +7 -0
  110. package/src/FiberMap.ts +269 -0
  111. package/src/FiberSet.ts +194 -0
  112. package/src/MutableHashMap.ts +10 -0
  113. package/src/MutableHashSet.ts +6 -0
  114. package/src/MutableList.ts +15 -7
  115. package/src/Schedule.ts +13 -0
  116. package/src/Struct.ts +24 -6
  117. package/src/Trie.ts +772 -0
  118. package/src/Types.ts +5 -0
  119. package/src/index.ts +34 -0
  120. package/src/internal/hashMap/node.ts +3 -3
  121. package/src/internal/pubsub.ts +15 -14
  122. package/src/internal/redBlackTree/node.ts +37 -17
  123. package/src/internal/redBlackTree.ts +73 -38
  124. package/src/internal/schedule.ts +42 -0
  125. package/src/internal/stack.ts +8 -2
  126. package/src/internal/trie.ts +721 -0
  127. package/src/internal/version.ts +1 -1
@@ -0,0 +1,269 @@
1
+ /**
2
+ * @since 2.0.0
3
+ */
4
+ import * as Effect from "effect/Effect"
5
+ import type * as Scope from "effect/Scope"
6
+ import type { NoSuchElementException } from "./Cause.js"
7
+ import * as Fiber from "./Fiber.js"
8
+ import * as FiberId from "./FiberId.js"
9
+ import { dual } from "./Function.js"
10
+ import * as Inspectable from "./Inspectable.js"
11
+ import * as MutableHashMap from "./MutableHashMap.js"
12
+ import * as Option from "./Option.js"
13
+ import { type Pipeable, pipeArguments } from "./Pipeable.js"
14
+ import * as Predicate from "./Predicate.js"
15
+
16
+ /**
17
+ * @since 2.0.0
18
+ * @categories type ids
19
+ */
20
+ export const TypeId = Symbol.for("effect/FiberMap")
21
+
22
+ /**
23
+ * @since 2.0.0
24
+ * @categories type ids
25
+ */
26
+ export type TypeId = typeof TypeId
27
+
28
+ /**
29
+ * @since 2.0.0
30
+ * @categories models
31
+ */
32
+ export interface FiberMap<K, E = unknown, A = unknown>
33
+ extends Pipeable, Inspectable.Inspectable, Iterable<[K, Fiber.RuntimeFiber<E, A>]>
34
+ {
35
+ readonly [TypeId]: TypeId
36
+ readonly backing: MutableHashMap.MutableHashMap<K, Fiber.RuntimeFiber<E, A>>
37
+ }
38
+
39
+ /**
40
+ * @since 2.0.0
41
+ * @categories refinements
42
+ */
43
+ export const isFiberMap = (u: unknown): u is FiberMap<unknown> => Predicate.hasProperty(u, TypeId)
44
+
45
+ const Proto = {
46
+ [TypeId]: TypeId,
47
+ [Symbol.iterator](this: FiberMap<unknown>) {
48
+ return this.backing[Symbol.iterator]()
49
+ },
50
+ toString(this: FiberMap<unknown>) {
51
+ return Inspectable.format(this.toJSON())
52
+ },
53
+ toJSON(this: FiberMap<unknown>) {
54
+ return {
55
+ _id: "FiberMap",
56
+ backing: this.backing.toJSON()
57
+ }
58
+ },
59
+ [Inspectable.NodeInspectSymbol](this: FiberMap<unknown>) {
60
+ return this.toJSON()
61
+ },
62
+ pipe() {
63
+ return pipeArguments(this, arguments)
64
+ }
65
+ }
66
+
67
+ const unsafeMake = <K, E = unknown, A = unknown>(): FiberMap<K, E, A> => {
68
+ const self = Object.create(Proto)
69
+ self.backing = MutableHashMap.empty()
70
+ return self
71
+ }
72
+
73
+ /**
74
+ * A FiberMap can be used to store a collection of fibers, indexed by some key.
75
+ * When the associated Scope is closed, all fibers in the map will be interrupted.
76
+ *
77
+ * You can add fibers to the map using `FiberMap.set` or `FiberMap.run`, and the fibers will
78
+ * be automatically removed from the FiberMap when they complete.
79
+ *
80
+ * @example
81
+ * import { Effect, FiberMap } from "effect"
82
+ *
83
+ * Effect.gen(function*(_) {
84
+ * const map = yield* _(FiberMap.make<string>())
85
+ *
86
+ * // run some effects and add the fibers to the map
87
+ * yield* _(FiberMap.run(map, "fiber a", Effect.never))
88
+ * yield* _(FiberMap.run(map, "fiber b", Effect.never))
89
+ *
90
+ * yield* _(Effect.sleep(1000))
91
+ * }).pipe(
92
+ * Effect.scoped // The fibers will be interrupted when the scope is closed
93
+ * )
94
+ *
95
+ * @since 2.0.0
96
+ * @categories constructors
97
+ */
98
+ export const make = <K, E = unknown, A = unknown>(): Effect.Effect<Scope.Scope, never, FiberMap<K, E, A>> =>
99
+ Effect.acquireRelease(Effect.sync(() => unsafeMake<K, E, A>()), clear)
100
+
101
+ /**
102
+ * Add a fiber to the FiberMap. When the fiber completes, it will be removed from the FiberMap.
103
+ * If the key already exists in the FiberMap, the previous fiber will be interrupted.
104
+ *
105
+ * @since 2.0.0
106
+ * @categories combinators
107
+ */
108
+ export const unsafeSet: {
109
+ <K, E, A, XE extends E, XA extends A>(
110
+ key: K,
111
+ fiber: Fiber.RuntimeFiber<XE, XA>,
112
+ interruptAs?: FiberId.FiberId
113
+ ): (self: FiberMap<K, E, A>) => void
114
+ <K, E, A, XE extends E, XA extends A>(
115
+ self: FiberMap<K, E, A>,
116
+ key: K,
117
+ fiber: Fiber.RuntimeFiber<XE, XA>,
118
+ interruptAs?: FiberId.FiberId
119
+ ): void
120
+ } = dual<
121
+ <K, E, A, XE extends E, XA extends A>(
122
+ key: K,
123
+ fiber: Fiber.RuntimeFiber<XE, XA>,
124
+ interruptAs?: FiberId.FiberId
125
+ ) => (self: FiberMap<K, E, A>) => void,
126
+ <K, E, A, XE extends E, XA extends A>(
127
+ self: FiberMap<K, E, A>,
128
+ key: K,
129
+ fiber: Fiber.RuntimeFiber<XE, XA>,
130
+ interruptAs?: FiberId.FiberId
131
+ ) => void
132
+ >((args) => isFiberMap(args[0]), (self, key, fiber, interruptAs) => {
133
+ const previous = MutableHashMap.get(self.backing, key)
134
+ if (previous._tag === "Some") {
135
+ if (previous.value === fiber) {
136
+ return
137
+ }
138
+ previous.value.unsafeInterruptAsFork(interruptAs ?? FiberId.none)
139
+ }
140
+ MutableHashMap.set(self.backing, key, fiber)
141
+ fiber.addObserver((_) => {
142
+ const current = MutableHashMap.get(self.backing, key)
143
+ if (Option.isSome(current) && fiber === current.value) {
144
+ MutableHashMap.remove(self.backing, key)
145
+ }
146
+ })
147
+ })
148
+
149
+ /**
150
+ * Add a fiber to the FiberMap. When the fiber completes, it will be removed from the FiberMap.
151
+ * If the key already exists in the FiberMap, the previous fiber will be interrupted.
152
+ *
153
+ * @since 2.0.0
154
+ * @categories combinators
155
+ */
156
+ export const set: {
157
+ <K, E, A, XE extends E, XA extends A>(
158
+ key: K,
159
+ fiber: Fiber.RuntimeFiber<XE, XA>
160
+ ): (self: FiberMap<K, E, A>) => Effect.Effect<never, never, void>
161
+ <K, E, A, XE extends E, XA extends A>(
162
+ self: FiberMap<K, E, A>,
163
+ key: K,
164
+ fiber: Fiber.RuntimeFiber<XE, XA>
165
+ ): Effect.Effect<never, never, void>
166
+ } = dual<
167
+ <K, E, A, XE extends E, XA extends A>(
168
+ key: K,
169
+ fiber: Fiber.RuntimeFiber<XE, XA>
170
+ ) => (self: FiberMap<K, E, A>) => Effect.Effect<never, never, void>,
171
+ <K, E, A, XE extends E, XA extends A>(
172
+ self: FiberMap<K, E, A>,
173
+ key: K,
174
+ fiber: Fiber.RuntimeFiber<XE, XA>
175
+ ) => Effect.Effect<never, never, void>
176
+ >(3, (self, key, fiber) =>
177
+ Effect.fiberIdWith(
178
+ (fiberId) => Effect.sync(() => unsafeSet(self, key, fiber, fiberId))
179
+ ))
180
+
181
+ /**
182
+ * Retrieve a fiber from the FiberMap.
183
+ *
184
+ * @since 2.0.0
185
+ * @categories combinators
186
+ */
187
+ export const unsafeGet: {
188
+ <K>(key: K): <E, A>(self: FiberMap<K, E, A>) => Option.Option<Fiber.RuntimeFiber<E, A>>
189
+ <K, E, A>(self: FiberMap<K, E, A>, key: K): Option.Option<Fiber.RuntimeFiber<E, A>>
190
+ } = dual<
191
+ <K>(
192
+ key: K
193
+ ) => <E, A>(self: FiberMap<K, E, A>) => Option.Option<Fiber.RuntimeFiber<E, A>>,
194
+ <K, E, A>(
195
+ self: FiberMap<K, E, A>,
196
+ key: K
197
+ ) => Option.Option<Fiber.RuntimeFiber<E, A>>
198
+ >(2, (self, key) => MutableHashMap.get(self.backing, key))
199
+
200
+ /**
201
+ * Retrieve a fiber from the FiberMap.
202
+ *
203
+ * @since 2.0.0
204
+ * @categories combinators
205
+ */
206
+ export const get: {
207
+ <K>(key: K): <E, A>(self: FiberMap<K, E, A>) => Effect.Effect<never, NoSuchElementException, Fiber.RuntimeFiber<E, A>>
208
+ <K, E, A>(self: FiberMap<K, E, A>, key: K): Effect.Effect<never, NoSuchElementException, Fiber.RuntimeFiber<E, A>>
209
+ } = dual<
210
+ <K>(
211
+ key: K
212
+ ) => <E, A>(self: FiberMap<K, E, A>) => Effect.Effect<never, NoSuchElementException, Fiber.RuntimeFiber<E, A>>,
213
+ <K, E, A>(
214
+ self: FiberMap<K, E, A>,
215
+ key: K
216
+ ) => Effect.Effect<never, NoSuchElementException, Fiber.RuntimeFiber<E, A>>
217
+ >(2, (self, key) => Effect.suspend(() => MutableHashMap.get(self.backing, key)))
218
+
219
+ /**
220
+ * @since 2.0.0
221
+ * @categories combinators
222
+ */
223
+ export const clear = <K, E, A>(self: FiberMap<K, E, A>): Effect.Effect<never, never, void> =>
224
+ Effect.zipRight(
225
+ Effect.forEach(self.backing, ([_, fiber]) => Fiber.interrupt(fiber)),
226
+ Effect.sync(() => {
227
+ MutableHashMap.clear(self.backing)
228
+ })
229
+ )
230
+
231
+ /**
232
+ * Run an Effect and add the forked fiber to the FiberMap.
233
+ * When the fiber completes, it will be removed from the FiberMap.
234
+ *
235
+ * @since 2.0.0
236
+ * @categories combinators
237
+ */
238
+ export const run: {
239
+ <K, E, A, R, XE extends E, XA extends A>(
240
+ key: K,
241
+ effect: Effect.Effect<R, XE, XA>
242
+ ): (self: FiberMap<K, E, A>) => Effect.Effect<R, never, Fiber.RuntimeFiber<XE, XA>>
243
+ <K, E, A, R, XE extends E, XA extends A>(
244
+ self: FiberMap<K, E, A>,
245
+ key: K,
246
+ effect: Effect.Effect<R, XE, XA>
247
+ ): Effect.Effect<R, never, Fiber.RuntimeFiber<XE, XA>>
248
+ } = dual<
249
+ <K, E, A, R, XE extends E, XA extends A>(
250
+ key: K,
251
+ effect: Effect.Effect<R, XE, XA>
252
+ ) => (self: FiberMap<K, E, A>) => Effect.Effect<R, never, Fiber.RuntimeFiber<XE, XA>>,
253
+ <K, E, A, R, XE extends E, XA extends A>(
254
+ self: FiberMap<K, E, A>,
255
+ key: K,
256
+ effect: Effect.Effect<R, XE, XA>
257
+ ) => Effect.Effect<R, never, Fiber.RuntimeFiber<XE, XA>>
258
+ >(3, (self, key, effect) =>
259
+ Effect.tap(
260
+ Effect.forkDaemon(effect),
261
+ (fiber) => set(self, key, fiber)
262
+ ))
263
+
264
+ /**
265
+ * @since 2.0.0
266
+ * @categories combinators
267
+ */
268
+ export const size = <K, E, A>(self: FiberMap<K, E, A>): Effect.Effect<never, never, number> =>
269
+ Effect.sync(() => MutableHashMap.size(self.backing))
@@ -0,0 +1,194 @@
1
+ /**
2
+ * @since 2.0.0
3
+ */
4
+ import * as Effect from "effect/Effect"
5
+ import type * as Scope from "effect/Scope"
6
+ import * as Fiber from "./Fiber.js"
7
+ import { dual } from "./Function.js"
8
+ import * as Inspectable from "./Inspectable.js"
9
+ import { type Pipeable, pipeArguments } from "./Pipeable.js"
10
+ import * as Predicate from "./Predicate.js"
11
+
12
+ /**
13
+ * @since 2.0.0
14
+ * @categories type ids
15
+ */
16
+ export const TypeId = Symbol.for("effect/FiberSet")
17
+
18
+ /**
19
+ * @since 2.0.0
20
+ * @categories type ids
21
+ */
22
+ export type TypeId = typeof TypeId
23
+
24
+ /**
25
+ * @since 2.0.0
26
+ * @categories models
27
+ */
28
+ export interface FiberSet<E = unknown, A = unknown>
29
+ extends Pipeable, Inspectable.Inspectable, Iterable<Fiber.RuntimeFiber<E, A>>
30
+ {
31
+ readonly [TypeId]: TypeId
32
+ readonly backing: Set<Fiber.RuntimeFiber<E, A>>
33
+ }
34
+
35
+ /**
36
+ * @since 2.0.0
37
+ * @categories refinements
38
+ */
39
+ export const isFiberSet = (u: unknown): u is FiberSet<unknown> => Predicate.hasProperty(u, TypeId)
40
+
41
+ const Proto = {
42
+ [TypeId]: TypeId,
43
+ [Symbol.iterator](this: FiberSet) {
44
+ return this.backing[Symbol.iterator]()
45
+ },
46
+ toString(this: FiberSet) {
47
+ return Inspectable.format(this.toJSON())
48
+ },
49
+ toJSON(this: FiberSet) {
50
+ return {
51
+ _id: "FiberMap",
52
+ backing: Inspectable.toJSON(Array.from(this.backing))
53
+ }
54
+ },
55
+ [Inspectable.NodeInspectSymbol](this: FiberSet) {
56
+ return this.toJSON()
57
+ },
58
+ pipe() {
59
+ return pipeArguments(this, arguments)
60
+ }
61
+ }
62
+
63
+ const unsafeMake = <E = unknown, A = unknown>(): FiberSet<E, A> => {
64
+ const self = Object.create(Proto)
65
+ self.backing = new Set()
66
+ return self
67
+ }
68
+
69
+ /**
70
+ * A FiberSet can be used to store a collection of fibers.
71
+ * When the associated Scope is closed, all fibers in the set will be interrupted.
72
+ *
73
+ * You can add fibers to the set using `FiberSet.add` or `FiberSet.run`, and the fibers will
74
+ * be automatically removed from the FiberSet when they complete.
75
+ *
76
+ * @example
77
+ * import { Effect, FiberSet } from "effect"
78
+ *
79
+ * Effect.gen(function*(_) {
80
+ * const set = yield* _(FiberSet.make())
81
+ *
82
+ * // run some effects and add the fibers to the set
83
+ * yield* _(FiberSet.run(set, Effect.never))
84
+ * yield* _(FiberSet.run(set, Effect.never))
85
+ *
86
+ * yield* _(Effect.sleep(1000))
87
+ * }).pipe(
88
+ * Effect.scoped // The fibers will be interrupted when the scope is closed
89
+ * )
90
+ *
91
+ * @since 2.0.0
92
+ * @categories constructors
93
+ */
94
+ export const make = <E = unknown, A = unknown>(): Effect.Effect<Scope.Scope, never, FiberSet<E, A>> =>
95
+ Effect.acquireRelease(Effect.sync(() => unsafeMake<E, A>()), clear)
96
+
97
+ /**
98
+ * Add a fiber to the FiberSet. When the fiber completes, it will be removed.
99
+ *
100
+ * @since 2.0.0
101
+ * @categories combinators
102
+ */
103
+ export const unsafeAdd: {
104
+ <E, A, XE extends E, XA extends A>(fiber: Fiber.RuntimeFiber<XE, XA>): (self: FiberSet<E, A>) => void
105
+ <E, A, XE extends E, XA extends A>(self: FiberSet<E, A>, fiber: Fiber.RuntimeFiber<XE, XA>): void
106
+ } = dual<
107
+ <E, A, XE extends E, XA extends A>(
108
+ fiber: Fiber.RuntimeFiber<XE, XA>
109
+ ) => (self: FiberSet<E, A>) => void,
110
+ <E, A, XE extends E, XA extends A>(
111
+ self: FiberSet<E, A>,
112
+ fiber: Fiber.RuntimeFiber<XE, XA>
113
+ ) => void
114
+ >(2, (self, fiber) => {
115
+ if (self.backing.has(fiber)) {
116
+ return
117
+ }
118
+ self.backing.add(fiber)
119
+ fiber.addObserver((_) => {
120
+ self.backing.delete(fiber)
121
+ })
122
+ })
123
+
124
+ /**
125
+ * Add a fiber to the FiberSet. When the fiber completes, it will be removed.
126
+ *
127
+ * @since 2.0.0
128
+ * @categories combinators
129
+ */
130
+ export const add: {
131
+ <E, A, XE extends E, XA extends A>(
132
+ fiber: Fiber.RuntimeFiber<XE, XA>
133
+ ): (self: FiberSet<E, A>) => Effect.Effect<never, never, void>
134
+ <E, A, XE extends E, XA extends A>(
135
+ self: FiberSet<E, A>,
136
+ fiber: Fiber.RuntimeFiber<XE, XA>
137
+ ): Effect.Effect<never, never, void>
138
+ } = dual<
139
+ <E, A, XE extends E, XA extends A>(
140
+ fiber: Fiber.RuntimeFiber<XE, XA>
141
+ ) => (self: FiberSet<E, A>) => Effect.Effect<never, never, void>,
142
+ <E, A, XE extends E, XA extends A>(
143
+ self: FiberSet<E, A>,
144
+ fiber: Fiber.RuntimeFiber<XE, XA>
145
+ ) => Effect.Effect<never, never, void>
146
+ >(2, (self, fiber) => Effect.sync(() => unsafeAdd(self, fiber)))
147
+
148
+ /**
149
+ * @since 2.0.0
150
+ * @categories combinators
151
+ */
152
+ export const clear = <E, A>(self: FiberSet<E, A>): Effect.Effect<never, never, void> =>
153
+ Effect.zipRight(
154
+ Effect.forEach(self.backing, (fiber) => Fiber.interrupt(fiber)),
155
+ Effect.sync(() => {
156
+ self.backing.clear()
157
+ })
158
+ )
159
+
160
+ /**
161
+ * Fork an Effect and add the forked fiber to the FiberSet.
162
+ * When the fiber completes, it will be removed from the FiberSet.
163
+ *
164
+ * @since 2.0.0
165
+ * @categories combinators
166
+ */
167
+ export const run: {
168
+ <E, A, R, XE extends E, XA extends A>(
169
+ effect: Effect.Effect<R, XE, XA>
170
+ ): (self: FiberSet<E, A>) => Effect.Effect<R, never, Fiber.RuntimeFiber<XE, XA>>
171
+ <E, A, R, XE extends E, XA extends A>(
172
+ self: FiberSet<E, A>,
173
+ effect: Effect.Effect<R, XE, XA>
174
+ ): Effect.Effect<R, never, Fiber.RuntimeFiber<XE, XA>>
175
+ } = dual<
176
+ <E, A, R, XE extends E, XA extends A>(
177
+ effect: Effect.Effect<R, XE, XA>
178
+ ) => (self: FiberSet<E, A>) => Effect.Effect<R, never, Fiber.RuntimeFiber<XE, XA>>,
179
+ <E, A, R, XE extends E, XA extends A>(
180
+ self: FiberSet<E, A>,
181
+ effect: Effect.Effect<R, XE, XA>
182
+ ) => Effect.Effect<R, never, Fiber.RuntimeFiber<XE, XA>>
183
+ >(2, (self, effect) =>
184
+ Effect.tap(
185
+ Effect.forkDaemon(effect),
186
+ (fiber) => add(self, fiber)
187
+ ))
188
+
189
+ /**
190
+ * @since 2.0.0
191
+ * @categories combinators
192
+ */
193
+ export const size = <E, A>(self: FiberSet<E, A>): Effect.Effect<never, never, number> =>
194
+ Effect.sync(() => self.backing.size)
@@ -344,6 +344,16 @@ export const remove: {
344
344
  return self
345
345
  })
346
346
 
347
+ /**
348
+ * @since 2.0.0
349
+ */
350
+ export const clear = <K, V>(self: MutableHashMap<K, V>) => {
351
+ self.referential.clear()
352
+ self.buckets.clear()
353
+ self.bucketsSize = 0
354
+ return self
355
+ }
356
+
347
357
  /**
348
358
  * @since 2.0.0
349
359
  * @category elements
@@ -118,3 +118,9 @@ export const remove: {
118
118
  * @category elements
119
119
  */
120
120
  export const size = <V>(self: MutableHashSet<V>): number => MutableHashMap.size(self.keyMap)
121
+
122
+ /**
123
+ * @since 2.0.0
124
+ * @category elements
125
+ */
126
+ export const clear = <V>(self: MutableHashSet<V>): MutableHashSet<V> => (MutableHashMap.clear(self.keyMap), self)
@@ -76,13 +76,21 @@ interface MutableListImpl<A> extends MutableList<A> {
76
76
  }
77
77
 
78
78
  /** @internal */
79
- class LinkedListNode<T> {
80
- removed = false
81
- prev: LinkedListNode<T> | undefined = undefined
82
- next: LinkedListNode<T> | undefined = undefined
83
- constructor(readonly value: T) {}
79
+ interface LinkedListNode<T> {
80
+ removed: boolean
81
+ value: T
82
+ prev: LinkedListNode<T> | undefined
83
+ next: LinkedListNode<T> | undefined
84
84
  }
85
85
 
86
+ /** @internal */
87
+ const makeNode = <T>(value: T): LinkedListNode<T> => ({
88
+ value,
89
+ removed: false,
90
+ prev: undefined,
91
+ next: undefined
92
+ })
93
+
86
94
  /**
87
95
  * Creates an empty `MutableList`.
88
96
  *
@@ -196,7 +204,7 @@ export const append: {
196
204
  <A>(value: A) => (self: MutableList<A>) => MutableList<A>,
197
205
  <A>(self: MutableList<A>, value: A) => MutableList<A>
198
206
  >(2, <A>(self: MutableList<A>, value: A) => {
199
- const node = new LinkedListNode(value)
207
+ const node = makeNode(value)
200
208
  if (self.head === undefined) {
201
209
  self.head = node
202
210
  }
@@ -252,7 +260,7 @@ export const prepend: {
252
260
  <A>(value: A) => (self: MutableList<A>) => MutableList<A>,
253
261
  <A>(self: MutableList<A>, value: A) => MutableList<A>
254
262
  >(2, <A>(self: MutableList<A>, value: A) => {
255
- const node = new LinkedListNode(value)
263
+ const node = makeNode(value)
256
264
  node.next = self.head
257
265
  if (self.head !== undefined) {
258
266
  self.head.prev = node
package/src/Schedule.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  import type * as Cause from "./Cause.js"
5
5
  import type * as Chunk from "./Chunk.js"
6
6
  import type * as Context from "./Context.js"
7
+ import type * as Cron from "./Cron.js"
7
8
  import type * as Duration from "./Duration.js"
8
9
  import type * as Effect from "./Effect.js"
9
10
  import type * as Either from "./Either.js"
@@ -405,6 +406,18 @@ export const mapInputEffect: {
405
406
  */
406
407
  export const count: Schedule<never, unknown, number> = internal.count
407
408
 
409
+ /**
410
+ * Cron schedule that recurs every `minute` that matches the schedule.
411
+ *
412
+ * It triggers at zero second of the minute. Producing the timestamps of the cron window.
413
+ *
414
+ * NOTE: `expression` parameter is validated lazily. Must be a valid cron expression.
415
+ *
416
+ * @since 2.0.0
417
+ * @category constructors
418
+ */
419
+ export const cron: (expression: string | Cron.Cron) => Schedule<never, unknown, [number, number]> = internal.cron
420
+
408
421
  /**
409
422
  * Cron-like schedule that recurs every specified `day` of month. Won't recur
410
423
  * on months containing less days than specified in `day` param.
package/src/Struct.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  import * as Equivalence from "./Equivalence.js"
8
8
  import { dual } from "./Function.js"
9
9
  import * as order from "./Order.js"
10
- import type { Simplify } from "./Types.js"
10
+ import type { MatchRecord, Simplify } from "./Types.js"
11
11
 
12
12
  /**
13
13
  * Create a new object by picking properties of an existing object.
@@ -20,13 +20,15 @@ import type { Simplify } from "./Types.js"
20
20
  *
21
21
  * @since 2.0.0
22
22
  */
23
- export const pick = <S, Keys extends readonly [keyof S, ...Array<keyof S>]>(
23
+ export const pick = <Keys extends Array<PropertyKey>>(
24
24
  ...keys: Keys
25
25
  ) =>
26
- (s: S): Simplify<Pick<S, Keys[number]>> => {
26
+ <S extends Record<Keys[number], any>>(
27
+ s: S
28
+ ): MatchRecord<S, { [K in Keys[number]]: S[K] | undefined }, { [K in Keys[number]]: S[K] }> => {
27
29
  const out: any = {}
28
30
  for (const k of keys) {
29
- out[k] = s[k]
31
+ out[k] = (s as any)[k]
30
32
  }
31
33
  return out
32
34
  }
@@ -42,10 +44,10 @@ export const pick = <S, Keys extends readonly [keyof S, ...Array<keyof S>]>(
42
44
  *
43
45
  * @since 2.0.0
44
46
  */
45
- export const omit = <S, Keys extends readonly [keyof S, ...Array<keyof S>]>(
47
+ export const omit = <Keys extends Array<PropertyKey>>(
46
48
  ...keys: Keys
47
49
  ) =>
48
- (s: S): Simplify<Omit<S, Keys[number]>> => {
50
+ <S extends Record<Keys[number], any>>(s: S): Simplify<Omit<S, Keys[number]>> => {
49
51
  const out: any = { ...s }
50
52
  for (const k of keys) {
51
53
  delete out[k]
@@ -150,3 +152,19 @@ export const evolve: {
150
152
  return out as any
151
153
  }
152
154
  )
155
+
156
+ /**
157
+ * Retrieves the value associated with the specified key from a struct.
158
+ *
159
+ * @example
160
+ * import * as Struct from "effect/Struct"
161
+ * import { pipe } from "effect/Function"
162
+ *
163
+ * const value = pipe({ a: 1, b: 2 }, Struct.get("a"))
164
+ *
165
+ * assert.deepStrictEqual(value, 1)
166
+ *
167
+ * @since 2.0.0
168
+ */
169
+ export const get =
170
+ <K extends PropertyKey>(key: K) => <S extends Record<K, any>>(s: S): MatchRecord<S, S[K] | undefined, S[K]> => s[key]