effect 3.6.7 → 3.7.0

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 (104) hide show
  1. package/dist/cjs/Array.js +1 -1
  2. package/dist/cjs/Array.js.map +1 -1
  3. package/dist/cjs/Config.js +8 -1
  4. package/dist/cjs/Config.js.map +1 -1
  5. package/dist/cjs/Context.js +9 -1
  6. package/dist/cjs/Context.js.map +1 -1
  7. package/dist/cjs/Effect.js +26 -4
  8. package/dist/cjs/Effect.js.map +1 -1
  9. package/dist/cjs/Fiber.js.map +1 -1
  10. package/dist/cjs/FiberHandle.js +20 -8
  11. package/dist/cjs/FiberHandle.js.map +1 -1
  12. package/dist/cjs/FiberMap.js +22 -11
  13. package/dist/cjs/FiberMap.js.map +1 -1
  14. package/dist/cjs/FiberSet.js +23 -9
  15. package/dist/cjs/FiberSet.js.map +1 -1
  16. package/dist/cjs/Micro.js +9 -2
  17. package/dist/cjs/Micro.js.map +1 -1
  18. package/dist/cjs/Stream.js +30 -2
  19. package/dist/cjs/Stream.js.map +1 -1
  20. package/dist/cjs/internal/config.js +7 -1
  21. package/dist/cjs/internal/config.js.map +1 -1
  22. package/dist/cjs/internal/context.js +8 -1
  23. package/dist/cjs/internal/context.js.map +1 -1
  24. package/dist/cjs/internal/effect/circular.js +3 -1
  25. package/dist/cjs/internal/effect/circular.js.map +1 -1
  26. package/dist/cjs/internal/fiberRuntime.js +23 -15
  27. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  28. package/dist/cjs/internal/logger.js +4 -4
  29. package/dist/cjs/internal/logger.js.map +1 -1
  30. package/dist/cjs/internal/stream.js +6 -3
  31. package/dist/cjs/internal/stream.js.map +1 -1
  32. package/dist/cjs/internal/version.js +1 -1
  33. package/dist/dts/Array.d.ts +9 -9
  34. package/dist/dts/Array.d.ts.map +1 -1
  35. package/dist/dts/Config.d.ts +7 -0
  36. package/dist/dts/Config.d.ts.map +1 -1
  37. package/dist/dts/Context.d.ts +12 -0
  38. package/dist/dts/Context.d.ts.map +1 -1
  39. package/dist/dts/Effect.d.ts +84 -4
  40. package/dist/dts/Effect.d.ts.map +1 -1
  41. package/dist/dts/Fiber.d.ts +5 -1
  42. package/dist/dts/Fiber.d.ts.map +1 -1
  43. package/dist/dts/FiberHandle.d.ts +7 -0
  44. package/dist/dts/FiberHandle.d.ts.map +1 -1
  45. package/dist/dts/FiberMap.d.ts +7 -0
  46. package/dist/dts/FiberMap.d.ts.map +1 -1
  47. package/dist/dts/FiberSet.d.ts +17 -5
  48. package/dist/dts/FiberSet.d.ts.map +1 -1
  49. package/dist/dts/Micro.d.ts +6 -0
  50. package/dist/dts/Micro.d.ts.map +1 -1
  51. package/dist/dts/Stream.d.ts +30 -0
  52. package/dist/dts/Stream.d.ts.map +1 -1
  53. package/dist/dts/internal/stream.d.ts +0 -1
  54. package/dist/dts/internal/stream.d.ts.map +1 -1
  55. package/dist/esm/Array.js +1 -1
  56. package/dist/esm/Array.js.map +1 -1
  57. package/dist/esm/Config.js +7 -0
  58. package/dist/esm/Config.js.map +1 -1
  59. package/dist/esm/Context.js +8 -0
  60. package/dist/esm/Context.js.map +1 -1
  61. package/dist/esm/Effect.js +22 -0
  62. package/dist/esm/Effect.js.map +1 -1
  63. package/dist/esm/Fiber.js.map +1 -1
  64. package/dist/esm/FiberHandle.js +20 -8
  65. package/dist/esm/FiberHandle.js.map +1 -1
  66. package/dist/esm/FiberMap.js +22 -11
  67. package/dist/esm/FiberMap.js.map +1 -1
  68. package/dist/esm/FiberSet.js +23 -9
  69. package/dist/esm/FiberSet.js.map +1 -1
  70. package/dist/esm/Micro.js +7 -1
  71. package/dist/esm/Micro.js.map +1 -1
  72. package/dist/esm/Stream.js +27 -0
  73. package/dist/esm/Stream.js.map +1 -1
  74. package/dist/esm/internal/config.js +5 -0
  75. package/dist/esm/internal/config.js.map +1 -1
  76. package/dist/esm/internal/context.js +7 -0
  77. package/dist/esm/internal/context.js.map +1 -1
  78. package/dist/esm/internal/effect/circular.js +2 -0
  79. package/dist/esm/internal/effect/circular.js.map +1 -1
  80. package/dist/esm/internal/fiberRuntime.js +20 -13
  81. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  82. package/dist/esm/internal/logger.js +4 -4
  83. package/dist/esm/internal/logger.js.map +1 -1
  84. package/dist/esm/internal/stream.js +3 -0
  85. package/dist/esm/internal/stream.js.map +1 -1
  86. package/dist/esm/internal/version.js +1 -1
  87. package/package.json +1 -1
  88. package/src/Array.ts +39 -9
  89. package/src/Config.ts +8 -0
  90. package/src/Context.ts +13 -0
  91. package/src/Effect.ts +172 -19
  92. package/src/Fiber.ts +8 -1
  93. package/src/FiberHandle.ts +46 -10
  94. package/src/FiberMap.ts +48 -13
  95. package/src/FiberSet.ts +65 -24
  96. package/src/Micro.ts +8 -1
  97. package/src/Stream.ts +36 -0
  98. package/src/internal/config.ts +10 -0
  99. package/src/internal/context.ts +12 -0
  100. package/src/internal/effect/circular.ts +91 -0
  101. package/src/internal/fiberRuntime.ts +101 -30
  102. package/src/internal/logger.ts +5 -8
  103. package/src/internal/stream.ts +18 -0
  104. package/src/internal/version.ts +1 -1
