effect 3.7.2 → 3.8.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 (246) hide show
  1. package/Mailbox/package.json +6 -0
  2. package/dist/cjs/Deferred.js.map +1 -1
  3. package/dist/cjs/Duration.js +99 -35
  4. package/dist/cjs/Duration.js.map +1 -1
  5. package/dist/cjs/Effect.js +30 -3
  6. package/dist/cjs/Effect.js.map +1 -1
  7. package/dist/cjs/Fiber.js.map +1 -1
  8. package/dist/cjs/FiberRef.js.map +1 -1
  9. package/dist/cjs/Iterable.js +0 -1
  10. package/dist/cjs/Iterable.js.map +1 -1
  11. package/dist/cjs/List.js +0 -2
  12. package/dist/cjs/List.js.map +1 -1
  13. package/dist/cjs/Logger.js +29 -1
  14. package/dist/cjs/Logger.js.map +1 -1
  15. package/dist/cjs/Mailbox.js +95 -0
  16. package/dist/cjs/Mailbox.js.map +1 -0
  17. package/dist/cjs/Micro.js +1 -0
  18. package/dist/cjs/Micro.js.map +1 -1
  19. package/dist/cjs/MutableHashMap.js +13 -1
  20. package/dist/cjs/MutableHashMap.js.map +1 -1
  21. package/dist/cjs/Number.js +20 -1
  22. package/dist/cjs/Number.js.map +1 -1
  23. package/dist/cjs/Queue.js.map +1 -1
  24. package/dist/cjs/RcMap.js +6 -1
  25. package/dist/cjs/RcMap.js.map +1 -1
  26. package/dist/cjs/RcRef.js.map +1 -1
  27. package/dist/cjs/Ref.js.map +1 -1
  28. package/dist/cjs/Stream.js +11 -2
  29. package/dist/cjs/Stream.js.map +1 -1
  30. package/dist/cjs/SubscriptionRef.js.map +1 -1
  31. package/dist/cjs/SynchronizedRef.js.map +1 -1
  32. package/dist/cjs/TestClock.js +8 -2
  33. package/dist/cjs/TestClock.js.map +1 -1
  34. package/dist/cjs/index.js +4 -2
  35. package/dist/cjs/index.js.map +1 -1
  36. package/dist/cjs/internal/core.js +32 -25
  37. package/dist/cjs/internal/core.js.map +1 -1
  38. package/dist/cjs/internal/defaultServices/console.js.map +1 -1
  39. package/dist/cjs/internal/defaultServices.js +8 -5
  40. package/dist/cjs/internal/defaultServices.js.map +1 -1
  41. package/dist/cjs/internal/effect/circular.js +81 -8
  42. package/dist/cjs/internal/effect/circular.js.map +1 -1
  43. package/dist/cjs/internal/fiber.js +51 -26
  44. package/dist/cjs/internal/fiber.js.map +1 -1
  45. package/dist/cjs/internal/fiberRefs.js.map +1 -1
  46. package/dist/cjs/internal/fiberRuntime.js +126 -97
  47. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  48. package/dist/cjs/internal/groupBy.js +6 -1
  49. package/dist/cjs/internal/groupBy.js.map +1 -1
  50. package/dist/cjs/internal/hashMap/node.js +0 -1
  51. package/dist/cjs/internal/hashMap/node.js.map +1 -1
  52. package/dist/cjs/internal/hashMap.js +0 -1
  53. package/dist/cjs/internal/hashMap.js.map +1 -1
  54. package/dist/cjs/internal/layer.js +3 -3
  55. package/dist/cjs/internal/layer.js.map +1 -1
  56. package/dist/cjs/internal/logger.js +4 -1
  57. package/dist/cjs/internal/logger.js.map +1 -1
  58. package/dist/cjs/internal/mailbox.js +408 -0
  59. package/dist/cjs/internal/mailbox.js.map +1 -0
  60. package/dist/cjs/internal/managedRuntime.js +1 -1
  61. package/dist/cjs/internal/managedRuntime.js.map +1 -1
  62. package/dist/cjs/internal/pubsub.js +6 -1
  63. package/dist/cjs/internal/pubsub.js.map +1 -1
  64. package/dist/cjs/internal/queue.js +6 -1
  65. package/dist/cjs/internal/queue.js.map +1 -1
  66. package/dist/cjs/internal/rcMap.js +7 -1
  67. package/dist/cjs/internal/rcMap.js.map +1 -1
  68. package/dist/cjs/internal/rcRef.js +10 -6
  69. package/dist/cjs/internal/rcRef.js.map +1 -1
  70. package/dist/cjs/internal/ref.js +7 -7
  71. package/dist/cjs/internal/ref.js.map +1 -1
  72. package/dist/cjs/internal/runtime.js +1 -1
  73. package/dist/cjs/internal/runtime.js.map +1 -1
  74. package/dist/cjs/internal/stream.js +7 -2
  75. package/dist/cjs/internal/stream.js.map +1 -1
  76. package/dist/cjs/internal/subscriptionRef.js +7 -8
  77. package/dist/cjs/internal/subscriptionRef.js.map +1 -1
  78. package/dist/cjs/internal/version.js +1 -1
  79. package/dist/dts/Deferred.d.ts +21 -2
  80. package/dist/dts/Deferred.d.ts.map +1 -1
  81. package/dist/dts/Duration.d.ts +38 -1
  82. package/dist/dts/Duration.d.ts.map +1 -1
  83. package/dist/dts/Effect.d.ts +45 -0
  84. package/dist/dts/Effect.d.ts.map +1 -1
  85. package/dist/dts/Fiber.d.ts +69 -2
  86. package/dist/dts/Fiber.d.ts.map +1 -1
  87. package/dist/dts/FiberRef.d.ts +21 -2
  88. package/dist/dts/FiberRef.d.ts.map +1 -1
  89. package/dist/dts/List.d.ts.map +1 -1
  90. package/dist/dts/Logger.d.ts +28 -0
  91. package/dist/dts/Logger.d.ts.map +1 -1
  92. package/dist/dts/Mailbox.d.ts +220 -0
  93. package/dist/dts/Mailbox.d.ts.map +1 -0
  94. package/dist/dts/Micro.d.ts.map +1 -1
  95. package/dist/dts/MutableHashMap.d.ts +5 -0
  96. package/dist/dts/MutableHashMap.d.ts.map +1 -1
  97. package/dist/dts/Number.d.ts +19 -0
  98. package/dist/dts/Number.d.ts.map +1 -1
  99. package/dist/dts/Queue.d.ts +40 -1
  100. package/dist/dts/Queue.d.ts.map +1 -1
  101. package/dist/dts/RcMap.d.ts +5 -0
  102. package/dist/dts/RcMap.d.ts.map +1 -1
  103. package/dist/dts/RcRef.d.ts +22 -2
  104. package/dist/dts/RcRef.d.ts.map +1 -1
  105. package/dist/dts/Ref.d.ts +22 -2
  106. package/dist/dts/Ref.d.ts.map +1 -1
  107. package/dist/dts/ScheduleDecision.d.ts.map +1 -1
  108. package/dist/dts/Stream.d.ts +30 -0
  109. package/dist/dts/Stream.d.ts.map +1 -1
  110. package/dist/dts/SubscriptionRef.d.ts +20 -0
  111. package/dist/dts/SubscriptionRef.d.ts.map +1 -1
  112. package/dist/dts/SynchronizedRef.d.ts +20 -0
  113. package/dist/dts/SynchronizedRef.d.ts.map +1 -1
  114. package/dist/dts/TestClock.d.ts.map +1 -1
  115. package/dist/dts/index.d.ts +5 -0
  116. package/dist/dts/index.d.ts.map +1 -1
  117. package/dist/dts/internal/core.d.ts.map +1 -1
  118. package/dist/dts/internal/fiber.d.ts.map +1 -1
  119. package/dist/dts/internal/fiberRuntime.d.ts.map +1 -1
  120. package/dist/dts/internal/logger.d.ts.map +1 -1
  121. package/dist/dts/internal/mailbox.d.ts +2 -0
  122. package/dist/dts/internal/mailbox.d.ts.map +1 -0
  123. package/dist/dts/internal/stream.d.ts +22 -0
  124. package/dist/dts/internal/stream.d.ts.map +1 -1
  125. package/dist/esm/Deferred.js.map +1 -1
  126. package/dist/esm/Duration.js +92 -33
  127. package/dist/esm/Duration.js.map +1 -1
  128. package/dist/esm/Effect.js +27 -0
  129. package/dist/esm/Effect.js.map +1 -1
  130. package/dist/esm/Fiber.js.map +1 -1
  131. package/dist/esm/FiberRef.js.map +1 -1
  132. package/dist/esm/Iterable.js +0 -1
  133. package/dist/esm/Iterable.js.map +1 -1
  134. package/dist/esm/List.js +0 -2
  135. package/dist/esm/List.js.map +1 -1
  136. package/dist/esm/Logger.js +28 -0
  137. package/dist/esm/Logger.js.map +1 -1
  138. package/dist/esm/Mailbox.js +85 -0
  139. package/dist/esm/Mailbox.js.map +1 -0
  140. package/dist/esm/Micro.js +1 -0
  141. package/dist/esm/Micro.js.map +1 -1
  142. package/dist/esm/MutableHashMap.js +11 -0
  143. package/dist/esm/MutableHashMap.js.map +1 -1
  144. package/dist/esm/Number.js +19 -0
  145. package/dist/esm/Number.js.map +1 -1
  146. package/dist/esm/Queue.js.map +1 -1
  147. package/dist/esm/RcMap.js +5 -0
  148. package/dist/esm/RcMap.js.map +1 -1
  149. package/dist/esm/RcRef.js.map +1 -1
  150. package/dist/esm/Ref.js.map +1 -1
  151. package/dist/esm/Stream.js +9 -0
  152. package/dist/esm/Stream.js.map +1 -1
  153. package/dist/esm/SubscriptionRef.js.map +1 -1
  154. package/dist/esm/SynchronizedRef.js.map +1 -1
  155. package/dist/esm/TestClock.js +8 -2
  156. package/dist/esm/TestClock.js.map +1 -1
  157. package/dist/esm/index.js +5 -0
  158. package/dist/esm/index.js.map +1 -1
  159. package/dist/esm/internal/core.js +33 -26
  160. package/dist/esm/internal/core.js.map +1 -1
  161. package/dist/esm/internal/defaultServices/console.js.map +1 -1
  162. package/dist/esm/internal/defaultServices.js +6 -4
  163. package/dist/esm/internal/defaultServices.js.map +1 -1
  164. package/dist/esm/internal/effect/circular.js +77 -6
  165. package/dist/esm/internal/effect/circular.js.map +1 -1
  166. package/dist/esm/internal/fiber.js +51 -26
  167. package/dist/esm/internal/fiber.js.map +1 -1
  168. package/dist/esm/internal/fiberRefs.js.map +1 -1
  169. package/dist/esm/internal/fiberRuntime.js +124 -96
  170. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  171. package/dist/esm/internal/groupBy.js +6 -1
  172. package/dist/esm/internal/groupBy.js.map +1 -1
  173. package/dist/esm/internal/hashMap/node.js +0 -1
  174. package/dist/esm/internal/hashMap/node.js.map +1 -1
  175. package/dist/esm/internal/hashMap.js +0 -1
  176. package/dist/esm/internal/hashMap.js.map +1 -1
  177. package/dist/esm/internal/layer.js +3 -3
  178. package/dist/esm/internal/layer.js.map +1 -1
  179. package/dist/esm/internal/logger.js +3 -0
  180. package/dist/esm/internal/logger.js.map +1 -1
  181. package/dist/esm/internal/mailbox.js +395 -0
  182. package/dist/esm/internal/mailbox.js.map +1 -0
  183. package/dist/esm/internal/managedRuntime.js +1 -1
  184. package/dist/esm/internal/managedRuntime.js.map +1 -1
  185. package/dist/esm/internal/pubsub.js +6 -1
  186. package/dist/esm/internal/pubsub.js.map +1 -1
  187. package/dist/esm/internal/queue.js +6 -1
  188. package/dist/esm/internal/queue.js.map +1 -1
  189. package/dist/esm/internal/rcMap.js +5 -0
  190. package/dist/esm/internal/rcMap.js.map +1 -1
  191. package/dist/esm/internal/rcRef.js +10 -6
  192. package/dist/esm/internal/rcRef.js.map +1 -1
  193. package/dist/esm/internal/ref.js +7 -7
  194. package/dist/esm/internal/ref.js.map +1 -1
  195. package/dist/esm/internal/runtime.js +1 -1
  196. package/dist/esm/internal/runtime.js.map +1 -1
  197. package/dist/esm/internal/stream.js +5 -0
  198. package/dist/esm/internal/stream.js.map +1 -1
  199. package/dist/esm/internal/subscriptionRef.js +7 -8
  200. package/dist/esm/internal/subscriptionRef.js.map +1 -1
  201. package/dist/esm/internal/version.js +1 -1
  202. package/package.json +9 -1
  203. package/src/Deferred.ts +21 -2
  204. package/src/Duration.ts +112 -35
  205. package/src/Effect.ts +52 -0
  206. package/src/Fiber.ts +78 -2
  207. package/src/FiberRef.ts +21 -2
  208. package/src/Iterable.ts +1 -1
  209. package/src/List.ts +0 -2
  210. package/src/Logger.ts +30 -0
  211. package/src/Mailbox.ts +236 -0
  212. package/src/Micro.ts +1 -0
  213. package/src/MutableHashMap.ts +12 -0
  214. package/src/Number.ts +23 -0
  215. package/src/Queue.ts +42 -1
  216. package/src/RcMap.ts +6 -0
  217. package/src/RcRef.ts +24 -2
  218. package/src/Ref.ts +22 -2
  219. package/src/Stream.ts +36 -0
  220. package/src/SubscriptionRef.ts +22 -0
  221. package/src/SynchronizedRef.ts +20 -0
  222. package/src/TestClock.ts +10 -2
  223. package/src/index.ts +6 -0
  224. package/src/internal/core.ts +31 -28
  225. package/src/internal/defaultServices/console.ts +1 -0
  226. package/src/internal/defaultServices.ts +9 -10
  227. package/src/internal/effect/circular.ts +83 -6
  228. package/src/internal/fiber.ts +56 -29
  229. package/src/internal/fiberRefs.ts +1 -2
  230. package/src/internal/fiberRuntime.ts +134 -103
  231. package/src/internal/groupBy.ts +7 -1
  232. package/src/internal/hashMap/node.ts +1 -1
  233. package/src/internal/hashMap.ts +1 -1
  234. package/src/internal/layer.ts +3 -3
  235. package/src/internal/logger.ts +4 -0
  236. package/src/internal/mailbox.ts +461 -0
  237. package/src/internal/managedRuntime.ts +1 -1
  238. package/src/internal/pubsub.ts +9 -2
  239. package/src/internal/queue.ts +7 -1
  240. package/src/internal/rcMap.ts +8 -0
  241. package/src/internal/rcRef.ts +10 -6
  242. package/src/internal/ref.ts +7 -7
  243. package/src/internal/runtime.ts +1 -1
  244. package/src/internal/stream.ts +53 -0
  245. package/src/internal/subscriptionRef.ts +7 -8
  246. package/src/internal/version.ts +1 -1
