effect 3.4.9 → 3.5.1

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 (166) hide show
  1. package/RcMap/package.json +6 -0
  2. package/RcRef/package.json +6 -0
  3. package/dist/cjs/Cause.js +22 -1
  4. package/dist/cjs/Cause.js.map +1 -1
  5. package/dist/cjs/Channel.js.map +1 -1
  6. package/dist/cjs/Config.js.map +1 -1
  7. package/dist/cjs/Console.js.map +1 -1
  8. package/dist/cjs/Data.js +3 -1
  9. package/dist/cjs/Data.js.map +1 -1
  10. package/dist/cjs/Duration.js +23 -2
  11. package/dist/cjs/Duration.js.map +1 -1
  12. package/dist/cjs/Effect.js +78 -15
  13. package/dist/cjs/Effect.js.map +1 -1
  14. package/dist/cjs/Logger.js +234 -13
  15. package/dist/cjs/Logger.js.map +1 -1
  16. package/dist/cjs/PubSub.js.map +1 -1
  17. package/dist/cjs/Random.js +24 -1
  18. package/dist/cjs/Random.js.map +1 -1
  19. package/dist/cjs/RcMap.js +52 -0
  20. package/dist/cjs/RcMap.js.map +1 -0
  21. package/dist/cjs/RcRef.js +51 -0
  22. package/dist/cjs/RcRef.js.map +1 -0
  23. package/dist/cjs/Stream.js +29 -2
  24. package/dist/cjs/Stream.js.map +1 -1
  25. package/dist/cjs/index.js +6 -2
  26. package/dist/cjs/index.js.map +1 -1
  27. package/dist/cjs/internal/cause.js +21 -5
  28. package/dist/cjs/internal/cause.js.map +1 -1
  29. package/dist/cjs/internal/channel/channelExecutor.js.map +1 -1
  30. package/dist/cjs/internal/channel.js.map +1 -1
  31. package/dist/cjs/internal/core-effect.js +0 -5
  32. package/dist/cjs/internal/core-effect.js.map +1 -1
  33. package/dist/cjs/internal/core.js +15 -10
  34. package/dist/cjs/internal/core.js.map +1 -1
  35. package/dist/cjs/internal/defaultServices.js +1 -1
  36. package/dist/cjs/internal/defaultServices.js.map +1 -1
  37. package/dist/cjs/internal/fiberRuntime.js +3 -1
  38. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  39. package/dist/cjs/internal/logger.js +129 -27
  40. package/dist/cjs/internal/logger.js.map +1 -1
  41. package/dist/cjs/internal/pubsub.js +216 -36
  42. package/dist/cjs/internal/pubsub.js.map +1 -1
  43. package/dist/cjs/internal/random.js +2 -1
  44. package/dist/cjs/internal/random.js.map +1 -1
  45. package/dist/cjs/internal/rcMap.js +129 -0
  46. package/dist/cjs/internal/rcMap.js.map +1 -0
  47. package/dist/cjs/internal/rcRef.js +122 -0
  48. package/dist/cjs/internal/rcRef.js.map +1 -0
  49. package/dist/cjs/internal/stream.js +57 -11
  50. package/dist/cjs/internal/stream.js.map +1 -1
  51. package/dist/cjs/internal/version.js +1 -1
  52. package/dist/dts/Cause.d.ts +40 -1
  53. package/dist/dts/Cause.d.ts.map +1 -1
  54. package/dist/dts/Channel.d.ts +3 -3
  55. package/dist/dts/Channel.d.ts.map +1 -1
  56. package/dist/dts/Config.d.ts +5 -0
  57. package/dist/dts/Config.d.ts.map +1 -1
  58. package/dist/dts/Console.d.ts +2 -4
  59. package/dist/dts/Console.d.ts.map +1 -1
  60. package/dist/dts/Duration.d.ts +5 -0
  61. package/dist/dts/Duration.d.ts.map +1 -1
  62. package/dist/dts/Effect.d.ts +78 -15
  63. package/dist/dts/Effect.d.ts.map +1 -1
  64. package/dist/dts/Logger.d.ts +238 -12
  65. package/dist/dts/Logger.d.ts.map +1 -1
  66. package/dist/dts/PubSub.d.ts +15 -4
  67. package/dist/dts/PubSub.d.ts.map +1 -1
  68. package/dist/dts/Random.d.ts +23 -0
  69. package/dist/dts/Random.d.ts.map +1 -1
  70. package/dist/dts/RcMap.d.ts +93 -0
  71. package/dist/dts/RcMap.d.ts.map +1 -0
  72. package/dist/dts/RcRef.d.ts +83 -0
  73. package/dist/dts/RcRef.d.ts.map +1 -0
  74. package/dist/dts/Stream.d.ts +64 -26
  75. package/dist/dts/Stream.d.ts.map +1 -1
  76. package/dist/dts/index.d.ts +8 -0
  77. package/dist/dts/index.d.ts.map +1 -1
  78. package/dist/dts/internal/core-effect.d.ts.map +1 -1
  79. package/dist/dts/internal/fiberRuntime.d.ts.map +1 -1
  80. package/dist/dts/internal/logger.d.ts.map +1 -1
  81. package/dist/dts/internal/random.d.ts +1 -1
  82. package/dist/dts/internal/random.d.ts.map +1 -1
  83. package/dist/dts/internal/rcMap.d.ts +2 -0
  84. package/dist/dts/internal/rcMap.d.ts.map +1 -0
  85. package/dist/dts/internal/rcRef.d.ts +2 -0
  86. package/dist/dts/internal/rcRef.d.ts.map +1 -0
  87. package/dist/dts/internal/stream.d.ts +1 -0
  88. package/dist/dts/internal/stream.d.ts.map +1 -1
  89. package/dist/esm/Cause.js +21 -0
  90. package/dist/esm/Cause.js.map +1 -1
  91. package/dist/esm/Channel.js.map +1 -1
  92. package/dist/esm/Config.js.map +1 -1
  93. package/dist/esm/Console.js.map +1 -1
  94. package/dist/esm/Data.js +3 -1
  95. package/dist/esm/Data.js.map +1 -1
  96. package/dist/esm/Duration.js +20 -0
  97. package/dist/esm/Duration.js.map +1 -1
  98. package/dist/esm/Effect.js +78 -15
  99. package/dist/esm/Effect.js.map +1 -1
  100. package/dist/esm/Logger.js +233 -12
  101. package/dist/esm/Logger.js.map +1 -1
  102. package/dist/esm/PubSub.js.map +1 -1
  103. package/dist/esm/Random.js +23 -0
  104. package/dist/esm/Random.js.map +1 -1
  105. package/dist/esm/RcMap.js +44 -0
  106. package/dist/esm/RcMap.js.map +1 -0
  107. package/dist/esm/RcRef.js +43 -0
  108. package/dist/esm/RcRef.js.map +1 -0
  109. package/dist/esm/Stream.js +27 -0
  110. package/dist/esm/Stream.js.map +1 -1
  111. package/dist/esm/index.js +8 -0
  112. package/dist/esm/index.js.map +1 -1
  113. package/dist/esm/internal/cause.js +21 -5
  114. package/dist/esm/internal/cause.js.map +1 -1
  115. package/dist/esm/internal/channel/channelExecutor.js.map +1 -1
  116. package/dist/esm/internal/channel.js.map +1 -1
  117. package/dist/esm/internal/core-effect.js +0 -5
  118. package/dist/esm/internal/core-effect.js.map +1 -1
  119. package/dist/esm/internal/core.js +11 -7
  120. package/dist/esm/internal/core.js.map +1 -1
  121. package/dist/esm/internal/defaultServices.js +1 -1
  122. package/dist/esm/internal/defaultServices.js.map +1 -1
  123. package/dist/esm/internal/fiberRuntime.js +2 -0
  124. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  125. package/dist/esm/internal/logger.js +127 -26
  126. package/dist/esm/internal/logger.js.map +1 -1
  127. package/dist/esm/internal/pubsub.js +216 -36
  128. package/dist/esm/internal/pubsub.js.map +1 -1
  129. package/dist/esm/internal/random.js +2 -1
  130. package/dist/esm/internal/random.js.map +1 -1
  131. package/dist/esm/internal/rcMap.js +120 -0
  132. package/dist/esm/internal/rcMap.js.map +1 -0
  133. package/dist/esm/internal/rcRef.js +112 -0
  134. package/dist/esm/internal/rcRef.js.map +1 -0
  135. package/dist/esm/internal/stream.js +53 -8
  136. package/dist/esm/internal/stream.js.map +1 -1
  137. package/dist/esm/internal/version.js +1 -1
  138. package/package.json +17 -1
  139. package/src/Cause.ts +47 -1
  140. package/src/Channel.ts +3 -3
  141. package/src/Config.ts +6 -0
  142. package/src/Console.ts +2 -4
  143. package/src/Data.ts +1 -1
  144. package/src/Duration.ts +18 -0
  145. package/src/Effect.ts +78 -15
  146. package/src/Logger.ts +242 -12
  147. package/src/PubSub.ts +11 -4
  148. package/src/Random.ts +24 -0
  149. package/src/RcMap.ts +103 -0
  150. package/src/RcRef.ts +91 -0
  151. package/src/Stream.ts +83 -26
  152. package/src/index.ts +10 -0
  153. package/src/internal/cause.ts +26 -5
  154. package/src/internal/channel/channelExecutor.ts +1 -1
  155. package/src/internal/channel.ts +4 -3
  156. package/src/internal/core-effect.ts +0 -5
  157. package/src/internal/core.ts +19 -9
  158. package/src/internal/defaultServices.ts +1 -1
  159. package/src/internal/fiberRuntime.ts +6 -0
  160. package/src/internal/logger.ts +135 -27
  161. package/src/internal/pubsub.ts +249 -58
  162. package/src/internal/random.ts +2 -1
  163. package/src/internal/rcMap.ts +213 -0
  164. package/src/internal/rcRef.ts +172 -0
  165. package/src/internal/stream.ts +325 -111
  166. package/src/internal/version.ts +1 -1
