effect 2.0.3 → 2.0.5
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 +190 -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 +135 -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 +154 -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 +296 -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/FiberMap.ts
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
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
|
+
* Remove a fiber from the FiberMap, interrupting it if it exists.
|
|
221
|
+
*
|
|
222
|
+
* @since 2.0.0
|
|
223
|
+
* @categories combinators
|
|
224
|
+
*/
|
|
225
|
+
export const remove: {
|
|
226
|
+
<K>(key: K): <E, A>(self: FiberMap<K, E, A>) => Effect.Effect<never, never, void>
|
|
227
|
+
<K, E, A>(self: FiberMap<K, E, A>, key: K): Effect.Effect<never, never, void>
|
|
228
|
+
} = dual<
|
|
229
|
+
<K>(
|
|
230
|
+
key: K
|
|
231
|
+
) => <E, A>(self: FiberMap<K, E, A>) => Effect.Effect<never, never, void>,
|
|
232
|
+
<K, E, A>(
|
|
233
|
+
self: FiberMap<K, E, A>,
|
|
234
|
+
key: K
|
|
235
|
+
) => Effect.Effect<never, never, void>
|
|
236
|
+
>(2, (self, key) =>
|
|
237
|
+
Effect.suspend(() => {
|
|
238
|
+
const fiber = MutableHashMap.get(self.backing, key)
|
|
239
|
+
if (fiber._tag === "None") {
|
|
240
|
+
return Effect.unit
|
|
241
|
+
}
|
|
242
|
+
MutableHashMap.remove(self.backing, key)
|
|
243
|
+
return Fiber.interrupt(fiber.value)
|
|
244
|
+
}))
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* @since 2.0.0
|
|
248
|
+
* @categories combinators
|
|
249
|
+
*/
|
|
250
|
+
export const clear = <K, E, A>(self: FiberMap<K, E, A>): Effect.Effect<never, never, void> =>
|
|
251
|
+
Effect.zipRight(
|
|
252
|
+
Effect.forEach(self.backing, ([_, fiber]) => Fiber.interrupt(fiber)),
|
|
253
|
+
Effect.sync(() => {
|
|
254
|
+
MutableHashMap.clear(self.backing)
|
|
255
|
+
})
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Run an Effect and add the forked fiber to the FiberMap.
|
|
260
|
+
* When the fiber completes, it will be removed from the FiberMap.
|
|
261
|
+
*
|
|
262
|
+
* @since 2.0.0
|
|
263
|
+
* @categories combinators
|
|
264
|
+
*/
|
|
265
|
+
export const run: {
|
|
266
|
+
<K, E, A, R, XE extends E, XA extends A>(
|
|
267
|
+
key: K,
|
|
268
|
+
effect: Effect.Effect<R, XE, XA>
|
|
269
|
+
): (self: FiberMap<K, E, A>) => Effect.Effect<R, never, Fiber.RuntimeFiber<XE, XA>>
|
|
270
|
+
<K, E, A, R, XE extends E, XA extends A>(
|
|
271
|
+
self: FiberMap<K, E, A>,
|
|
272
|
+
key: K,
|
|
273
|
+
effect: Effect.Effect<R, XE, XA>
|
|
274
|
+
): Effect.Effect<R, never, Fiber.RuntimeFiber<XE, XA>>
|
|
275
|
+
} = dual<
|
|
276
|
+
<K, E, A, R, XE extends E, XA extends A>(
|
|
277
|
+
key: K,
|
|
278
|
+
effect: Effect.Effect<R, XE, XA>
|
|
279
|
+
) => (self: FiberMap<K, E, A>) => Effect.Effect<R, never, Fiber.RuntimeFiber<XE, XA>>,
|
|
280
|
+
<K, E, A, R, XE extends E, XA extends A>(
|
|
281
|
+
self: FiberMap<K, E, A>,
|
|
282
|
+
key: K,
|
|
283
|
+
effect: Effect.Effect<R, XE, XA>
|
|
284
|
+
) => Effect.Effect<R, never, Fiber.RuntimeFiber<XE, XA>>
|
|
285
|
+
>(3, (self, key, effect) =>
|
|
286
|
+
Effect.tap(
|
|
287
|
+
Effect.forkDaemon(effect),
|
|
288
|
+
(fiber) => set(self, key, fiber)
|
|
289
|
+
))
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* @since 2.0.0
|
|
293
|
+
* @categories combinators
|
|
294
|
+
*/
|
|
295
|
+
export const size = <K, E, A>(self: FiberMap<K, E, A>): Effect.Effect<never, never, number> =>
|
|
296
|
+
Effect.sync(() => MutableHashMap.size(self.backing))
|
package/src/FiberSet.ts
ADDED
|
@@ -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)
|
package/src/MutableHashMap.ts
CHANGED
|
@@ -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
|
package/src/MutableHashSet.ts
CHANGED
|
@@ -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)
|
package/src/MutableList.ts
CHANGED
|
@@ -76,13 +76,21 @@ interface MutableListImpl<A> extends MutableList<A> {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
/** @internal */
|
|
79
|
-
|
|
80
|
-
removed
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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 =
|
|
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 =
|
|
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"
|
|
@@ -415,7 +416,7 @@ export const count: Schedule<never, unknown, number> = internal.count
|
|
|
415
416
|
* @since 2.0.0
|
|
416
417
|
* @category constructors
|
|
417
418
|
*/
|
|
418
|
-
export const cron: (expression: string) => Schedule<never, unknown, [number, number]> = internal.cron
|
|
419
|
+
export const cron: (expression: string | Cron.Cron) => Schedule<never, unknown, [number, number]> = internal.cron
|
|
419
420
|
|
|
420
421
|
/**
|
|
421
422
|
* Cron-like schedule that recurs every specified `day` of month. Won't recur
|
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 = <
|
|
23
|
+
export const pick = <Keys extends Array<PropertyKey>>(
|
|
24
24
|
...keys: Keys
|
|
25
25
|
) =>
|
|
26
|
-
|
|
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 = <
|
|
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]
|