@@ -43,7 +43,7 @@ import * as _blockedRequests from "./blockedRequests.js"
43
43
  import * as internalCause from "./cause.js"
44
44
  import * as deferred from "./deferred.js"
45
45
  import * as internalDiffer from "./differ.js"
46
- import { effectVariance, StructuralCommitPrototype } from "./effectable.js"
46
+ import { CommitPrototype, effectVariance, StructuralCommitPrototype } from "./effectable.js"
47
47
  import { getBugErrorMessage } from "./errors.js"
48
48
  import type * as FiberRuntime from "./fiberRuntime.js"
49
49
  import type * as fiberScope from "./fiberScope.js"
@@ -51,7 +51,6 @@ import * as DeferredOpCodes from "./opCodes/deferred.js"
51
51
  import * as OpCodes from "./opCodes/effect.js"
52
52
  import * as _runtimeFlags from "./runtimeFlags.js"
53
53
  import { SingleShotGen } from "./singleShotGen.js"
54
- import * as internalTracer from "./tracer.js"
55
54
 
56
55
  // -----------------------------------------------------------------------------
57
56
  // Effect
@@ -517,9 +516,7 @@ export const unsafeAsync = <A, E = never, R = never>(
517
516
  cancelerRef = register(resume)
518
517
  }
519
518
  effect.effect_instruction_i1 = blockingOn
