effect 3.10.8 → 3.10.10
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/dist/cjs/Effect.js +1 -1
- package/dist/cjs/Effect.js.map +1 -1
- package/dist/cjs/FiberHandle.js +0 -3
- package/dist/cjs/FiberHandle.js.map +1 -1
- package/dist/cjs/FiberMap.js +0 -3
- package/dist/cjs/FiberMap.js.map +1 -1
- package/dist/cjs/FiberSet.js +0 -4
- package/dist/cjs/FiberSet.js.map +1 -1
- package/dist/cjs/Mailbox.js +9 -1
- package/dist/cjs/Mailbox.js.map +1 -1
- package/dist/cjs/TestClock.js +1 -1
- package/dist/cjs/TestClock.js.map +1 -1
- package/dist/cjs/internal/core-effect.js +3 -24
- package/dist/cjs/internal/core-effect.js.map +1 -1
- package/dist/cjs/internal/core.js +18 -4
- package/dist/cjs/internal/core.js.map +1 -1
- package/dist/cjs/internal/encoding/base64.js +2 -2
- package/dist/cjs/internal/encoding/base64.js.map +1 -1
- package/dist/cjs/internal/fiberRuntime.js +10 -1
- package/dist/cjs/internal/fiberRuntime.js.map +1 -1
- package/dist/cjs/internal/mailbox.js +43 -10
- package/dist/cjs/internal/mailbox.js.map +1 -1
- package/dist/cjs/internal/opCodes/effect.js +3 -1
- package/dist/cjs/internal/opCodes/effect.js.map +1 -1
- package/dist/cjs/internal/version.js +1 -1
- package/dist/cjs/internal/version.js.map +1 -1
- package/dist/dts/Effect.d.ts +3 -3
- package/dist/dts/Effect.d.ts.map +1 -1
- package/dist/dts/FiberHandle.d.ts.map +1 -1
- package/dist/dts/FiberMap.d.ts.map +1 -1
- package/dist/dts/FiberSet.d.ts.map +1 -1
- package/dist/dts/Mailbox.d.ts +36 -1
- package/dist/dts/Mailbox.d.ts.map +1 -1
- package/dist/dts/internal/core-effect.d.ts.map +1 -1
- package/dist/dts/internal/core.d.ts.map +1 -1
- package/dist/dts/internal/fiberRuntime.d.ts.map +1 -1
- package/dist/esm/Effect.js +1 -1
- package/dist/esm/Effect.js.map +1 -1
- package/dist/esm/FiberHandle.js +0 -3
- package/dist/esm/FiberHandle.js.map +1 -1
- package/dist/esm/FiberMap.js +0 -3
- package/dist/esm/FiberMap.js.map +1 -1
- package/dist/esm/FiberSet.js +0 -4
- package/dist/esm/FiberSet.js.map +1 -1
- package/dist/esm/Mailbox.js +8 -0
- package/dist/esm/Mailbox.js.map +1 -1
- package/dist/esm/TestClock.js +1 -1
- package/dist/esm/TestClock.js.map +1 -1
- package/dist/esm/internal/core-effect.js +0 -20
- package/dist/esm/internal/core-effect.js.map +1 -1
- package/dist/esm/internal/core.js +15 -2
- package/dist/esm/internal/core.js.map +1 -1
- package/dist/esm/internal/encoding/base64.js +2 -2
- package/dist/esm/internal/encoding/base64.js.map +1 -1
- package/dist/esm/internal/fiberRuntime.js +11 -2
- package/dist/esm/internal/fiberRuntime.js.map +1 -1
- package/dist/esm/internal/mailbox.js +42 -9
- package/dist/esm/internal/mailbox.js.map +1 -1
- package/dist/esm/internal/opCodes/effect.js +2 -0
- package/dist/esm/internal/opCodes/effect.js.map +1 -1
- package/dist/esm/internal/version.js +1 -1
- package/dist/esm/internal/version.js.map +1 -1
- package/package.json +1 -1
- package/src/Effect.ts +9 -3
- package/src/FiberHandle.ts +0 -3
- package/src/FiberMap.ts +0 -3
- package/src/FiberSet.ts +0 -4
- package/src/Mailbox.ts +44 -1
- package/src/TestClock.ts +1 -1
- package/src/internal/core-effect.ts +0 -28
- package/src/internal/core.ts +25 -3
- package/src/internal/encoding/base64.ts +2 -2
- package/src/internal/fiberRuntime.ts +16 -2
- package/src/internal/mailbox.ts +84 -10
- package/src/internal/opCodes/effect.ts +6 -0
- package/src/internal/version.ts +1 -1
package/src/internal/mailbox.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Scope } from "effect/Scope"
|
|
1
2
|
import * as Arr from "../Array.js"
|
|
2
3
|
import type { Cause } from "../Cause.js"
|
|
3
4
|
import { NoSuchElementException } from "../Cause.js"
|
|
@@ -16,8 +17,11 @@ import { hasProperty } from "../Predicate.js"
|
|
|
16
17
|
import type { Scheduler } from "../Scheduler.js"
|
|
17
18
|
import type { Stream } from "../Stream.js"
|
|
18
19
|
import * as channel from "./channel.js"
|
|
20
|
+
import * as channelExecutor from "./channel/channelExecutor.js"
|
|
19
21
|
import * as coreChannel from "./core-stream.js"
|
|
20
22
|
import * as core from "./core.js"
|
|
23
|
+
import * as circular from "./effect/circular.js"
|
|
24
|
+
import * as fiberRuntime from "./fiberRuntime.js"
|
|
21
25
|
import * as stream from "./stream.js"
|
|
22
26
|
|
|
23
27
|
/** @internal */
|
|
@@ -81,7 +85,8 @@ class MailboxImpl<A, E> extends Effectable.Class<readonly [messages: Chunk.Chunk
|
|
|
81
85
|
private messagesChunk = Chunk.empty<A>()
|
|
82
86
|
constructor(
|
|
83
87
|
readonly scheduler: Scheduler,
|
|
84
|
-
readonly capacity: number
|
|
88
|
+
readonly capacity: number,
|
|
89
|
+
readonly strategy: "suspend" | "dropping" | "sliding"
|
|
85
90
|
) {
|
|
86
91
|
super()
|
|
87
92
|
}
|
|
@@ -91,7 +96,16 @@ class MailboxImpl<A, E> extends Effectable.Class<readonly [messages: Chunk.Chunk
|
|
|
91
96
|
if (this.state._tag !== "Open") {
|
|
92
97
|
return exitFalse
|
|
93
98
|
} else if (this.messages.length + this.messagesChunk.length >= this.capacity) {
|
|
94
|
-
|
|
99
|
+
switch (this.strategy) {
|
|
100
|
+
case "dropping":
|
|
101
|
+
return exitFalse
|
|
102
|
+
case "suspend":
|
|
103
|
+
return this.offerRemainingSingle(message)
|
|
104
|
+
case "sliding":
|
|
105
|
+
this.unsafeTake()
|
|
106
|
+
this.messages.push(message)
|
|
107
|
+
return exitTrue
|
|
108
|
+
}
|
|
95
109
|
}
|
|
96
110
|
this.messages.push(message)
|
|
97
111
|
this.scheduleReleaseTaker()
|
|
@@ -102,6 +116,11 @@ class MailboxImpl<A, E> extends Effectable.Class<readonly [messages: Chunk.Chunk
|
|
|
102
116
|
if (this.state._tag !== "Open") {
|
|
103
117
|
return false
|
|
104
118
|
} else if (this.messages.length + this.messagesChunk.length >= this.capacity) {
|
|
119
|
+
if (this.strategy === "sliding") {
|
|
120
|
+
this.unsafeTake()
|
|
121
|
+
this.messages.push(message)
|
|
122
|
+
return true
|
|
123
|
+
}
|
|
105
124
|
return false
|
|
106
125
|
}
|
|
107
126
|
this.messages.push(message)
|
|
@@ -116,6 +135,8 @@ class MailboxImpl<A, E> extends Effectable.Class<readonly [messages: Chunk.Chunk
|
|
|
116
135
|
const remaining = this.unsafeOfferAllArray(messages)
|
|
117
136
|
if (remaining.length === 0) {
|
|
118
137
|
return exitEmpty
|
|
138
|
+
} else if (this.strategy === "dropping") {
|
|
139
|
+
return core.succeed(Chunk.unsafeFromArray(remaining))
|
|
119
140
|
}
|
|
120
141
|
return this.offerRemainingArray(remaining)
|
|
121
142
|
})
|
|
@@ -126,11 +147,16 @@ class MailboxImpl<A, E> extends Effectable.Class<readonly [messages: Chunk.Chunk
|
|
|
126
147
|
unsafeOfferAllArray(messages: Iterable<A>): Array<A> {
|
|
127
148
|
if (this.state._tag !== "Open") {
|
|
128
149
|
return Arr.fromIterable(messages)
|
|
129
|
-
} else if (this.capacity === Number.POSITIVE_INFINITY) {
|
|
150
|
+
} else if (this.capacity === Number.POSITIVE_INFINITY || this.strategy === "sliding") {
|
|
130
151
|
if (this.messages.length > 0) {
|
|
131
152
|
this.messagesChunk = Chunk.appendAll(this.messagesChunk, Chunk.unsafeFromArray(this.messages))
|
|
132
153
|
}
|
|
133
|
-
if (
|
|
154
|
+
if (this.strategy === "sliding") {
|
|
155
|
+
this.messagesChunk = this.messagesChunk.pipe(
|
|
156
|
+
Chunk.appendAll(Chunk.fromIterable(messages)),
|
|
157
|
+
Chunk.takeRight(this.capacity)
|
|
158
|
+
)
|
|
159
|
+
} else if (Chunk.isChunk(messages)) {
|
|
134
160
|
this.messagesChunk = Chunk.appendAll(this.messagesChunk, messages)
|
|
135
161
|
} else {
|
|
136
162
|
this.messages = Arr.fromIterable(messages)
|
|
@@ -236,7 +262,7 @@ class MailboxImpl<A, E> extends Effectable.Class<readonly [messages: Chunk.Chunk
|
|
|
236
262
|
return core.succeed([messages, this.releaseCapacity()])
|
|
237
263
|
})
|
|
238
264
|
}
|
|
239
|
-
|
|
265
|
+
unsafeTake(): Exit<A, E | NoSuchElementException> | undefined {
|
|
240
266
|
if (this.state._tag === "Done") {
|
|
241
267
|
return core.exitZipRight(this.state.exit, core.exitFail(new NoSuchElementException()))
|
|
242
268
|
}
|
|
@@ -249,11 +275,14 @@ class MailboxImpl<A, E> extends Effectable.Class<readonly [messages: Chunk.Chunk
|
|
|
249
275
|
this.messagesChunk = Chunk.drop(Chunk.unsafeFromArray(this.messages), 1)
|
|
250
276
|
this.messages = []
|
|
251
277
|
} else {
|
|
252
|
-
return
|
|
278
|
+
return undefined
|
|
253
279
|
}
|
|
254
280
|
this.releaseCapacity()
|
|
255
|
-
return core.
|
|
256
|
-
}
|
|
281
|
+
return core.exitSucceed(message)
|
|
282
|
+
}
|
|
283
|
+
take: Effect<A, E | NoSuchElementException> = core.suspend(() =>
|
|
284
|
+
this.unsafeTake() ?? core.zipRight(this.awaitTake, this.take)
|
|
285
|
+
)
|
|
257
286
|
await: Effect<void, E> = core.unsafeAsync<void, E>((resume) => {
|
|
258
287
|
if (this.state._tag === "Done") {
|
|
259
288
|
return resume(this.state.exit)
|
|
@@ -415,12 +444,18 @@ class MailboxImpl<A, E> extends Effectable.Class<readonly [messages: Chunk.Chunk
|
|
|
415
444
|
}
|
|
416
445
|
|
|
417
446
|
/** @internal */
|
|
418
|
-
export const make = <A, E = never>(
|
|
447
|
+
export const make = <A, E = never>(
|
|
448
|
+
capacity?: number | {
|
|
449
|
+
readonly capacity?: number | undefined
|
|
450
|
+
readonly strategy?: "suspend" | "dropping" | "sliding" | undefined
|
|
451
|
+
} | undefined
|
|
452
|
+
): Effect<Api.Mailbox<A, E>> =>
|
|
419
453
|
core.withFiberRuntime((fiber) =>
|
|
420
454
|
core.succeed(
|
|
421
455
|
new MailboxImpl<A, E>(
|
|
422
456
|
fiber.currentScheduler,
|
|
423
|
-
capacity ?? Number.POSITIVE_INFINITY
|
|
457
|
+
typeof capacity === "number" ? capacity : capacity?.capacity ?? Number.POSITIVE_INFINITY,
|
|
458
|
+
typeof capacity === "number" ? "suspend" : capacity?.strategy ?? "suspend"
|
|
424
459
|
)
|
|
425
460
|
)
|
|
426
461
|
)
|
|
@@ -459,3 +494,42 @@ export const toChannel = <A, E>(self: Api.ReadonlyMailbox<A, E>): Channel<Chunk.
|
|
|
459
494
|
|
|
460
495
|
/** @internal */
|
|
461
496
|
export const toStream = <A, E>(self: Api.ReadonlyMailbox<A, E>): Stream<A, E> => stream.fromChannel(toChannel(self))
|
|
497
|
+
|
|
498
|
+
/** @internal */
|
|
499
|
+
export const fromStream: {
|
|
500
|
+
(options?: {
|
|
501
|
+
readonly capacity?: number | undefined
|
|
502
|
+
readonly strategy?: "suspend" | "dropping" | "sliding" | undefined
|
|
503
|
+
}): <A, E, R>(self: Stream<A, E, R>) => Effect<Api.ReadonlyMailbox<A, E>, never, R | Scope>
|
|
504
|
+
<A, E, R>(
|
|
505
|
+
self: Stream<A, E, R>,
|
|
506
|
+
options?: {
|
|
507
|
+
readonly capacity?: number | undefined
|
|
508
|
+
readonly strategy?: "suspend" | "dropping" | "sliding" | undefined
|
|
509
|
+
}
|
|
510
|
+
): Effect<Api.ReadonlyMailbox<A, E>, never, R | Scope>
|
|
511
|
+
} = dual((args) => stream.isStream(args[0]), <A, E, R>(
|
|
512
|
+
self: Stream<A, E, R>,
|
|
513
|
+
options?: {
|
|
514
|
+
readonly capacity?: number | undefined
|
|
515
|
+
readonly strategy?: "suspend" | "dropping" | "sliding" | undefined
|
|
516
|
+
}
|
|
517
|
+
): Effect<Api.ReadonlyMailbox<A, E>, never, R | Scope> =>
|
|
518
|
+
core.tap(
|
|
519
|
+
fiberRuntime.acquireRelease(
|
|
520
|
+
make<A, E>(options),
|
|
521
|
+
(mailbox) => mailbox.shutdown
|
|
522
|
+
),
|
|
523
|
+
(mailbox) => {
|
|
524
|
+
const writer: Channel<never, Chunk.Chunk<A>, never, E> = coreChannel.readWithCause({
|
|
525
|
+
onInput: (input: Chunk.Chunk<A>) => coreChannel.flatMap(mailbox.offerAll(input), () => writer),
|
|
526
|
+
onFailure: (cause: Cause<E>) => mailbox.failCause(cause),
|
|
527
|
+
onDone: () => mailbox.end
|
|
528
|
+
})
|
|
529
|
+
return stream.toChannel(self).pipe(
|
|
530
|
+
coreChannel.pipeTo(writer),
|
|
531
|
+
channelExecutor.runScoped,
|
|
532
|
+
circular.forkScoped
|
|
533
|
+
)
|
|
534
|
+
}
|
|
535
|
+
))
|
|
@@ -64,6 +64,12 @@ export type OP_WHILE = typeof OP_WHILE
|
|
|
64
64
|
/** @internal */
|
|
65
65
|
export const OP_WHILE = "While" as const
|
|
66
66
|
|
|
67
|
+
/** @internal */
|
|
68
|
+
export type OP_ITERATOR = typeof OP_ITERATOR
|
|
69
|
+
|
|
70
|
+
/** @internal */
|
|
71
|
+
export const OP_ITERATOR = "Iterator" as const
|
|
72
|
+
|
|
67
73
|
/** @internal */
|
|
68
74
|
export type OP_WITH_RUNTIME = typeof OP_WITH_RUNTIME
|
|
69
75
|
|
package/src/internal/version.ts
CHANGED