@@ -31,7 +31,7 @@ import * as HaltStrategy from "../StreamHaltStrategy.js"
31
31
  import type * as Take from "../Take.js"
32
32
  import type * as Tracer from "../Tracer.js"
33
33
  import * as Tuple from "../Tuple.js"
34
- import type { NoInfer } from "../Types.js"
34
+ import type { NoInfer, TupleOf } from "../Types.js"
35
35
  import * as channel from "./channel.js"
36
36
  import * as channelExecutor from "./channel/channelExecutor.js"
37
37
  import * as MergeStrategy from "./channel/mergeStrategy.js"
@@ -461,15 +461,39 @@ export const as = dual<
461
461
  <A, E, R, B>(self: Stream.Stream<A, E, R>, value: B) => Stream.Stream<B, E, R>
462
462
  >(2, <A, E, R, B>(self: Stream.Stream<A, E, R>, value: B): Stream.Stream<B, E, R> => map(self, () => value))
463
463
 
464
+ const queueFromBufferOptions = <A, E>(
465
+ bufferSize?: number | "unbounded" | {
466
+ readonly bufferSize?: number | undefined
467
+ readonly strategy?: "dropping" | "sliding" | "suspend" | undefined
468
+ } | undefined
469
+ ): Effect.Effect<Queue.Queue<Take.Take<A, E>>> => {
470
+ if (bufferSize === "unbounded") {
471
+ return Queue.unbounded()
472
+ } else if (typeof bufferSize === "number" || bufferSize === undefined) {
473
+ return Queue.bounded(bufferSize ?? 16)
474
+ }
475
+ switch (bufferSize.strategy) {
476
+ case "dropping":
477
+ return Queue.dropping(bufferSize.bufferSize ?? 16)
478
+ case "sliding":
479
+ return Queue.sliding(bufferSize.bufferSize ?? 16)
480
+ default:
481
+ return Queue.bounded(bufferSize.bufferSize ?? 16)
482
+ }
483
+ }
484
+
464
485
  /** @internal */
465
486
  export const _async = <A, E = never, R = never>(
466
487
  register: (
467
488
  emit: Emit.Emit<R, E, A, void>
468
489
  ) => Effect.Effect<void, never, R> | void,
469
- outputBuffer = 16
490
+ bufferSize?: number | "unbounded" | {
491
+ readonly bufferSize?: number | undefined
492
+ readonly strategy?: "dropping" | "sliding" | "suspend" | undefined
493
+ } | undefined
470
494
  ): Stream.Stream<A, E, R> =>