520
- return cancelerRef !== undefined ?
521
- onInterrupt(effect, (_) => cancelerRef!) :
522
- effect
519
+ return onInterrupt(effect, (_) => isEffect(cancelerRef) ? cancelerRef : void_)
523
520
  }
524
521
 
525
522
  /* @internal */
@@ -1684,7 +1681,7 @@ const fiberRefVariance = {
1684
1681
 
1685
1682
  /* @internal */
1686
1683
  export const fiberRefGet = <A>(self: FiberRef.FiberRef<A>): Effect.Effect<A> =>
1687
- fiberRefModify(self, (a) => [a, a] as const)
1684
+ withFiberRuntime((fiber) => exitSucceed(fiber.getFiberRef(self)))
1688
1685
 
1689
1686
  /* @internal */
1690
1687
  export const fiberRefGetAndSet = dual<
@@ -1956,18 +1953,22 @@ export const fiberRefUnsafeMakePatch = <Value, Patch>(
1956
1953
  readonly fork: Patch
1957
1954
  readonly join?: ((oldV: Value, newV: Value) => Value) | undefined
1958
1955
  }
1959
- ): FiberRef.FiberRef<Value> => ({
1960
- [FiberRefTypeId]: fiberRefVariance,
1961
- initial,
1962
- diff: (oldValue, newValue) => options.differ.diff(oldValue, newValue),
1963
- combine: (first, second) => options.differ.combine(first as Patch, second as Patch),
1964
- patch: (patch) => (oldValue) => options.differ.patch(patch as Patch, oldValue),
1965
- fork: options.fork,
1966
- join: options.join ?? ((_, n) => n),
1967
- pipe() {
1968
- return pipeArguments(this, arguments)
1956
+ ): FiberRef.FiberRef<Value> => {
1957
+ const _fiberRef = {
1958
+ ...CommitPrototype,
1959
+ [FiberRefTypeId]: fiberRefVariance,
1960
+ initial,
1961
+ commit() {
1962
+ return fiberRefGet(this)
1963
+ },
1964
+ diff: (oldValue: Value, newValue: Value) => options.differ.diff(oldValue, newValue),
1965
+ combine: (first: Patch, second: Patch) => options.differ.combine(first, second),
1966
+ patch: (patch: Patch) => (oldValue: Value) => options.differ.patch(patch, oldValue),
1967
+ fork: options.fork,
1968
+ join: options.join ?? ((_, n) => n)
1969
1969
  }
1970
- })
1970
+ return _fiberRef
1971
+ }
1971
1972
 