@@ -1,5 +1,6 @@
1
1
  import type * as C from "../Context.js"
2
2
  import * as Equal from "../Equal.js"
3
+ import type { LazyArg } from "../Function.js"
3
4
  import { dual } from "../Function.js"
4
5
  import * as Hash from "../Hash.js"
5
6
  import { format, NodeInspectSymbol, toJSON } from "../Inspectable.js"
@@ -209,6 +210,17 @@ export const get: {
209
210
  <Services, T extends C.ValidTagsById<Services>>(self: C.Context<Services>, tag: T): C.Tag.Service<T>
210
211
  } = unsafeGet
211
212
 
213
+ /** @internal */
214
+ export const getOrElse = dual<
215
+ <S, I, B>(tag: C.Tag<I, S>, orElse: LazyArg<B>) => <Services>(self: C.Context<Services>) => S | B,
216
+ <Services, S, I, B>(self: C.Context<Services>, tag: C.Tag<I, S>, orElse: LazyArg<B>) => S | B
217
+ >(3, (self, tag, orElse) => {
218
+ if (!self.unsafeMap.has(tag.key)) {
219
+ return orElse()
220
+ }
221
+ return self.unsafeMap.get(tag.key)! as any
222
+ })
223
+
212
224
  /** @internal */
213
225
  export const getOption = dual<
214
226
  <S, I>(tag: C.Tag<I, S>) => <Services>(self: C.Context<Services>) => O.Option<S>,
@@ -22,6 +22,7 @@ import { currentScheduler } from "../../Scheduler.js"
22
22
  import type * as Scope from "../../Scope.js"
23
23
  import type * as Supervisor from "../../Supervisor.js"
24
24
  import type * as Synchronized from "../../SynchronizedRef.js"
25
+ import type * as Types from "../../Types.js"
25
26
  import * as internalCause from "../cause.js"
26
27
  import * as effect from "../core-effect.js"
27
28
  import * as core from "../core.js"
@@ -704,3 +705,93 @@ export const zipWithFiber = dual<
704
705
  return pipeArguments(this, arguments)
705
706
  }
706
707
  }))
708
+
709
+ /* @internal */
710
+ export const bindAll: {
711
+ <
712
+ A extends object,
713
+ X extends Record<string, Effect.Effect<any, any, any>>,
714
+ O extends {
715
+ readonly concurrency?: Types.Concurrency | undefined
716
+ readonly batching?: boolean | "inherit" | undefined
717
+ readonly mode?: "default" | "validate" | "either" | undefined
718
+ readonly concurrentFinalizers?: boolean | undefined
719
+ }
720
+ >(
721
+ f: (a: A) => [Extract<keyof X, keyof A>] extends [never] ? X : `Duplicate keys`,
722
+ options?: undefined | O
723
+ ): <E1, R1>(
724
+ self: Effect.Effect<A, E1, R1>
725
+ ) => [Effect.All.ReturnObject<X, false, Effect.All.ExtractMode<O>>] extends
726
+ [Effect.Effect<infer Success, infer Error, infer Context>] ? Effect.Effect<
727
+ {
728
+ [K in keyof A | keyof Success]: K extends keyof A ? A[K]
729
+ : K extends keyof Success ? Success[K]
730
+ : never
731
+ },
732
+ | E1
733
+ | Error,
734
+ R1 | Context
735
+ >
736
+ : never
737
+
738
+ <
739
+ A extends object,
740
+ X extends Record<string, Effect.Effect<any, any, any>>,
741
+ O extends {
742
+ readonly concurrency?: Types.Concurrency | undefined
743
+ readonly batching?: boolean | "inherit" | undefined
744
+ readonly mode?: "default" | "validate" | "either" | undefined
745
+ readonly concurrentFinalizers?: boolean | undefined
746
+ },
747
+ E1,
748
+ R1
749
+ >(
750
+ self: Effect.Effect<A, E1, R1>,
751
+ f: (a: A) => [Extract<keyof X, keyof A>] extends [never] ? X : `Duplicate keys`,
752
+ options?: undefined | {
753
+ readonly concurrency?: Types.Concurrency | undefined
754
+ readonly batching?: boolean | "inherit" | undefined
755
+ readonly mode?: "default" | "validate" | "either" | undefined
756
+ readonly concurrentFinalizers?: boolean | undefined
757
+ }
758
+ ): [Effect.All.ReturnObject<X, false, Effect.All.ExtractMode<O>>] extends
759
+ [Effect.Effect<infer Success, infer Error, infer Context>] ? Effect.Effect<
760
+ {
761
+ [K in keyof A | keyof Success]: K extends keyof A ? A[K]
762
+ : K extends keyof Success ? Success[K]
763
+ : never
764
+ },
765
+ | E1
766
+ | Error,
767
+ R1 | Context
768
+ >
769
+ : never
770
+ } = dual((args) => core.isEffect(args[0]), <
771
+ A extends object,
772
+ X extends Record<string, Effect.Effect<any, any, any>>,
773
+ O extends {
774
+ readonly concurrency?: Types.Concurrency | undefined
775
+ readonly batching?: boolean | "inherit" | undefined
776
+ readonly mode?: "default" | "validate" | "either" | undefined
777
+ readonly concurrentFinalizers?: boolean | undefined
778
+ },
779
+ E1,
780
+ R1
781
+ >(
782
+ self: Effect.Effect<A, E1, R1>,
783
+ f: (a: A) => X,
784
+ options?: undefined | O
785
+ ) =>
786
+ core.flatMap(
787
+ self,
788
+ (a) =>
789
+ (fiberRuntime.all(f(a), options) as Effect.All.ReturnObject<
790
+ X,
791
+ Effect.All.IsDiscard<O>,
792
+ Effect.All.ExtractMode<O>
793
+ >)
794
+ .pipe(
795
+ core.map((record) => Object.assign({}, a, record))
796
+ )
797
+ ))
@@ -1643,10 +1643,12 @@ export const exists: {
1643
1643
  <A, E, R>(f: (a: A, i: number) => Effect.Effect<boolean, E, R>, options?: {
1644
1644
  readonly concurrency?: Concurrency | undefined
1645
1645
  readonly batching?: boolean | "inherit" | undefined
1646
+ readonly concurrentFinalizers?: boolean | undefined
1646
1647
  }): (elements: Iterable<A>) => Effect.Effect<boolean, E, R>
1647
1648
  <A, E, R>(elements: Iterable<A>, f: (a: A, i: number) => Effect.Effect<boolean, E, R>, options?: {
1648
1649
  readonly concurrency?: Concurrency | undefined
1649
1650
  readonly batching?: boolean | "inherit" | undefined
1651
+ readonly concurrentFinalizers?: boolean | undefined
1650
1652
  }): Effect.Effect<boolean, E, R>
1651
1653
  } = dual(
1652
1654
  (args) => Predicate.isIterable(args[0]) && !core.isEffect(args[0]),
@@ -1695,12 +1697,14 @@ export const filter = dual<
1695
1697
  readonly concurrency?: Concurrency | undefined
1696
1698
  readonly batching?: boolean | "inherit" | undefined
1697
1699
  readonly negate?: boolean | undefined
1700
+ readonly concurrentFinalizers?: boolean | undefined
1698
1701
  }