471
495
  Effect.acquireRelease(
472
- Queue.bounded<Take.Take<A, E>>(outputBuffer),
496
+ queueFromBufferOptions<A, E>(bufferSize),
473
497
  (queue) => Queue.shutdown(queue)
474
498
  ).pipe(
475
499
  Effect.flatMap((output) =>
@@ -518,11 +542,14 @@ export const _async = <A, E = never, R = never>(
518
542
  /** @internal */
519
543
  export const asyncEffect = <A, E = never, R = never>(
520
544
  register: (emit: Emit.Emit<R, E, A, void>) => Effect.Effect<unknown, E, R>,
521
- outputBuffer = 16
545
+ bufferSize?: number | "unbounded" | {
546
+ readonly bufferSize?: number | undefined
547
+ readonly strategy?: "dropping" | "sliding" | "suspend" | undefined
548
+ } | undefined
522
549
  ): Stream.Stream<A, E, R> =>
523
550
  pipe(
524
551
  Effect.acquireRelease(
525
- Queue.bounded<Take.Take<A, E>>(outputBuffer),
552
+ queueFromBufferOptions<A, E>(bufferSize),
526
553
  (queue) => Queue.shutdown(queue)
527
554
  ),
528
555
  Effect.flatMap((output) =>
@@ -573,11 +600,14 @@ export const asyncEffect = <A, E = never, R = never>(
573
600
  /** @internal */
574
601
  export const asyncScoped = <A, E = never, R = never>(
575
602
  register: (emit: Emit.Emit<R, E, A, void>) => Effect.Effect<unknown, E, R | Scope.Scope>,
576
- outputBuffer = 16
603
+ bufferSize?: number | "unbounded" | {
604
+ readonly bufferSize?: number | undefined
605
+ readonly strategy?: "dropping" | "sliding" | "suspend" | undefined
606
+ } | undefined
577
607
  ): Stream.Stream<A, E, Exclude<R, Scope.Scope>> =>
578
608
  pipe(
579
609
  Effect.acquireRelease(
580
- Queue.bounded<Take.Take<A, E>>(outputBuffer),
610
+ queueFromBufferOptions<A, E>(bufferSize),
581
611
  (queue) => Queue.shutdown(queue)
582
612
  ),
583
613
  Effect.flatMap((output) =>
@@ -682,72 +712,128 @@ export const branchAfter = dual<
682
712
  export const broadcast = dual<
683
713
  <N extends number>(
684
714
  n: N,
685
- maximumLag: number
715
+ maximumLag: number | {
716
+ readonly capacity: "unbounded"
717
+ readonly replay?: number | undefined
718
+ } | {
719
+ readonly capacity: number
720
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
721
+ readonly replay?: number | undefined
722
+ }
686
723
  ) => <A, E, R>(
687
724
  self: Stream.Stream<A, E, R>
688
- ) => Effect.Effect<Stream.Stream.DynamicTuple<Stream.Stream<A, E>, N>, never, Scope.Scope | R>,
725
+ ) => Effect.Effect<TupleOf<N, Stream.Stream<A, E>>, never, Scope.Scope | R>,
689
726
  <A, E, R, N extends number>(
690
727
  self: Stream.Stream<A, E, R>,
691
728
  n: N,
692
- maximumLag: number
693
- ) => Effect.Effect<Stream.Stream.DynamicTuple<Stream.Stream<A, E>, N>, never, Scope.Scope | R>
729
+ maximumLag: number | {
730
+ readonly capacity: "unbounded"
731
+ readonly replay?: number | undefined
732
+ } | {
733
+ readonly capacity: number
734
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
735
+ readonly replay?: number | undefined
736
+ }
737
+ ) => Effect.Effect<TupleOf<N, Stream.Stream<A, E>>, never, Scope.Scope | R>
694
738
  >(3, <A, E, R, N extends number>(
695
739
  self: Stream.Stream<A, E, R>,
696
740
  n: N,
697
- maximumLag: number
698
- ): Effect.Effect<Stream.Stream.DynamicTuple<Stream.Stream<A, E>, N>, never, Scope.Scope | R> =>
741
+ maximumLag: number | {
742
+ readonly capacity: "unbounded"
743
+ readonly replay?: number | undefined
744
+ } | {
745
+ readonly capacity: number
746
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
747
+ readonly replay?: number | undefined
748
+ }
749
+ ): Effect.Effect<TupleOf<N, Stream.Stream<A, E>>, never, Scope.Scope | R> =>
699
750
  pipe(
700
751
  self,
701
752
  broadcastedQueues(n, maximumLag),
702
753
  Effect.map((tuple) =>
703
- tuple.map((queue) => flattenTake(fromQueue(queue, { shutdown: true }))) as Stream.Stream.DynamicTuple<
704
- Stream.Stream<A, E>,
705
- N
706
- >
754
+ tuple.map((queue) => flattenTake(fromQueue(queue, { shutdown: true }))) as TupleOf<N, Stream.Stream<A, E>>
707
755
  )
708
756
  ))
709
757
 
710
758
  /** @internal */
711
759
  export const broadcastDynamic = dual<
712
760
  (
713
- maximumLag: number
761
+ maximumLag: number | {
762
+ readonly capacity: "unbounded"
763
+ readonly replay?: number | undefined
764
+ } | {
765
+ readonly capacity: number
766
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
767
+ readonly replay?: number | undefined
768
+ }
714
769
  ) => <A, E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<Stream.Stream<A, E>, never, Scope.Scope | R>,
715
770
  <A, E, R>(
716
771
  self: Stream.Stream<A, E, R>,
717
- maximumLag: number
772
+ maximumLag: number | {
773
+ readonly capacity: "unbounded"
774
+ readonly replay?: number | undefined
775
+ } | {
776
+ readonly capacity: number
777
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
778
+ readonly replay?: number | undefined
779
+ }
718
780
  ) => Effect.Effect<Stream.Stream<A, E>, never, Scope.Scope | R>
719
781
  >(2, <A, E, R>(
720
782
  self: Stream.Stream<A, E, R>,
721
- maximumLag: number
783
+ maximumLag: number | {
784
+ readonly capacity: "unbounded"
785
+ readonly replay?: number | undefined
786
+ } | {
787
+ readonly capacity: number
788
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
789
+ readonly replay?: number | undefined
790
+ }
722
791
  ): Effect.Effect<Stream.Stream<A, E>, never, Scope.Scope | R> =>
723
- pipe(
724
- self,
725
- broadcastedQueuesDynamic(maximumLag),
726
- Effect.map((effect) => flattenTake(flatMap(scoped(effect), fromQueue)))
727
- ))
792
+ Effect.map(toPubSub(self, maximumLag), (pubsub) => flattenTake(fromPubSub(pubsub))))
728
793
 
729
794
  /** @internal */
730
795
  export const broadcastedQueues = dual<
731
796
  <N extends number>(
732
797
  n: N,
733
- maximumLag: number
798
+ maximumLag: number | {
799
+ readonly capacity: "unbounded"
800
+ readonly replay?: number | undefined
801
+ } | {
802
+ readonly capacity: number
803
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
804
+ readonly replay?: number | undefined
805
+ }
734
806
  ) => <A, E, R>(
735
807
  self: Stream.Stream<A, E, R>
736
- ) => Effect.Effect<Stream.Stream.DynamicTuple<Queue.Dequeue<Take.Take<A, E>>, N>, never, Scope.Scope | R>,
808
+ ) => Effect.Effect<TupleOf<N, Queue.Dequeue<Take.Take<A, E>>>, never, Scope.Scope | R>,
737
809
  <A, E, R, N extends number>(
738
810
  self: Stream.Stream<A, E, R>,
739
811
  n: N,
740
- maximumLag: number
741
- ) => Effect.Effect<Stream.Stream.DynamicTuple<Queue.Dequeue<Take.Take<A, E>>, N>, never, Scope.Scope | R>
812
+ maximumLag: number | {
813
+ readonly capacity: "unbounded"
814
+ readonly replay?: number | undefined
815
+ } | {
816
+ readonly capacity: number
817
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
818
+ readonly replay?: number | undefined
819
+ }
820
+ ) => Effect.Effect<TupleOf<N, Queue.Dequeue<Take.Take<A, E>>>, never, Scope.Scope | R>
742
821
  >(3, <A, E, R, N extends number>(
743
822
  self: Stream.Stream<A, E, R>,
744
823
  n: N,
745
- maximumLag: number
746
- ): Effect.Effect<Stream.Stream.DynamicTuple<Queue.Dequeue<Take.Take<A, E>>, N>, never, Scope.Scope | R> =>
747
- Effect.flatMap(PubSub.bounded<Take.Take<A, E>>(maximumLag), (pubsub) =>
824
+ maximumLag: number | {
825
+ readonly capacity: "unbounded"
826
+ readonly replay?: number | undefined
827
+ } | {
828
+ readonly capacity: number
829
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
830
+ readonly replay?: number | undefined
831
+ }
832
+ ): Effect.Effect<TupleOf<N, Queue.Dequeue<Take.Take<A, E>>>, never, Scope.Scope | R> =>
833
+ Effect.flatMap(pubsubFromOptions(maximumLag), (pubsub) =>
748
834
  pipe(
749
835
  Effect.all(Array.from({ length: n }, () => PubSub.subscribe(pubsub))) as Effect.Effect<
750
- Stream.Stream.DynamicTuple<Queue.Dequeue<Take.Take<A, E>>, N>,
836
+ TupleOf<N, Queue.Dequeue<Take.Take<A, E>>>,
751
837
  never,
752
838
  R
753
839
  >,
@@ -757,17 +843,38 @@ export const broadcastedQueues = dual<
757
843
  /** @internal */
758
844
  export const broadcastedQueuesDynamic = dual<
759
845
  (
760
- maximumLag: number
846
+ maximumLag: number | {
847
+ readonly capacity: "unbounded"
848
+ readonly replay?: number | undefined
849
+ } | {
850
+ readonly capacity: number
851
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
852
+ readonly replay?: number | undefined
853
+ }
761
854
  ) => <A, E, R>(
762
855
  self: Stream.Stream<A, E, R>
763
856
  ) => Effect.Effect<Effect.Effect<Queue.Dequeue<Take.Take<A, E>>, never, Scope.Scope>, never, Scope.Scope | R>,
764
857
  <A, E, R>(
765
858
  self: Stream.Stream<A, E, R>,
766
- maximumLag: number
859
+ maximumLag: number | {
860
+ readonly capacity: "unbounded"
861
+ readonly replay?: number | undefined
862
+ } | {
863
+ readonly capacity: number
864
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
865
+ readonly replay?: number | undefined
866
+ }
767
867
  ) => Effect.Effect<Effect.Effect<Queue.Dequeue<Take.Take<A, E>>, never, Scope.Scope>, never, Scope.Scope | R>
768
868
  >(2, <A, E, R>(
769
869
  self: Stream.Stream<A, E, R>,
770
- maximumLag: number
870
+ maximumLag: number | {
871
+ readonly capacity: "unbounded"
872
+ readonly replay?: number | undefined
873
+ } | {
874
+ readonly capacity: number
875
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
876
+ readonly replay?: number | undefined
877
+ }
771
878
  ): Effect.Effect<Effect.Effect<Queue.Dequeue<Take.Take<A, E>>, never, Scope.Scope>, never, Scope.Scope | R> =>
772
879
  Effect.map(toPubSub(self, maximumLag), PubSub.subscribe))
773
880
 
@@ -1764,7 +1871,7 @@ export const distributedWith = dual<
1764
1871
  ) => <E, R>(
1765
1872
  self: Stream.Stream<A, E, R>
1766
1873
  ) => Effect.Effect<
1767
- Stream.Stream.DynamicTuple<Queue.Dequeue<Exit.Exit<A, Option.Option<E>>>, N>,
1874
+ TupleOf<N, Queue.Dequeue<Exit.Exit<A, Option.Option<E>>>>,
1768
1875
  never,
1769
1876
  Scope.Scope | R
1770
1877
  >,
@@ -1776,7 +1883,7 @@ export const distributedWith = dual<
1776
1883
  readonly decide: (a: A) => Effect.Effect<Predicate<number>>
1777
1884
  }
1778
1885
  ) => Effect.Effect<
1779
- Stream.Stream.DynamicTuple<Queue.Dequeue<Exit.Exit<A, Option.Option<E>>>, N>,
1886
+ TupleOf<N, Queue.Dequeue<Exit.Exit<A, Option.Option<E>>>>,
1780
1887
  never,
1781
1888
  Scope.Scope | R
1782
1889
  >
@@ -1790,7 +1897,7 @@ export const distributedWith = dual<
1790
1897
  readonly decide: (a: A) => Effect.Effect<Predicate<number>>
1791
1898
  }
1792
1899
  ): Effect.Effect<