1972
1973
  /** @internal */
1973
1974
  export const fiberRefUnsafeMakeRuntimeFlags = (
@@ -2788,14 +2789,18 @@ const exitCollectAllInternal = <A, E>(
2788
2789
  // -----------------------------------------------------------------------------
2789
2790
 
2790
2791
  /** @internal */
2791
- export const deferredUnsafeMake = <A, E = never>(fiberId: FiberId.FiberId): Deferred.Deferred<A, E> => ({
2792
- [deferred.DeferredTypeId]: deferred.deferredVariance,
2793
- state: MutableRef.make(deferred.pending([])),
2794
- blockingOn: fiberId,
2795
- pipe() {
2796
- return pipeArguments(this, arguments)
2792
+ export const deferredUnsafeMake = <A, E = never>(fiberId: FiberId.FiberId): Deferred.Deferred<A, E> => {
2793
+ const _deferred = {
2794
+ ...CommitPrototype,
2795
+ [deferred.DeferredTypeId]: deferred.deferredVariance,
2796
+ state: MutableRef.make(deferred.pending<A, E>([])),
2797
+ commit() {
2798
+ return deferredAwait(this)
2799
+ },
2800
+ blockingOn: fiberId
2797
2801
  }
2798
- })
2802
+ return _deferred
2803
+ }
2799
2804
 
2800
2805
  /* @internal */
2801
2806
  export const deferredMake = <A, E = never>(): Effect.Effect<Deferred.Deferred<A, E>> =>
@@ -2966,7 +2971,7 @@ const deferredInterruptJoiner = <A, E>(
2966
2971
  // Context
2967
2972
  // -----------------------------------------------------------------------------
2968
2973
 
2969
- const constContext = fiberRefGet(currentContext)
2974
+ const constContext = withFiberRuntime((fiber) => exitSucceed(fiber.currentContext))
2970
2975
 
2971
2976
  /* @internal */
2972
2977
  export const context = <R>(): Effect.Effect<Context.Context<R>, never, R> => constContext as any
@@ -3021,9 +3026,7 @@ export const mapInputContext = dual<
3021
3026
 
3022
3027
  /** @internal */
3023
3028
  export const currentSpanFromFiber = <A, E>(fiber: Fiber.RuntimeFiber<A, E>): Option.Option<Tracer.Span> => {
3024
- const span = fiber.getFiberRef(currentContext).unsafeMap.get(internalTracer.spanTag.key) as
3025
- | Tracer.AnySpan
3026
- | undefined
3029
+ const span = fiber.currentSpan
3027
3030
  return span !== undefined && span._tag === "Span" ? Option.some(span) : Option.none()
3028
3031
  }
3029
3032
 
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-console */
1
2
  import type * as Console from "../../Console.js"
2
3
  import * as Context from "../../Context.js"
3
4
  import * as core from "../core.js"
@@ -47,9 +47,14 @@ export const sleep = (duration: Duration.DurationInput): Effect.Effect<void> =>
47
47
  return clockWith((clock) => clock.sleep(decodedDuration))
48
48
  }
49
49
 
50
+ /** @internal */
51
+ export const defaultServicesWith = <A, E, R>(
52
+ f: (services: Context.Context<DefaultServices.DefaultServices>) => Effect.Effect<A, E, R>
53
+ ) => core.withFiberRuntime<A, E, R>((fiber) => f(fiber.currentDefaultServices))
54
+
50
55
  /** @internal */
51
56
  export const clockWith = <A, E, R>(f: (clock: Clock.Clock) => Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
52
- core.fiberRefGetWith(currentServices, (services) => f(Context.get(services, clock.clockTag)))
57
+ defaultServicesWith((services) => f(services.unsafeMap.get(clock.clockTag.key)))
53
58
 
54
59
  /** @internal */
55
60
  export const currentTimeMillis: Effect.Effect<number> = clockWith((clock) => clock.currentTimeMillis)
@@ -83,10 +88,7 @@ export const withConfigProvider = dual<
83
88
  export const configProviderWith = <A, E, R>(
84
89
  f: (configProvider: ConfigProvider.ConfigProvider) => Effect.Effect<A, E, R>
85
90
  ): Effect.Effect<A, E, R> =>
86
- core.fiberRefGetWith(
87
- currentServices,
88
- (services) => f(Context.get(services, configProvider.configProviderTag))
89
- )
91
+ defaultServicesWith((services) => f(services.unsafeMap.get(configProvider.configProviderTag.key)))
90
92
 
91
93
  /** @internal */
92
94
  export const config = <A>(config: Config.Config<A>) => configProviderWith((_) => _.load(config))
@@ -98,10 +100,7 @@ export const configOrDie = <A>(config: Config.Config<A>) => core.orDie(configPro
98
100
 
99
101
  /** @internal */
100
102
  export const randomWith = <A, E, R>(f: (random: Random.Random) => Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
101
- core.fiberRefGetWith(
102
- currentServices,
103
- (services) => f(Context.get(services, random.randomTag))
104
- )
103
+ defaultServicesWith((services) => f(services.unsafeMap.get(random.randomTag.key)))
105
104
 
106
105
  /** @internal */
107
106
  export const withRandom = dual<
@@ -151,7 +150,7 @@ export const choice = <Self extends Iterable<unknown>>(
151
150
 
152
151
  /** @internal */
153
152
  export const tracerWith = <A, E, R>(f: (tracer: Tracer.Tracer) => Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
154
- core.fiberRefGetWith(currentServices, (services) => f(Context.get(services, tracer.tracerTag)))
153
+ defaultServicesWith((services) => f(services.unsafeMap.get(tracer.tracerTag.key)))
155
154
 
156
155
  /** @internal */
157
156
  export const withTracer = dual<
@@ -2,6 +2,7 @@ import type * as Cause from "../../Cause.js"
2
2
  import type * as Deferred from "../../Deferred.js"
3
3
  import * as Duration from "../../Duration.js"
4
4
  import type * as Effect from "../../Effect.js"
5
+ import * as Effectable from "../../Effectable.js"
5
6
  import * as Equal from "../../Equal.js"
6
7
  import type { Equivalence } from "../../Equivalence.js"
7
8
  import * as Exit from "../../Exit.js"
@@ -92,6 +93,17 @@ class Semaphore {
92
93
  (permits) => fiberRuntime.ensuring(restore(self), this.release(permits))
93
94
  )
94
95
  )
96
+
97
+ readonly withPermitsIfAvailable = (n: number) => <A, E, R>(self: Effect.Effect<A, E, R>) =>
98
+ core.uninterruptibleMask((restore) =>
99
+ core.suspend(() => {
100
+ if (this.free < n) {
101
+ return effect.succeedNone
102
+ }
103
+ this.taken += n
104
+ return fiberRuntime.ensuring(restore(effect.asSome(self)), this.release(n))
105
+ })
106
+ )
95
107
  }
96
108
 
97
109
  /** @internal */
@@ -100,6 +112,67 @@ export const unsafeMakeSemaphore = (permits: number): Semaphore => new Semaphore
100
112
  /** @internal */
101
113
  export const makeSemaphore = (permits: number) => core.sync(() => unsafeMakeSemaphore(permits))
102
114
 
115
+ class Latch implements Effect.Latch {
116
+ waiters: Array<(_: Effect.Effect<void>) => void> = []
117
+ scheduled = false
118
+ constructor(private isOpen: boolean) {}
119
+
120
+ private unsafeSchedule(fiber: Fiber.RuntimeFiber<void>) {
121
+ if (this.scheduled || this.waiters.length === 0) {
122
+ return core.void
123
+ }
124
+ this.scheduled = true
125
+ fiber.currentScheduler.scheduleTask(this.flushWaiters, fiber.getFiberRef(core.currentSchedulingPriority))
126
+ return core.void
127
+ }
128
+ private flushWaiters = () => {
129
+ this.scheduled = false
130
+ const waiters = this.waiters
131
+ this.waiters = []
132
+ for (let i = 0; i < waiters.length; i++) {
133
+ waiters[i](core.exitVoid)
134
+ }
135
+ }
136
+
137
+ open = core.withFiberRuntime<void>((fiber) => {
138
+ if (this.isOpen) {
139
+ return core.void
140
+ }
141
+ this.isOpen = true
142
+ return this.unsafeSchedule(fiber)
143
+ })
144
+ release = core.withFiberRuntime<void>((fiber) => {
145
+ if (this.isOpen) {
146
+ return core.void
147
+ }
148
+ return this.unsafeSchedule(fiber)
149
+ })
150
+ await = core.unsafeAsync<void>((resume) => {
151
+ if (this.isOpen) {
152
+ return resume(core.void)
153
+ }
154
+ this.waiters.push(resume)
155
+ return core.sync(() => {
156
+ const index = this.waiters.indexOf(resume)
157
+ if (index !== -1) {
158
+ this.waiters.splice(index, 1)
159
+ }
160
+ })
161
+ })
162
+ close = core.sync(() => {
163
+ this.isOpen = false
164
+ })
165
+ whenOpen = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> => {
166
+ return core.zipRight(this.await, self)
167
+ }
168
+ }
169
+
170
+ /** @internal */
171
+ export const unsafeMakeLatch = (open?: boolean | undefined): Effect.Latch => new Latch(open ?? false)
172
+
173
+ /** @internal */
174
+ export const makeLatch = (open?: boolean | undefined) => core.sync(() => unsafeMakeLatch(open))
175
+
103
176
  /** @internal */
104
177
  export const awaitAllChildren = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
105
178
  ensuringChildren(self, fiberRuntime.fiberAwaitAll)
@@ -571,18 +644,21 @@ export const synchronizedVariance = {
571
644
  }
572
645
 
573
646
  /** @internal */
574
- class SynchronizedImpl<in out A> implements Synchronized.SynchronizedRef<A> {
647
+ class SynchronizedImpl<in out A> extends Effectable.Class<A> implements Synchronized.SynchronizedRef<A> {
575
648
  readonly [SynchronizedTypeId] = synchronizedVariance
576
649
  readonly [internalRef.RefTypeId] = internalRef.refVariance
577
- readonly [Readable.TypeId]: Readable.TypeId
650
+ readonly [Readable.TypeId]: Readable.TypeId = Readable.TypeId
578
651
  constructor(
579
652
  readonly ref: Ref.Ref<A>,
580
653
  readonly withLock: <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
581
654
  ) {
582
- this[Readable.TypeId] = Readable.TypeId
655
+ super()
583
656
  this.get = internalRef.get(this.ref)
584
657
  }
585
658
  readonly get: Effect.Effect<A>
659
+ commit() {
660
+ return this.get
661
+ }
586
662
  modify<B>(f: (a: A) => readonly [B, A]): Effect.Effect<B> {
587
663
  return this.modifyEffect((a) => core.succeed(f(a)))
588
664
  }
@@ -594,9 +670,6 @@ class SynchronizedImpl<in out A> implements Synchronized.SynchronizedRef<A> {
594
670
  )
595
671
  )
596
672
  }
597
- pipe() {
598
- return pipeArguments(this, arguments)
599
- }
600
673
  }
601
674
 
602
675
  /** @internal */
@@ -664,6 +737,10 @@ export const zipWithFiber = dual<
664
737
  f: (a: A, b: B) => C
665
738
  ) => Fiber.Fiber<C, E | E2>
666
739
  >(3, (self, that, f) => ({
740
+ ...Effectable.CommitPrototype,
741
+ commit() {
742
+ return internalFiber.join(this)
743
+ },
667
744
  [internalFiber.FiberTypeId]: internalFiber.fiberVariance,
668
745
  id: () => pipe(self.id(), FiberId.getOrElse(that.id())),
669
746
  await: pipe(
@@ -14,6 +14,7 @@ import * as order from "../Order.js"
14
14
  import { pipeArguments } from "../Pipeable.js"
15
15
  import { hasProperty } from "../Predicate.js"
16
16
  import * as core from "./core.js"
17
+ import * as effectable from "./effectable.js"
17
18
  import * as fiberScope from "./fiberScope.js"
18
19
  import * as runtimeFlags from "./runtimeFlags.js"
19
20
 
@@ -76,15 +77,23 @@ export const children = <A, E>(
76
77
  ): Effect.Effect<Array<Fiber.RuntimeFiber<any, any>>> => self.children
77
78
 
78
79
  /** @internal */
79
- export const done = <A, E>(exit: Exit.Exit<A, E>): Fiber.Fiber<A, E> => ({
80
- ...fiberProto,
81
- id: () => FiberId.none,
82
- await: core.succeed(exit),
83
- children: core.succeed([]),
84
- inheritAll: core.void,
85
- poll: core.succeed(Option.some(exit)),
86
- interruptAsFork: () => core.void
87
- })
80
+ export const done = <A, E>(exit: Exit.Exit<A, E>): Fiber.Fiber<A, E> => {
81
+ const _fiber = {
82
+ ...effectable.CommitPrototype,
83
+ commit() {
84
+ return join(this)
85
+ },
86
+ ...fiberProto,
87
+ id: () => FiberId.none,
88
+ await: core.succeed(exit),
89
+ children: core.succeed([]),
90
+ inheritAll: core.void,
91
+ poll: core.succeed(Option.some(exit)),
92
+ interruptAsFork: () => core.void
93
+ }
94
+
95
+ return _fiber
96
+ }
88
97
 
89
98
  /** @internal */
90
99
  export const dump = <A, E>(self: Fiber.RuntimeFiber<A, E>): Effect.Effect<Fiber.Fiber.Dump> =>
@@ -148,25 +157,32 @@ export const map = dual<
148
157
  export const mapEffect = dual<
149
158
  <A, A2, E2>(f: (a: A) => Effect.Effect<A2, E2>) => <E>(self: Fiber.Fiber<A, E>) => Fiber.Fiber<A2, E | E2>,
150
159
  <A, E, A2, E2>(self: Fiber.Fiber<A, E>, f: (a: A) => Effect.Effect<A2, E2>) => Fiber.Fiber<A2, E | E2>
151
- >(2, (self, f) => ({
152
- ...fiberProto,
153
- id: () => self.id(),
154
- await: core.flatMap(self.await, Exit.forEachEffect(f)),
155
- children: self.children,
156
- inheritAll: self.inheritAll,
157
- poll: core.flatMap(self.poll, (result) => {
158
- switch (result._tag) {
159
- case "None":
160
- return core.succeed(Option.none())
161
- case "Some":
162
- return pipe(
163
- Exit.forEachEffect(result.value, f),
164
- core.map(Option.some)
165
- )
166
- }
167
- }),
168
- interruptAsFork: (id) => self.interruptAsFork(id)
169
- }))
160
+ >(2, (self, f) => {
161
+ const _fiber = {
162
+ ...effectable.CommitPrototype,
163
+ commit() {
164
+ return join(this)
165
+ },
166
+ ...fiberProto,
167
+ id: () => self.id(),
168
+ await: core.flatMap(self.await, Exit.forEachEffect(f)),
169
+ children: self.children,
170
+ inheritAll: self.inheritAll,
171
+ poll: core.flatMap(self.poll, (result) => {
172
+ switch (result._tag) {
173
+ case "None":
174
+ return core.succeed(Option.none())
175
+ case "Some":
176
+ return pipe(
177
+ Exit.forEachEffect(result.value, f),
178
+ core.map(Option.some)
179
+ )
180
+ }
181
+ }),
182
+ interruptAsFork: (id: FiberId.FiberId) => self.interruptAsFork(id)
183
+ }
184
+ return _fiber
185
+ })
170
186
 
171
187
  /** @internal */
172
188
  export const mapFiber = dual<
@@ -212,7 +228,11 @@ export const match = dual<
212
228
  })
213
229
 
214
230
  /** @internal */
215
- export const never: Fiber.Fiber<never> = {
231
+ const _never = {
232
+ ...effectable.CommitPrototype,
233
+ commit() {
234
+ return join(this)
235
+ },
216
236
  ...fiberProto,
217
237
  id: () => FiberId.none,
218
238
  await: core.never,
@@ -222,11 +242,18 @@ export const never: Fiber.Fiber<never> = {
222
242
  interruptAsFork: () => core.never
223
243
  }
224
244
 
245
+ /** @internal */
246
+ export const never: Fiber.Fiber<never> = _never
247
+
225
248
  /** @internal */
226
249
  export const orElse = dual<
227
250
  <A2, E2>(that: Fiber.Fiber<A2, E2>) => <A, E>(self: Fiber.Fiber<A, E>) => Fiber.Fiber<A | A2, E | E2>,
228
251
  <A, E, A2, E2>(self: Fiber.Fiber<A, E>, that: Fiber.Fiber<A2, E2>) => Fiber.Fiber<A | A2, E | E2>
229
252
  >(2, (self, that) => ({
253
+ ...effectable.CommitPrototype,
254
+ commit() {
255
+ return join(this)
256
+ },
230
257
  ...fiberProto,
231
258
  id: () => FiberId.getOrElse(self.id(), that.id()),
232
259
  await: core.zipWith(
@@ -33,8 +33,7 @@ export class FiberRefsImpl implements FiberRefs.FiberRefs {
33
33
  FiberRef.FiberRef<any>,
34
34
  Arr.NonEmptyReadonlyArray<readonly [FiberId.Single, any]>
35
35
  >
36
- ) {
37
- }
36
+ ) {}
38
37
  pipe() {
39
38
  return pipeArguments(this, arguments)
40
39
  }