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.
Files changed (76) hide show
  1. package/dist/cjs/Effect.js +1 -1
  2. package/dist/cjs/Effect.js.map +1 -1
  3. package/dist/cjs/FiberHandle.js +0 -3
  4. package/dist/cjs/FiberHandle.js.map +1 -1
  5. package/dist/cjs/FiberMap.js +0 -3
  6. package/dist/cjs/FiberMap.js.map +1 -1
  7. package/dist/cjs/FiberSet.js +0 -4
  8. package/dist/cjs/FiberSet.js.map +1 -1
  9. package/dist/cjs/Mailbox.js +9 -1
  10. package/dist/cjs/Mailbox.js.map +1 -1
  11. package/dist/cjs/TestClock.js +1 -1
  12. package/dist/cjs/TestClock.js.map +1 -1
  13. package/dist/cjs/internal/core-effect.js +3 -24
  14. package/dist/cjs/internal/core-effect.js.map +1 -1
  15. package/dist/cjs/internal/core.js +18 -4
  16. package/dist/cjs/internal/core.js.map +1 -1
  17. package/dist/cjs/internal/encoding/base64.js +2 -2
  18. package/dist/cjs/internal/encoding/base64.js.map +1 -1
  19. package/dist/cjs/internal/fiberRuntime.js +10 -1
  20. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  21. package/dist/cjs/internal/mailbox.js +43 -10
  22. package/dist/cjs/internal/mailbox.js.map +1 -1
  23. package/dist/cjs/internal/opCodes/effect.js +3 -1
  24. package/dist/cjs/internal/opCodes/effect.js.map +1 -1
  25. package/dist/cjs/internal/version.js +1 -1
  26. package/dist/cjs/internal/version.js.map +1 -1
  27. package/dist/dts/Effect.d.ts +3 -3
  28. package/dist/dts/Effect.d.ts.map +1 -1
  29. package/dist/dts/FiberHandle.d.ts.map +1 -1
  30. package/dist/dts/FiberMap.d.ts.map +1 -1
  31. package/dist/dts/FiberSet.d.ts.map +1 -1
  32. package/dist/dts/Mailbox.d.ts +36 -1
  33. package/dist/dts/Mailbox.d.ts.map +1 -1
  34. package/dist/dts/internal/core-effect.d.ts.map +1 -1
  35. package/dist/dts/internal/core.d.ts.map +1 -1
  36. package/dist/dts/internal/fiberRuntime.d.ts.map +1 -1
  37. package/dist/esm/Effect.js +1 -1
  38. package/dist/esm/Effect.js.map +1 -1
  39. package/dist/esm/FiberHandle.js +0 -3
  40. package/dist/esm/FiberHandle.js.map +1 -1
  41. package/dist/esm/FiberMap.js +0 -3
  42. package/dist/esm/FiberMap.js.map +1 -1
  43. package/dist/esm/FiberSet.js +0 -4
  44. package/dist/esm/FiberSet.js.map +1 -1
  45. package/dist/esm/Mailbox.js +8 -0
  46. package/dist/esm/Mailbox.js.map +1 -1
  47. package/dist/esm/TestClock.js +1 -1
  48. package/dist/esm/TestClock.js.map +1 -1
  49. package/dist/esm/internal/core-effect.js +0 -20
  50. package/dist/esm/internal/core-effect.js.map +1 -1
  51. package/dist/esm/internal/core.js +15 -2
  52. package/dist/esm/internal/core.js.map +1 -1
  53. package/dist/esm/internal/encoding/base64.js +2 -2
  54. package/dist/esm/internal/encoding/base64.js.map +1 -1
  55. package/dist/esm/internal/fiberRuntime.js +11 -2
  56. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  57. package/dist/esm/internal/mailbox.js +42 -9
  58. package/dist/esm/internal/mailbox.js.map +1 -1
  59. package/dist/esm/internal/opCodes/effect.js +2 -0
  60. package/dist/esm/internal/opCodes/effect.js.map +1 -1
  61. package/dist/esm/internal/version.js +1 -1
  62. package/dist/esm/internal/version.js.map +1 -1
  63. package/package.json +1 -1
  64. package/src/Effect.ts +9 -3
  65. package/src/FiberHandle.ts +0 -3
  66. package/src/FiberMap.ts +0 -3
  67. package/src/FiberSet.ts +0 -4
  68. package/src/Mailbox.ts +44 -1
  69. package/src/TestClock.ts +1 -1
  70. package/src/internal/core-effect.ts +0 -28
  71. package/src/internal/core.ts +25 -3
  72. package/src/internal/encoding/base64.ts +2 -2
  73. package/src/internal/fiberRuntime.ts +16 -2
  74. package/src/internal/mailbox.ts +84 -10
  75. package/src/internal/opCodes/effect.ts +6 -0
  76. package/src/internal/version.ts +1 -1
@@ -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
- return this.offerRemainingSingle(message)
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 (Chunk.isChunk(messages)) {
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
- take: Effect<A, E | NoSuchElementException> = core.suspend(() => {
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 core.zipRight(this.awaitTake, this.take)
278
+ return undefined
253
279
  }
254
280
  this.releaseCapacity()
255
- return core.succeed(message)
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>(capacity?: number | undefined): Effect<Api.Mailbox<A, E>> =>
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
 
@@ -1,4 +1,4 @@
1
- let moduleVersion = "3.10.8"
1
+ let moduleVersion = "3.10.10"
2
2
 
3
3
  export const getCurrentVersion = () => moduleVersion
4
4