1793
- Stream.Stream.DynamicTuple<Queue.Dequeue<Exit.Exit<A, Option.Option<E>>>, N>,
1900
+ TupleOf<N, Queue.Dequeue<Exit.Exit<A, Option.Option<E>>>>,
1794
1901
  never,
1795
1902
  Scope.Scope | R
1796
1903
  > =>
@@ -1829,7 +1936,7 @@ export const distributedWith = dual<
1829
1936
  Deferred.succeed(deferred, (a: A) =>
1830
1937
  Effect.map(options.decide(a), (f) => (key: number) => pipe(f(mappings.get(key)!)))),
1831
1938
  Effect.as(
1832
- Array.from(queues) as Stream.Stream.DynamicTuple<Queue.Dequeue<Exit.Exit<A, Option.Option<E>>>, N>
1939
+ Array.from(queues) as TupleOf<N, Queue.Dequeue<Exit.Exit<A, Option.Option<E>>>>
1833
1940
  )
1834
1941
  )
1835
1942
  })
@@ -3921,36 +4028,36 @@ export const mergeEither = dual<
3921
4028
 
3922
4029
  /** @internal */
3923
4030
  export const mergeLeft = dual<
3924
- <A2, E2, R2>(
3925
- that: Stream.Stream<A2, E2, R2>
3926
- ) => <A, E, R>(self: Stream.Stream<A, E, R>) => Stream.Stream<A, E2 | E, R2 | R>,
3927
- <A, E, R, A2, E2, R2>(
3928
- self: Stream.Stream<A, E, R>,
3929
- that: Stream.Stream<A2, E2, R2>
3930
- ) => Stream.Stream<A, E2 | E, R2 | R>
4031
+ <AR, ER, RR>(
4032
+ right: Stream.Stream<AR, ER, RR>
4033
+ ) => <AL, EL, RL>(left: Stream.Stream<AL, EL, RL>) => Stream.Stream<AL, ER | EL, RR | RL>,
4034
+ <AL, EL, RL, AR, ER, RR>(
4035
+ left: Stream.Stream<AL, EL, RL>,
4036
+ right: Stream.Stream<AR, ER, RR>
4037
+ ) => Stream.Stream<AL, ER | EL, RR | RL>
3931
4038
  >(
3932
4039
  2,
3933
- <A, E, R, A2, E2, R2>(
3934
- self: Stream.Stream<A, E, R>,
3935
- that: Stream.Stream<A2, E2, R2>
3936
- ): Stream.Stream<A, E | E2, R | R2> => pipe(self, merge(drain(that)))
4040
+ <AL, EL, RL, AR, ER, RR>(
4041
+ left: Stream.Stream<AL, EL, RL>,
4042
+ right: Stream.Stream<AR, ER, RR>
4043
+ ): Stream.Stream<AL, EL | ER, RL | RR> => pipe(left, merge(drain(right)))
3937
4044
  )