1699
1702
  ) => (elements: Iterable<A>) => Effect.Effect<Array<A>, E, R>,
1700
1703
  <A, E, R>(elements: Iterable<A>, f: (a: NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>, options?: {
1701
1704
  readonly concurrency?: Concurrency | undefined
1702
1705
  readonly batching?: boolean | "inherit" | undefined
1703
1706
  readonly negate?: boolean | undefined
1707
+ readonly concurrentFinalizers?: boolean | undefined
1704
1708
  }) => Effect.Effect<Array<A>, E, R>
1705
1709
  >(
1706
1710
  (args) => Predicate.isIterable(args[0]) && !core.isEffect(args[0]),
@@ -1708,6 +1712,7 @@ export const filter = dual<
1708
1712
  readonly concurrency?: Concurrency | undefined
1709
1713
  readonly batching?: boolean | "inherit" | undefined
1710
1714
  readonly negate?: boolean | undefined
1715
+ readonly concurrentFinalizers?: boolean | undefined
1711
1716
  }) => {
1712
1717
  const predicate = options?.negate ? (a: A, i: number) => core.map(f(a, i), Boolean.not) : f
1713
1718
  return concurrency.matchSimple(
@@ -1767,6 +1772,7 @@ const allValidate = (
1767
1772
  readonly batching?: boolean | "inherit" | undefined
1768
1773
  readonly discard?: boolean | undefined
1769
1774
  readonly mode?: "default" | "validate" | "either" | undefined
1775
+ readonly concurrentFinalizers?: boolean | undefined
1770
1776
  }
1771
1777
  ) => {
1772
1778
  const eitherEffects: Array<Effect.Effect<Either.Either<unknown, unknown>, never, unknown>> = []
@@ -1816,6 +1822,7 @@ const allEither = (
1816
1822
  readonly batching?: boolean | "inherit" | undefined
1817
1823
  readonly discard?: boolean | undefined
1818
1824
  readonly mode?: "default" | "validate" | "either" | undefined
1825
+ readonly concurrentFinalizers?: boolean | undefined
1819
1826
  }
1820
1827
  ) => {
1821
1828
  const eitherEffects: Array<Effect.Effect<Either.Either<unknown, unknown>, never, unknown>> = []
@@ -1851,6 +1858,7 @@ export const all = <
1851
1858
  readonly batching?: boolean | "inherit" | undefined
1852
1859
  readonly discard?: boolean | undefined
1853
1860
  readonly mode?: "default" | "validate" | "either" | undefined
1861
+ readonly concurrentFinalizers?: boolean | undefined
1854
1862
  }
1855
1863
  >(
1856
1864
  arg: Arg,
@@ -1879,6 +1887,7 @@ export const allWith = <
1879
1887
  readonly batching?: boolean | "inherit" | undefined
1880
1888
  readonly discard?: boolean | undefined
1881
1889
  readonly mode?: "default" | "validate" | "either" | undefined
1890
+ readonly concurrentFinalizers?: boolean | undefined
1882
1891
  }
1883
1892
  >(options?: O) =>
1884
1893
  <const Arg extends Iterable<Effect.Effect<any, any, any>> | Record<string, Effect.Effect<any, any, any>>>(
@@ -1891,6 +1900,7 @@ export const allSuccesses = <Eff extends Effect.Effect<any, any, any>>(
1891
1900
  options?: {
1892
1901
  readonly concurrency?: Concurrency | undefined
1893
1902
  readonly batching?: boolean | "inherit" | undefined
1903
+ readonly concurrentFinalizers?: boolean | undefined
1894
1904
  }
1895
1905
  ): Effect.Effect<Array<Effect.Effect.Success<Eff>>, never, Effect.Effect.Context<Eff>> =>
1896
1906
  core.map(
@@ -1912,6 +1922,7 @@ export const replicateEffect: {
1912
1922
  readonly concurrency?: Concurrency | undefined
1913
1923
  readonly batching?: boolean | "inherit" | undefined
1914
1924
  readonly discard?: false | undefined
1925
+ readonly concurrentFinalizers?: boolean | undefined
1915
1926
  }
1916
1927
  ): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<Array<A>, E, R>
1917
1928
  (
@@ -1920,6 +1931,7 @@ export const replicateEffect: {
1920
1931
  readonly concurrency?: Concurrency | undefined
1921
1932
  readonly batching?: boolean | "inherit" | undefined
1922
1933
  readonly discard: true
1934
+ readonly concurrentFinalizers?: boolean | undefined
1923
1935
  }
1924
1936
  ): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<void, E, R>
1925
1937
  <A, E, R>(
@@ -1929,6 +1941,7 @@ export const replicateEffect: {
1929
1941
  readonly concurrency?: Concurrency | undefined
1930
1942
  readonly batching?: boolean | "inherit" | undefined
1931
1943
  readonly discard?: false | undefined
1944
+ readonly concurrentFinalizers?: boolean | undefined
1932
1945
  }
1933
1946
  ): Effect.Effect<Array<A>, E, R>
1934
1947
  <A, E, R>(
@@ -1938,6 +1951,7 @@ export const replicateEffect: {
1938
1951
  readonly concurrency?: Concurrency | undefined
1939
1952
  readonly batching?: boolean | "inherit" | undefined
1940
1953
  readonly discard: true
1954
+ readonly concurrentFinalizers?: boolean | undefined
1941
1955
  }
1942
1956
  ): Effect.Effect<void, E, R>
1943
1957
  } = dual(
@@ -1953,6 +1967,7 @@ export const forEach: {
1953
1967
  readonly concurrency?: Concurrency | undefined
1954
1968
  readonly batching?: boolean | "inherit" | undefined
1955
1969
  readonly discard?: false | undefined
1970
+ readonly concurrentFinalizers?: boolean | undefined
1956
1971
  } | undefined
1957
1972
  ): (
1958
1973
  self: S
@@ -1963,6 +1978,7 @@ export const forEach: {
1963
1978
  readonly concurrency?: Concurrency | undefined
1964
1979
  readonly batching?: boolean | "inherit" | undefined
1965
1980
  readonly discard: true
1981
+ readonly concurrentFinalizers?: boolean | undefined
1966
1982
  }
1967
1983
  ): (self: Iterable<A>) => Effect.Effect<void, E, R>
1968
1984
  <A, B, E, R>(
@@ -1972,6 +1988,7 @@ export const forEach: {
1972
1988
  readonly concurrency?: Concurrency | undefined
1973
1989
  readonly batching?: boolean | "inherit" | undefined
1974
1990
  readonly discard?: false | undefined
1991
+ readonly concurrentFinalizers?: boolean | undefined
1975
1992
  } | undefined
1976
1993
  ): Effect.Effect<RA.NonEmptyArray<B>, E, R>
1977
1994
  <A, B, E, R>(
@@ -1981,6 +1998,7 @@ export const forEach: {
1981
1998
  readonly concurrency?: Concurrency | undefined
1982
1999
  readonly batching?: boolean | "inherit" | undefined
1983
2000
  readonly discard?: false | undefined
2001
+ readonly concurrentFinalizers?: boolean | undefined
1984
2002
  } | undefined
1985
2003
  ): Effect.Effect<Array<B>, E, R>
1986
2004
  <A, B, E, R>(
@@ -1990,6 +2008,7 @@ export const forEach: {
1990
2008
  readonly concurrency?: Concurrency | undefined
1991
2009
  readonly batching?: boolean | "inherit" | undefined
1992
2010
  readonly discard: true
2011
+ readonly concurrentFinalizers?: boolean | undefined
1993
2012
  }
1994
2013
  ): Effect.Effect<void, E, R>
1995
2014
  } = dual((args) => Predicate.isIterable(args[0]), <A, R, E, B>(
@@ -1999,6 +2018,7 @@ export const forEach: {
1999
2018
  readonly concurrency?: Concurrency | undefined
2000
2019
  readonly batching?: boolean | "inherit" | undefined
2001
2020
  readonly discard?: boolean | undefined
2021
+ readonly concurrentFinalizers?: boolean | undefined
2002
2022
  }
2003
2023
  ) =>
2004
2024
  core.withFiberRuntime<A | void, E, R>((r) => {
@@ -2009,17 +2029,17 @@ export const forEach: {
2009
2029
  return concurrency.match(
2010
2030
  options.concurrency,
2011
2031
  () =>
2012
- finalizersMask(ExecutionStrategy.sequential)((restore) =>
2032
+ finalizersMaskInternal(ExecutionStrategy.sequential, options?.concurrentFinalizers)((restore) =>
2013
2033
  isRequestBatchingEnabled
2014
2034
  ? forEachConcurrentDiscard(self, (a, i) => restore(f(a, i)), true, false, 1)
2015
2035
  : core.forEachSequentialDiscard(self, (a, i) => restore(f(a, i)))
2016
2036
  ),
2017
2037
  () =>
2018
- finalizersMask(ExecutionStrategy.parallel)((restore) =>
2038
+ finalizersMaskInternal(ExecutionStrategy.parallel, options?.concurrentFinalizers)((restore) =>
2019
2039
  forEachConcurrentDiscard(self, (a, i) => restore(f(a, i)), isRequestBatchingEnabled, false)
2020
2040
  ),
2021
2041
  (n) =>
2022
- finalizersMask(ExecutionStrategy.parallelN(n))((restore) =>
2042
+ finalizersMaskInternal(ExecutionStrategy.parallelN(n), options?.concurrentFinalizers)((restore) =>
2023
2043
  forEachConcurrentDiscard(self, (a, i) => restore(f(a, i)), isRequestBatchingEnabled, false, n)
2024
2044
  )
2025
2045
  )
@@ -2028,17 +2048,17 @@ export const forEach: {
2028
2048
  return concurrency.match(
2029
2049
  options?.concurrency,
2030
2050
  () =>
2031
- finalizersMask(ExecutionStrategy.sequential)((restore) =>
2051
+ finalizersMaskInternal(ExecutionStrategy.sequential, options?.concurrentFinalizers)((restore) =>
2032
2052
  isRequestBatchingEnabled
2033
2053
  ? forEachParN(self, 1, (a, i) => restore(f(a, i)), true)
2034
2054
  : core.forEachSequential(self, (a, i) => restore(f(a, i)))
2035
2055
  ),
2036
2056
  () =>
2037
- finalizersMask(ExecutionStrategy.parallel)((restore) =>
2057
+ finalizersMaskInternal(ExecutionStrategy.parallel, options?.concurrentFinalizers)((restore) =>
2038
2058
  forEachParUnbounded(self, (a, i) => restore(f(a, i)), isRequestBatchingEnabled)
2039
2059
  ),
2040
2060
  (n) =>
2041
- finalizersMask(ExecutionStrategy.parallelN(n))((restore) =>
2061
+ finalizersMaskInternal(ExecutionStrategy.parallelN(n), options?.concurrentFinalizers)((restore) =>
2042
2062
  forEachParN(self, n, (a, i) => restore(f(a, i)), isRequestBatchingEnabled)
2043
2063
  )
2044
2064
  )
@@ -2374,6 +2394,7 @@ export const mergeAll = dual<
2374
2394
  options?: {
2375
2395
  readonly concurrency?: Concurrency | undefined
2376
2396
  readonly batching?: boolean | "inherit" | undefined
2397
+ readonly concurrentFinalizers?: boolean | undefined
2377
2398
  }
2378
2399
  ) => (elements: Iterable<Eff>) => Effect.Effect<Z, Effect.Effect.Error<Eff>, Effect.Effect.Context<Eff>>,
2379
2400
  <Eff extends Effect.Effect<any, any, any>, Z>(
@@ -2383,6 +2404,7 @@ export const mergeAll = dual<
2383
2404
  options?: {
2384
2405
  readonly concurrency?: Concurrency | undefined
2385
2406
  readonly batching?: boolean | "inherit" | undefined
2407
+ readonly concurrentFinalizers?: boolean | undefined
2386
2408
  }
2387
2409
  ) => Effect.Effect<Z, Effect.Effect.Error<Eff>, Effect.Effect.Context<Eff>>
2388
2410
  >(
@@ -2390,6 +2412,7 @@ export const mergeAll = dual<
2390
2412
  <A, E, R, Z>(elements: Iterable<Effect.Effect<A, E, R>>, zero: Z, f: (z: Z, a: A, i: number) => Z, options?: {
2391
2413
  readonly concurrency?: Concurrency | undefined
2392
2414
  readonly batching?: boolean | "inherit" | undefined
2415
+ readonly concurrentFinalizers?: boolean | undefined
2393
2416
  }) =>
2394
2417
  concurrency.matchSimple(
2395
2418
  options?.concurrency,
@@ -2418,6 +2441,7 @@ export const partition = dual<
2418
2441
  options?: {
2419
2442
  readonly concurrency?: Concurrency | undefined
2420
2443
  readonly batching?: boolean | "inherit" | undefined
2444
+ readonly concurrentFinalizers?: boolean | undefined
2421
2445
  }
2422
2446
  ) => (elements: Iterable<A>) => Effect.Effect<[excluded: Array<E>, satisfying: Array<B>], never, R>,
2423
2447
  <A, B, E, R>(
@@ -2426,6 +2450,7 @@ export const partition = dual<
2426
2450
  options?: {
2427
2451
  readonly concurrency?: Concurrency | undefined
2428
2452
  readonly batching?: boolean | "inherit" | undefined
2453
+ readonly concurrentFinalizers?: boolean | undefined
2429
2454
  }
2430
2455
  ) => Effect.Effect<[excluded: Array<E>, satisfying: Array<B>], never, R>
2431
2456
  >((args) => Predicate.isIterable(args[0]), (elements, f, options) =>
@@ -2443,6 +2468,7 @@ export const validateAll = dual<
2443
2468
  readonly concurrency?: Concurrency | undefined
2444
2469
  readonly batching?: boolean | "inherit" | undefined
2445
2470
  readonly discard?: false | undefined
2471
+ readonly concurrentFinalizers?: boolean | undefined
2446
2472
  }
2447
2473
  ): (elements: Iterable<A>) => Effect.Effect<Array<B>, Array<E>, R>
2448
2474
  <A, B, E, R>(
@@ -2451,6 +2477,7 @@ export const validateAll = dual<
2451
2477
  readonly concurrency?: Concurrency | undefined
2452
2478
  readonly batching?: boolean | "inherit" | undefined
2453
2479
  readonly discard: true
2480
+ readonly concurrentFinalizers?: boolean | undefined
2454
2481
  }
2455
2482
  ): (elements: Iterable<A>) => Effect.Effect<void, Array<E>, R>
2456
2483
  },
@@ -2462,6 +2489,7 @@ export const validateAll = dual<
2462
2489
  readonly concurrency?: Concurrency | undefined
2463
2490
  readonly batching?: boolean | "inherit" | undefined
2464
2491
  readonly discard?: false | undefined
2492
+ readonly concurrentFinalizers?: boolean | undefined
2465
2493
  }
2466
2494
  ): Effect.Effect<Array<B>, Array<E>, R>
2467
2495
  <A, B, E, R>(
@@ -2471,6 +2499,7 @@ export const validateAll = dual<
2471
2499
  readonly concurrency?: Concurrency | undefined
2472
2500
  readonly batching?: boolean | "inherit" | undefined
2473
2501
  readonly discard: true
2502
+ readonly concurrentFinalizers?: boolean | undefined
2474
2503
  }
2475
2504
  ): Effect.Effect<void, Array<E>, R>
2476
2505
  }
@@ -2480,6 +2509,7 @@ export const validateAll = dual<
2480
2509
  readonly concurrency?: Concurrency | undefined
2481
2510
  readonly batching?: boolean | "inherit" | undefined
2482
2511
  readonly discard?: boolean | undefined
2512
+ readonly concurrentFinalizers?: boolean | undefined
2483
2513
  }): Effect.Effect<any, Array<E>, R> =>
2484
2514
  core.flatMap(
2485
2515
  partition(elements, f, {
@@ -2615,6 +2645,7 @@ export const reduceEffect = dual<
2615
2645
  options?: {
2616
2646
  readonly concurrency?: Concurrency | undefined
2617
2647
  readonly batching?: boolean | "inherit" | undefined
2648
+ readonly concurrentFinalizers?: boolean | undefined
2618
2649
  }
2619
2650
  ) => (elements: Iterable<Eff>) => Effect.Effect<Z, E | Effect.Effect.Error<Eff>, R | Effect.Effect.Context<Eff>>,
2620
2651
  <Eff extends Effect.Effect<any, any, any>, Z, E, R>(
@@ -2624,6 +2655,7 @@ export const reduceEffect = dual<
2624
2655
  options?: {
2625
2656
  readonly concurrency?: Concurrency | undefined
2626
2657
  readonly batching?: boolean | "inherit" | undefined
2658
+ readonly concurrentFinalizers?: boolean | undefined
2627
2659
  }
2628
2660
  ) => Effect.Effect<Z, E | Effect.Effect.Error<Eff>, R | Effect.Effect.Context<Eff>>
2629
2661
  >((args) => Predicate.isIterable(args[0]) && !core.isEffect(args[0]), <A, E, R, Z>(
@@ -2633,6 +2665,7 @@ export const reduceEffect = dual<
2633
2665
  options?: {
2634
2666
  readonly concurrency?: Concurrency | undefined
2635
2667
  readonly batching?: boolean | "inherit" | undefined
2668
+ readonly concurrentFinalizers?: boolean | undefined
2636
2669
  }
2637
2670
  ) =>
2638
2671
  concurrency.matchSimple(
@@ -2713,28 +2746,43 @@ export const parallelNFinalizers =
2713
2746
  /* @internal */
2714
2747
  export const finalizersMask = (strategy: ExecutionStrategy.ExecutionStrategy) =>
2715
2748
  <A, E, R>(
2716
- self: (restore: <A1, E1, R1>(self: Effect.Effect<A1, E1, R1>) => Effect.Effect<A1, E1, R1>) => Effect.Effect<A, E, R>
2717
- ): Effect.Effect<A, E, R> =>
2718
- core.contextWithEffect((context) =>
2719
- Option.match(Context.getOption(context, scopeTag), {
2720
- onNone: () => self(identity),
2721
- onSome: (scope) => {
2722
- const patch = strategy._tag === "Parallel"
2723
- ? parallelFinalizers
2724
- : strategy._tag === "Sequential"
2725
- ? sequentialFinalizers
2726
- : parallelNFinalizers(strategy.parallelism)
2727
- switch (scope.strategy._tag) {
2728
- case "Parallel":
2729
- return patch(self(parallelFinalizers))
2730
- case "Sequential":
2731
- return patch(self(sequentialFinalizers))
2732
- case "ParallelN":
2733
- return patch(self(parallelNFinalizers(scope.strategy.parallelism)))
2749
+ self: (
2750
+ restore: <A1, E1, R1>(self: Effect.Effect<A1, E1, R1>) => Effect.Effect<A1, E1, R1>
2751
+ ) => Effect.Effect<A, E, R>
2752
+ ): Effect.Effect<A, E, R> => finalizersMaskInternal(strategy, true)(self)
2753
+
2754
+ /* @internal */
2755
+ export const finalizersMaskInternal =
2756
+ (strategy: ExecutionStrategy.ExecutionStrategy, concurrentFinalizers?: boolean | undefined) =>
2757
+ <A, E, R>(
2758
+ self: (
2759
+ restore: <A1, E1, R1>(self: Effect.Effect<A1, E1, R1>) => Effect.Effect<A1, E1, R1>
2760
+ ) => Effect.Effect<A, E, R>
2761
+ ): Effect.Effect<A, E, R> =>
2762
+ core.contextWithEffect((context) =>
2763
+ Option.match(Context.getOption(context, scopeTag), {
2764
+ onNone: () => self(identity),
2765
+ onSome: (scope) => {
2766
+ if (concurrentFinalizers === true) {
2767
+ const patch = strategy._tag === "Parallel"
2768
+ ? parallelFinalizers
2769
+ : strategy._tag === "Sequential"
2770
+ ? sequentialFinalizers
2771
+ : parallelNFinalizers(strategy.parallelism)
2772
+ switch (scope.strategy._tag) {
2773
+ case "Parallel":
2774
+ return patch(self(parallelFinalizers))
2775
+ case "Sequential":
2776
+ return patch(self(sequentialFinalizers))
2777
+ case "ParallelN":
2778
+ return patch(self(parallelNFinalizers(scope.strategy.parallelism)))
2779
+ }
2780
+ } else {
2781
+ return self(identity)
2782
+ }
2734
2783
  }
2735
- }
2736
- })
2737
- )
2784
+ })
2785
+ )
2738
2786
 
2739
2787
  /* @internal */
2740
2788
  export const scopeWith = <A, E, R>(
@@ -2798,6 +2846,7 @@ export const validate = dual<
2798
2846
  options?: {
2799
2847
  readonly concurrent?: boolean | undefined
2800
2848
  readonly batching?: boolean | "inherit" | undefined
2849
+ readonly concurrentFinalizers?: boolean | undefined
2801
2850
  }
2802
2851
  ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<[A, B], E | E1, R | R1>,
2803
2852
  <A, E, R, B, E1, R1>(
@@ -2806,6 +2855,7 @@ export const validate = dual<
2806
2855
  options?: {
2807
2856
  readonly concurrent?: boolean | undefined
2808
2857
  readonly batching?: boolean | "inherit" | undefined
2858
+ readonly concurrentFinalizers?: boolean | undefined
2809
2859
  }
2810
2860
  ) => Effect.Effect<[A, B], E | E1, R | R1>
2811
2861
  >(
@@ -2821,6 +2871,7 @@ export const validateWith = dual<
2821
2871
  options?: {
2822
2872
  readonly concurrent?: boolean | undefined
2823
2873
  readonly batching?: boolean | "inherit" | undefined
2874
+ readonly concurrentFinalizers?: boolean | undefined
2824
2875
  }
2825
2876
  ) => <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<C, E | E1, R | R1>,
2826
2877
  <A, E, R, B, E1, R1, C>(
@@ -2830,6 +2881,7 @@ export const validateWith = dual<
2830
2881
  options?: {
2831
2882
  readonly concurrent?: boolean | undefined
2832
2883
  readonly batching?: boolean | "inherit" | undefined
2884
+ readonly concurrentFinalizers?: boolean | undefined
2833
2885
  }
2834
2886
  ) => Effect.Effect<C, E | E1, R | R1>
2835
2887
  >((args) => core.isEffect(args[1]), (self, that, f, options) =>
@@ -2882,10 +2934,12 @@ export const validateFirst = dual<
2882
2934
  <A, B, E, R>(f: (a: A, i: number) => Effect.Effect<B, E, R>, options?: {
2883
2935
  readonly concurrency?: Concurrency | undefined
2884
2936
  readonly batching?: boolean | "inherit" | undefined
2937
+ readonly concurrentFinalizers?: boolean | undefined
2885
2938
  }) => (elements: Iterable<A>) => Effect.Effect<B, Array<E>, R>,
2886
2939
  <A, B, E, R>(elements: Iterable<A>, f: (a: A, i: number) => Effect.Effect<B, E, R>, options?: {
2887
2940
  readonly concurrency?: Concurrency | undefined
2888
2941
  readonly batching?: boolean | "inherit" | undefined
2942
+ readonly concurrentFinalizers?: boolean | undefined
2889
2943
  }) => Effect.Effect<B, Array<E>, R>
2890
2944
  >(
2891
2945
  (args) => Predicate.isIterable(args[0]),
@@ -2927,6 +2981,7 @@ export const zipOptions = dual<
2927
2981
  options?: {
2928
2982
  readonly concurrent?: boolean | undefined
2929
2983
  readonly batching?: boolean | "inherit" | undefined
2984
+ readonly concurrentFinalizers?: boolean | undefined
2930
2985
  }
2931
2986
  ) => <A, E, R>(
2932
2987
  self: Effect.Effect<A, E, R>
@@ -2937,6 +2992,7 @@ export const zipOptions = dual<
2937
2992
  options?: {
2938
2993
  readonly concurrent?: boolean | undefined
2939
2994
  readonly batching?: boolean | "inherit" | undefined
2995
+ readonly concurrentFinalizers?: boolean | undefined
2940
2996
  }
2941
2997
  ) => Effect.Effect<[A, A2], E | E2, R | R2>
2942
2998
  >((args) => core.isEffect(args[1]), (
@@ -2952,6 +3008,7 @@ export const zipLeftOptions = dual<
2952
3008
  options?: {
2953
3009
  readonly concurrent?: boolean | undefined
2954
3010
  readonly batching?: boolean | "inherit" | undefined
3011
+ readonly concurrentFinalizers?: boolean | undefined
2955
3012
  }
2956
3013
  ) => <A, E, R>(
2957
3014
  self: Effect.Effect<A, E, R>
@@ -2962,6 +3019,7 @@ export const zipLeftOptions = dual<
2962
3019
  options?: {
2963
3020
  readonly concurrent?: boolean | undefined
2964
3021
  readonly batching?: boolean | "inherit" | undefined
3022
+ readonly concurrentFinalizers?: boolean | undefined
2965
3023
  }
2966
3024
  ) => Effect.Effect<A, E | E2, R | R2>
2967
3025
  >(
@@ -2981,6 +3039,7 @@ export const zipRightOptions: {
2981
3039
  options?: {
2982
3040
  readonly concurrent?: boolean | undefined
2983
3041
  readonly batching?: boolean | "inherit" | undefined
3042
+ readonly concurrentFinalizers?: boolean | undefined
2984
3043
  }
2985
3044
  ): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A2, E2 | E, R2 | R>
2986
3045
  <A, E, R, A2, E2, R2>(
@@ -2989,6 +3048,7 @@ export const zipRightOptions: {
2989
3048
  options?: {
2990
3049
  readonly concurrent?: boolean | undefined
2991
3050
  readonly batching?: boolean | "inherit" | undefined
3051
+ readonly concurrentFinalizers?: boolean | undefined
2992
3052
  }
2993
3053
  ): Effect.Effect<A2, E2 | E, R2 | R>
2994
3054
  } = dual((args) => core.isEffect(args[1]), <A, E, R, A2, E2, R2>(
@@ -2997,6 +3057,7 @@ export const zipRightOptions: {
2997
3057
  options?: {
2998
3058
  readonly concurrent?: boolean | undefined
2999
3059
  readonly batching?: boolean | "inherit" | undefined
3060
+ readonly concurrentFinalizers?: boolean | undefined
3000
3061
  }
3001
3062
  ): Effect.Effect<A2, E2 | E, R2 | R> => {
3002
3063
  if (options?.concurrent !== true && (options?.batching === undefined || options.batching === false)) {
@@ -3013,6 +3074,7 @@ export const zipWithOptions: {
3013
3074
  options?: {
3014
3075
  readonly concurrent?: boolean | undefined
3015
3076
  readonly batching?: boolean | "inherit" | undefined
3077
+ readonly concurrentFinalizers?: boolean | undefined
3016
3078
  }
3017
3079
  ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<B, E2 | E, R2 | R>
3018
3080
  <A, E, R, A2, E2, R2, B>(
@@ -3022,6 +3084,7 @@ export const zipWithOptions: {
3022
3084
  options?: {
3023
3085
  readonly concurrent?: boolean | undefined
3024
3086
  readonly batching?: boolean | "inherit" | undefined
3087
+ readonly concurrentFinalizers?: boolean | undefined
3025
3088
  }
3026
3089
  ): Effect.Effect<B, E2 | E, R2 | R>
3027
3090
  } = dual((args) => core.isEffect(args[1]), <A, E, R, A2, E2, R2, B>(
@@ -3031,12 +3094,14 @@ export const zipWithOptions: {
3031
3094
  options?: {
3032
3095
  readonly concurrent?: boolean | undefined
3033
3096
  readonly batching?: boolean | "inherit" | undefined
3097
+ readonly concurrentFinalizers?: boolean | undefined
3034
3098
  }
3035
3099
  ): Effect.Effect<B, E2 | E, R2 | R> =>
3036
3100
  core.map(
3037
3101
  all([self, that], {
3038
3102
  concurrency: options?.concurrent ? 2 : 1,
3039
- batching: options?.batching
3103
+ batching: options?.batching,
3104
+ concurrentFinalizers: options?.concurrentFinalizers
3040
3105
  }),
3041
3106
  ([a, a2]) => f(a, a2)
3042
3107
  ))
@@ -3288,8 +3353,14 @@ export const currentSupervisor: FiberRef.FiberRef<Supervisor.Supervisor<any>> =
3288
3353
  // circular with Fiber
3289
3354
 
3290
3355
  /* @internal */
3291
- export const fiberAwaitAll = (fibers: Iterable<Fiber.Fiber<any, any>>): Effect.Effect<void> =>
3292
- core.asVoid(internalFiber._await(fiberAll(fibers)))
3356
+ export const fiberAwaitAll = <const T extends Iterable<Fiber.Fiber<any, any>>>(
3357
+ fibers: T
3358
+ ): Effect.Effect<
3359
+ [T] extends [ReadonlyArray<infer U>]
3360
+ ? number extends T["length"] ? Array<U extends Fiber.Fiber<infer A, infer E> ? Exit.Exit<A, E> : never>
3361
+ : { -readonly [K in keyof T]: T[K] extends Fiber.Fiber<infer A, infer E> ? Exit.Exit<A, E> : never }
3362
+ : Array<T extends Iterable<infer U> ? U extends Fiber.Fiber<infer A, infer E> ? Exit.Exit<A, E> : never : never>
3363
+ > => forEach(fibers, internalFiber._await) as any
3293
3364
 
3294
3365
  /** @internal */
3295
3366
  export const fiberAll = <A, E>(fibers: Iterable<Fiber.Fiber<A, E>>): Fiber.Fiber<Array<A>, E> => ({
@@ -416,16 +416,13 @@ const defaultDateFormat = (date: Date): string =>
416
416
  date.getSeconds().toString().padStart(2, "0")
417
417
  }.${date.getMilliseconds().toString().padStart(3, "0")}`
418
418
 
419
- const processStdoutIsTTY = typeof process === "object" &&
419
+ const hasProcessStdout = typeof process === "object" &&
420
420
  process !== null &&
421
421
  typeof process.stdout === "object" &&
422
- process.stdout !== null &&
422
+ process.stdout !== null
423
+ const processStdoutIsTTY = hasProcessStdout &&
423
424
  process.stdout.isTTY === true
424
- const hasWindow = typeof window === "object"
425
- const isWorker = typeof self === "object" &&
426
- self !== null &&
427
- typeof self.constructor === "function" &&
428
- self.constructor.name.includes("Worker")
425
+ const hasProcessStdoutOrDeno = hasProcessStdout || "Deno" in globalThis
429
426
 
430
427
  /** @internal */
431
428
  export const prettyLogger = (options?: {
@@ -435,7 +432,7 @@ export const prettyLogger = (options?: {
435
432
  readonly mode?: "browser" | "tty" | "auto" | undefined
436
433
  }) => {
437
434
  const mode_ = options?.mode ?? "auto"
438
- const mode = mode_ === "auto" ? (hasWindow || isWorker ? "browser" : "tty") : mode_
435
+ const mode = mode_ === "auto" ? (hasProcessStdoutOrDeno ? "tty" : "browser") : mode_
439
436
  const isBrowser = mode === "browser"
440
437
  const showColors = typeof options?.colors === "boolean" ? options.colors : processStdoutIsTTY || isBrowser
441
438
  const formatDate = options?.formatDate ?? defaultDateFormat