3938
4045
 
3939
4046
  /** @internal */
3940
4047
  export const mergeRight = dual<
3941
- <A2, E2, R2>(
3942
- that: Stream.Stream<A2, E2, R2>
3943
- ) => <A, E, R>(self: Stream.Stream<A, E, R>) => Stream.Stream<A2, E2 | E, R2 | R>,
3944
- <A, E, R, A2, E2, R2>(
3945
- self: Stream.Stream<A, E, R>,
3946
- that: Stream.Stream<A2, E2, R2>
3947
- ) => Stream.Stream<A2, E2 | E, R2 | R>
4048
+ <AR, ER, RR>(
4049
+ right: Stream.Stream<AR, ER, RR>
4050
+ ) => <AL, EL, RL>(left: Stream.Stream<AL, EL, RL>) => Stream.Stream<AR, ER | EL, RR | RL>,
4051
+ <AL, EL, RL, AR, ER, RR>(
4052
+ left: Stream.Stream<AL, EL, RL>,
4053
+ right: Stream.Stream<AR, ER, RR>
4054
+ ) => Stream.Stream<AR, ER | EL, RR | RL>
3948
4055
  >(
3949
4056
  2,
3950
- <A, E, R, A2, E2, R2>(
3951
- self: Stream.Stream<A, E, R>,
3952
- that: Stream.Stream<A2, E2, R2>
3953
- ): Stream.Stream<A2, E | E2, R | R2> => pipe(drain(self), merge(that))
4057
+ <AL, EL, RL, AR, ER, RR>(
4058
+ left: Stream.Stream<AL, EL, RL>,
4059
+ right: Stream.Stream<AR, ER, RR>
4060
+ ): Stream.Stream<AR, EL | ER, RL | RR> => pipe(drain(left), merge(right))
3954
4061
  )
3955
4062
 
3956
4063
  /** @internal */
@@ -4686,6 +4793,40 @@ export const range = (min: number, max: number, chunkSize = DefaultChunkSize): S
4686
4793
  return new StreamImpl(go(min, max, chunkSize))
4687
4794
  })
4688
4795
 
4796
+ export const raceAll = <S extends ReadonlyArray<Stream.Stream<any, any, any>>>(
4797
+ ...streams: S
4798
+ ): Stream.Stream<
4799
+ Stream.Stream.Success<S[number]>,
4800
+ Stream.Stream.Error<S[number]>,
4801
+ Stream.Stream.Context<S[number]>
4802
+ > =>
4803
+ Deferred.make<void>().pipe(
4804
+ Effect.map((halt) => {
4805
+ let winner: number | null = null
4806
+ return mergeAll(
4807
+ streams.map((stream, index) =>
4808
+ stream.pipe(
4809
+ takeWhile(() => {
4810
+ if (winner === null) {
4811
+ winner = index
4812
+ Deferred.unsafeDone(halt, Exit.void)
4813
+ return true
4814
+ }
4815
+ return winner === index
4816
+ }),
4817
+ interruptWhen(
4818
+ Deferred.await(halt).pipe(
4819
+ Effect.flatMap(() => winner === index ? Effect.never : Effect.void)
4820
+ )
4821
+ )
4822
+ )
4823
+ ),
4824
+ { concurrency: streams.length }
4825
+ )
4826
+ }),
4827
+ unwrap
4828
+ )
4829
+
4689
4830
  /** @internal */
4690
4831
  export const rechunk = dual<
4691
4832
  (n: number) => <A, E, R>(self: Stream.Stream<A, E, R>) => Stream.Stream<A, E, R>,
@@ -5097,37 +5238,44 @@ export const retry = dual<
5097
5238
  export const run = dual<
5098
5239
  <A2, A, E2, R2>(
5099
5240
  sink: Sink.Sink<A2, A, unknown, E2, R2>
5100
- ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<A2, E2 | E, R2 | R>,
5241
+ ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<A2, E2 | E, Exclude<R | R2, Scope.Scope>>,
5101
5242
  <A, E, R, A2, E2, R2>(
5102
5243
  self: Stream.Stream<A, E, R>,
5103
5244
  sink: Sink.Sink<A2, A, unknown, E2, R2>
5104
- ) => Effect.Effect<A2, E2 | E, R2 | R>
5245
+ ) => Effect.Effect<A2, E2 | E, Exclude<R | R2, Scope.Scope>>
5105
5246
  >(2, <A, E, R, A2, E2, R2>(
5106
5247
  self: Stream.Stream<A, E, R>,
5107
5248
  sink: Sink.Sink<A2, A, unknown, E2, R2>
5108
- ): Effect.Effect<A2, E2 | E, R2 | R> =>
5249
+ ): Effect.Effect<A2, E2 | E, Exclude<R | R2, Scope.Scope>> =>
5109
5250
  pipe(toChannel(self), channel.pipeToOrFail(_sink.toChannel(sink)), channel.runDrain))
5110
5251
 
5111
5252
  /** @internal */
5112
- export const runCollect = <A, E, R>(self: Stream.Stream<A, E, R>): Effect.Effect<Chunk.Chunk<A>, E, R> =>
5113
- pipe(self, run(_sink.collectAll()))
5253
+ export const runCollect = <A, E, R>(
5254
+ self: Stream.Stream<A, E, R>
5255
+ ): Effect.Effect<Chunk.Chunk<A>, E, Exclude<R, Scope.Scope>> => pipe(self, run(_sink.collectAll()))
5114
5256
 
5115
5257
  /** @internal */
5116
- export const runCount = <A, E, R>(self: Stream.Stream<A, E, R>): Effect.Effect<number, E, R> =>
5258
+ export const runCount = <A, E, R>(self: Stream.Stream<A, E, R>): Effect.Effect<number, E, Exclude<R, Scope.Scope>> =>
5117
5259
  pipe(self, run(_sink.count))
5118
5260
 
5119
5261
  /** @internal */
5120
- export const runDrain = <A, E, R>(self: Stream.Stream<A, E, R>): Effect.Effect<void, E, R> =>
5262
+ export const runDrain = <A, E, R>(self: Stream.Stream<A, E, R>): Effect.Effect<void, E, Exclude<R, Scope.Scope>> =>
5121
5263
  pipe(self, run(_sink.drain))
5122
5264
 
5123
5265
  /** @internal */
5124
5266
  export const runFold = dual<
5125
- <S, A>(s: S, f: (s: S, a: A) => S) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<S, E, R>,
5126
- <A, E, R, S>(self: Stream.Stream<A, E, R>, s: S, f: (s: S, a: A) => S) => Effect.Effect<S, E, R>
5267
+ <S, A>(
5268
+ s: S,
5269
+ f: (s: S, a: A) => S
5270
+ ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<S, E, Exclude<R, Scope.Scope>>,
5271
+ <A, E, R, S>(self: Stream.Stream<A, E, R>, s: S, f: (s: S, a: A) => S) => Effect.Effect<S, E, Exclude<R, Scope.Scope>>
5127
5272
  >(
5128
5273
  3,
5129
- <A, E, R, S>(self: Stream.Stream<A, E, R>, s: S, f: (s: S, a: A) => S): Effect.Effect<S, E, R> =>
5130
- pipe(self, runFoldWhileScoped(s, constTrue, f), Effect.scoped)
5274
+ <A, E, R, S>(
5275
+ self: Stream.Stream<A, E, R>,
5276
+ s: S,
5277
+ f: (s: S, a: A) => S
5278
+ ): Effect.Effect<S, E, Exclude<R, Scope.Scope>> => pipe(self, runFoldWhileScoped(s, constTrue, f), Effect.scoped)
5131
5279
  )
5132
5280
 
5133
5281
  /** @internal */
@@ -5135,17 +5283,18 @@ export const runFoldEffect = dual<
5135
5283
  <S, A, E2, R2>(
5136
5284
  s: S,
5137
5285
  f: (s: S, a: A) => Effect.Effect<S, E2, R2>
5138
- ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<S, E2 | E, R2 | R>,
5286
+ ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<S, E2 | E, Exclude<R | R2, Scope.Scope>>,
5139
5287
  <A, E, R, S, E2, R2>(
5140
5288
  self: Stream.Stream<A, E, R>,
5141
5289
  s: S,
5142
5290
  f: (s: S, a: A) => Effect.Effect<S, E2, R2>
5143
- ) => Effect.Effect<S, E2 | E, R2 | R>
5291
+ ) => Effect.Effect<S, E2 | E, Exclude<R | R2, Scope.Scope>>
5144
5292
  >(3, <A, E, R, S, E2, R2>(
5145
5293
  self: Stream.Stream<A, E, R>,
5146
5294
  s: S,
5147
5295
  f: (s: S, a: A) => Effect.Effect<S, E2, R2>
5148
- ): Effect.Effect<S, E2 | E, R2 | R> => pipe(self, runFoldWhileScopedEffect(s, constTrue, f), Effect.scoped))
5296
+ ): Effect.Effect<S, E2 | E, Exclude<R | R2, Scope.Scope>> =>
5297
+ pipe(self, runFoldWhileScopedEffect(s, constTrue, f), Effect.scoped))
5149
5298
 
5150
5299
  /** @internal */
5151
5300
  export const runFoldScoped = dual<
@@ -5180,14 +5329,19 @@ export const runFoldWhile = dual<
5180
5329
  s: S,
5181
5330
  cont: Predicate<S>,
5182
5331
  f: (s: S, a: A) => S
5183
- ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<S, E, R>,
5184
- <A, E, R, S>(self: Stream.Stream<A, E, R>, s: S, cont: Predicate<S>, f: (s: S, a: A) => S) => Effect.Effect<S, E, R>
5332
+ ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<S, E, Exclude<R, Scope.Scope>>,
5333
+ <A, E, R, S>(
5334
+ self: Stream.Stream<A, E, R>,
5335
+ s: S,
5336
+ cont: Predicate<S>,
5337
+ f: (s: S, a: A) => S
5338
+ ) => Effect.Effect<S, E, Exclude<R, Scope.Scope>>
5185
5339
  >(4, <A, E, R, S>(
5186
5340
  self: Stream.Stream<A, E, R>,
5187
5341
  s: S,
5188
5342
  cont: Predicate<S>,
5189
5343
  f: (s: S, a: A) => S
5190
- ): Effect.Effect<S, E, R> => pipe(self, runFoldWhileScoped(s, cont, f), Effect.scoped))
5344
+ ): Effect.Effect<S, E, Exclude<R, Scope.Scope>> => pipe(self, runFoldWhileScoped(s, cont, f), Effect.scoped))
5191
5345
 
5192
5346
  /** @internal */
5193
5347
  export const runFoldWhileEffect = dual<
@@ -5195,19 +5349,20 @@ export const runFoldWhileEffect = dual<
5195
5349
  s: S,
5196
5350
  cont: Predicate<S>,
5197
5351
  f: (s: S, a: A) => Effect.Effect<S, E2, R2>
5198
- ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<S, E2 | E, R2 | R>,
5352
+ ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<S, E2 | E, Exclude<R | R2, Scope.Scope>>,
5199
5353
  <A, E, R, S, E2, R2>(
5200
5354
  self: Stream.Stream<A, E, R>,
5201
5355
  s: S,
5202
5356
  cont: Predicate<S>,
5203
5357
  f: (s: S, a: A) => Effect.Effect<S, E2, R2>
5204
- ) => Effect.Effect<S, E2 | E, R2 | R>
5358
+ ) => Effect.Effect<S, E2 | E, Exclude<R | R2, Scope.Scope>>
5205
5359
  >(4, <A, E, R, S, E2, R2>(
5206
5360
  self: Stream.Stream<A, E, R>,
5207
5361
  s: S,
5208
5362
  cont: Predicate<S>,
5209
5363
  f: (s: S, a: A) => Effect.Effect<S, E2, R2>
5210
- ): Effect.Effect<S, E2 | E, R2 | R> => pipe(self, runFoldWhileScopedEffect(s, cont, f), Effect.scoped))
5364
+ ): Effect.Effect<S, E2 | E, Exclude<R | R2, Scope.Scope>> =>
5365
+ pipe(self, runFoldWhileScopedEffect(s, cont, f), Effect.scoped))
5211
5366
 
5212
5367
  /** @internal */
5213
5368
  export const runFoldWhileScoped = dual<
@@ -5253,29 +5408,29 @@ export const runFoldWhileScopedEffect = dual<
5253
5408
  export const runForEach = dual<
5254
5409
  <A, X, E2, R2>(
5255
5410
  f: (a: A) => Effect.Effect<X, E2, R2>
5256
- ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<void, E2 | E, R2 | R>,
5411
+ ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<void, E2 | E, Exclude<R | R2, Scope.Scope>>,
5257
5412
  <A, E, R, X, E2, R2>(
5258
5413
  self: Stream.Stream<A, E, R>,
5259
5414
  f: (a: A) => Effect.Effect<X, E2, R2>
5260
- ) => Effect.Effect<void, E2 | E, R2 | R>
5415
+ ) => Effect.Effect<void, E2 | E, Exclude<R | R2, Scope.Scope>>
5261
5416
  >(2, <A, E, R, X, E2, R2>(
5262
5417
  self: Stream.Stream<A, E, R>,
5263
5418
  f: (a: A) => Effect.Effect<X, E2, R2>
5264
- ): Effect.Effect<void, E2 | E, R2 | R> => pipe(self, run(_sink.forEach(f))))
5419
+ ): Effect.Effect<void, E2 | E, Exclude<R | R2, Scope.Scope>> => pipe(self, run(_sink.forEach(f))))
5265
5420
 
5266
5421
  /** @internal */
5267
5422
  export const runForEachChunk = dual<
5268
5423
  <A, X, E2, R2>(
5269
5424
  f: (a: Chunk.Chunk<A>) => Effect.Effect<X, E2, R2>
5270
- ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<void, E2 | E, R2 | R>,
5425
+ ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<void, E2 | E, Exclude<R | R2, Scope.Scope>>,
5271
5426
  <A, E, R, X, E2, R2>(
5272
5427
  self: Stream.Stream<A, E, R>,
5273
5428
  f: (a: Chunk.Chunk<A>) => Effect.Effect<X, E2, R2>
5274
- ) => Effect.Effect<void, E2 | E, R2 | R>
5429
+ ) => Effect.Effect<void, E2 | E, Exclude<R | R2, Scope.Scope>>
5275
5430
  >(2, <A, E, R, X, E2, R2>(
5276
5431
  self: Stream.Stream<A, E, R>,
5277
5432
  f: (a: Chunk.Chunk<A>) => Effect.Effect<X, E2, R2>
5278
- ): Effect.Effect<void, E2 | E, R2 | R> => pipe(self, run(_sink.forEachChunk(f))))
5433
+ ): Effect.Effect<void, E2 | E, Exclude<R | R2, Scope.Scope>> => pipe(self, run(_sink.forEachChunk(f))))
5279
5434
 
5280
5435
  /** @internal */
5281
5436
  export const runForEachChunkScoped = dual<
@@ -5309,15 +5464,15 @@ export const runForEachScoped = dual<
5309
5464
  export const runForEachWhile = dual<
5310
5465
  <A, E2, R2>(
5311
5466
  f: (a: A) => Effect.Effect<boolean, E2, R2>
5312
- ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<void, E2 | E, R2 | R>,
5467
+ ) => <E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<void, E2 | E, Exclude<R | R2, Scope.Scope>>,
5313
5468
  <A, E, R, E2, R2>(
5314
5469
  self: Stream.Stream<A, E, R>,
5315
5470
  f: (a: A) => Effect.Effect<boolean, E2, R2>
5316
- ) => Effect.Effect<void, E2 | E, R2 | R>
5471
+ ) => Effect.Effect<void, E2 | E, Exclude<R | R2, Scope.Scope>>
5317
5472
  >(2, <A, E, R, E2, R2>(
5318
5473
  self: Stream.Stream<A, E, R>,
5319
5474
  f: (a: A) => Effect.Effect<boolean, E2, R2>
5320
- ): Effect.Effect<void, E2 | E, R2 | R> => pipe(self, run(_sink.forEachWhile(f))))
5475
+ ): Effect.Effect<void, E2 | E, Exclude<R | R2, Scope.Scope>> => pipe(self, run(_sink.forEachWhile(f))))
5321
5476
 
5322
5477
  /** @internal */
5323
5478
  export const runForEachWhileScoped = dual<
@@ -5334,17 +5489,25 @@ export const runForEachWhileScoped = dual<
5334
5489
  ): Effect.Effect<void, E2 | E, R2 | R | Scope.Scope> => pipe(self, runScoped(_sink.forEachWhile(f))))
5335
5490
 
5336
5491
  /** @internal */
5337
- export const runHead = <A, E, R>(self: Stream.Stream<A, E, R>): Effect.Effect<Option.Option<A>, E, R> =>
5338
- pipe(self, run(_sink.head<A>()))
5492
+ export const runHead = <A, E, R>(
5493
+ self: Stream.Stream<A, E, R>
5494
+ ): Effect.Effect<Option.Option<A>, E, Exclude<R, Scope.Scope>> => pipe(self, run(_sink.head<A>()))
5339
5495
 
5340
5496
  /** @internal */
5341
5497
  export const runIntoPubSub = dual<
5342
- <A, E>(pubsub: PubSub.PubSub<Take.Take<A, E>>) => <R>(self: Stream.Stream<A, E, R>) => Effect.Effect<void, never, R>,
5343
- <A, E, R>(self: Stream.Stream<A, E, R>, pubsub: PubSub.PubSub<Take.Take<A, E>>) => Effect.Effect<void, never, R>
5498
+ <A, E>(
5499
+ pubsub: PubSub.PubSub<Take.Take<A, E>>
5500
+ ) => <R>(self: Stream.Stream<A, E, R>) => Effect.Effect<void, never, Exclude<R, Scope.Scope>>,
5501
+ <A, E, R>(
5502
+ self: Stream.Stream<A, E, R>,
5503
+ pubsub: PubSub.PubSub<Take.Take<A, E>>
5504
+ ) => Effect.Effect<void, never, Exclude<R, Scope.Scope>>
5344
5505
  >(
5345
5506
  2,
5346
- <A, E, R>(self: Stream.Stream<A, E, R>, pubsub: PubSub.PubSub<Take.Take<A, E>>): Effect.Effect<void, never, R> =>
5347
- pipe(self, runIntoQueue(pubsub))
5507
+ <A, E, R>(
5508
+ self: Stream.Stream<A, E, R>,
5509
+ pubsub: PubSub.PubSub<Take.Take<A, E>>
5510
+ ): Effect.Effect<void, never, Exclude<R, Scope.Scope>> => pipe(self, runIntoQueue(pubsub))
5348
5511
  )
5349
5512
 
5350
5513
  /** @internal */
@@ -5363,12 +5526,19 @@ export const runIntoPubSubScoped = dual<
5363
5526
 
5364
5527
  /** @internal */
5365
5528
  export const runIntoQueue = dual<
5366
- <A, E>(queue: Queue.Enqueue<Take.Take<A, E>>) => <R>(self: Stream.Stream<A, E, R>) => Effect.Effect<void, never, R>,
5367
- <A, E, R>(self: Stream.Stream<A, E, R>, queue: Queue.Enqueue<Take.Take<A, E>>) => Effect.Effect<void, never, R>
5529
+ <A, E>(
5530
+ queue: Queue.Enqueue<Take.Take<A, E>>
5531
+ ) => <R>(self: Stream.Stream<A, E, R>) => Effect.Effect<void, never, Exclude<R, Scope.Scope>>,
5532
+ <A, E, R>(
5533
+ self: Stream.Stream<A, E, R>,
5534
+ queue: Queue.Enqueue<Take.Take<A, E>>
5535
+ ) => Effect.Effect<void, never, Exclude<R, Scope.Scope>>
5368
5536
  >(
5369
5537
  2,
5370
- <A, E, R>(self: Stream.Stream<A, E, R>, queue: Queue.Enqueue<Take.Take<A, E>>): Effect.Effect<void, never, R> =>
5371
- pipe(self, runIntoQueueScoped(queue), Effect.scoped)
5538
+ <A, E, R>(
5539
+ self: Stream.Stream<A, E, R>,
5540
+ queue: Queue.Enqueue<Take.Take<A, E>>
5541
+ ): Effect.Effect<void, never, Exclude<R, Scope.Scope>> => pipe(self, runIntoQueueScoped(queue), Effect.scoped)
5372
5542
  )
5373
5543
 
5374
5544
  /** @internal */
@@ -5431,8 +5601,9 @@ export const runIntoQueueScoped = dual<
5431
5601
  })
5432
5602
 
5433
5603
  /** @internal */
5434
- export const runLast = <A, E, R>(self: Stream.Stream<A, E, R>): Effect.Effect<Option.Option<A>, E, R> =>
5435
- pipe(self, run(_sink.last()))
5604
+ export const runLast = <A, E, R>(
5605
+ self: Stream.Stream<A, E, R>
5606
+ ): Effect.Effect<Option.Option<A>, E, Exclude<R, Scope.Scope>> => pipe(self, run(_sink.last()))
5436
5607
 
5437
5608
  /** @internal */
5438
5609
  export const runScoped = dual<
@@ -5455,7 +5626,7 @@ export const runScoped = dual<
5455
5626
  ))
5456
5627
 
5457
5628
  /** @internal */
5458
- export const runSum = <E, R>(self: Stream.Stream<number, E, R>): Effect.Effect<number, E, R> =>
5629
+ export const runSum = <E, R>(self: Stream.Stream<number, E, R>): Effect.Effect<number, E, Exclude<R, Scope.Scope>> =>
5459
5630
  pipe(self, run(_sink.sum))
5460
5631
 
5461
5632
  /** @internal */
@@ -6435,24 +6606,67 @@ export const timeoutTo = dual<
6435
6606
  }
6436
6607
  )
6437
6608
 
6609
+ const pubsubFromOptions = <A, E>(
6610
+ options: number | {
6611
+ readonly capacity: "unbounded"
6612
+ readonly replay?: number | undefined
6613
+ } | {
6614
+ readonly capacity: number
6615
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
6616
+ readonly replay?: number | undefined
6617
+ }
6618
+ ): Effect.Effect<PubSub.PubSub<Take.Take<A, E>>> => {
6619
+ if (typeof options === "number") {
6620
+ return PubSub.bounded(options)
6621
+ } else if (options.capacity === "unbounded") {
6622
+ return PubSub.unbounded({ replay: options.replay })
6623
+ }
6624
+ switch (options.strategy) {
6625
+ case "dropping":
6626
+ return PubSub.dropping(options)
6627
+ case "sliding":
6628
+ return PubSub.sliding(options)
6629
+ default:
6630
+ return PubSub.bounded(options)
6631
+ }
6632
+ }
6633
+
6438
6634
  /** @internal */
6439
6635
  export const toPubSub = dual<
6440
6636
  (
6441
- capacity: number
6637
+ capacity: number | {
6638
+ readonly capacity: "unbounded"
6639
+ readonly replay?: number | undefined
6640
+ } | {
6641
+ readonly capacity: number
6642
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
6643
+ readonly replay?: number | undefined
6644
+ }
6442
6645
  ) => <A, E, R>(self: Stream.Stream<A, E, R>) => Effect.Effect<PubSub.PubSub<Take.Take<A, E>>, never, Scope.Scope | R>,
6443
6646
  <A, E, R>(
6444
6647
  self: Stream.Stream<A, E, R>,
6445
- capacity: number
6648
+ capacity: number | {
6649
+ readonly capacity: "unbounded"
6650
+ readonly replay?: number | undefined
6651
+ } | {
6652
+ readonly capacity: number
6653
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
6654
+ readonly replay?: number | undefined
6655
+ }
6446
6656
  ) => Effect.Effect<PubSub.PubSub<Take.Take<A, E>>, never, Scope.Scope | R>
6447
6657
  >(2, <A, E, R>(
6448
6658
  self: Stream.Stream<A, E, R>,
6449
- capacity: number
6659
+ capacity: number | {
6660
+ readonly capacity: "unbounded"
6661
+ readonly replay?: number | undefined
6662
+ } | {
6663
+ readonly capacity: number
6664
+ readonly strategy?: "sliding" | "dropping" | "suspend" | undefined
6665
+ readonly replay?: number | undefined
6666
+ }
6450
6667
  ): Effect.Effect<PubSub.PubSub<Take.Take<A, E>>, never, Scope.Scope | R> =>
6451
6668
  pipe(
6452
- Effect.acquireRelease(
6453
- PubSub.bounded<Take.Take<A, E>>(capacity),
6454
- (pubsub) => PubSub.shutdown(pubsub)
6455
- ),
6669
+ Effect.acquireRelease(pubsubFromOptions<A, E>(capacity), (pubsub) => PubSub.shutdown(pubsub)),
6456
6670
  Effect.tap((pubsub) => pipe(self, runIntoPubSubScoped(pubsub), Effect.forkScoped))
6457
6671
  ))
6458
6672