effect 3.15.4 → 3.16.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 (128) hide show
  1. package/ExecutionPlan/package.json +6 -0
  2. package/dist/cjs/Array.js +67 -5
  3. package/dist/cjs/Array.js.map +1 -1
  4. package/dist/cjs/BigDecimal.js +150 -1
  5. package/dist/cjs/BigDecimal.js.map +1 -1
  6. package/dist/cjs/Chunk.js +16 -3
  7. package/dist/cjs/Chunk.js.map +1 -1
  8. package/dist/cjs/Config.js +16 -2
  9. package/dist/cjs/Config.js.map +1 -1
  10. package/dist/cjs/Effect.js +31 -3
  11. package/dist/cjs/Effect.js.map +1 -1
  12. package/dist/cjs/ExecutionPlan.js +108 -0
  13. package/dist/cjs/ExecutionPlan.js.map +1 -0
  14. package/dist/cjs/HashMap.js +18 -1
  15. package/dist/cjs/HashMap.js.map +1 -1
  16. package/dist/cjs/Iterable.js +27 -1
  17. package/dist/cjs/Iterable.js.map +1 -1
  18. package/dist/cjs/LayerMap.js +86 -64
  19. package/dist/cjs/LayerMap.js.map +1 -1
  20. package/dist/cjs/Schedule.js +7 -1
  21. package/dist/cjs/Schedule.js.map +1 -1
  22. package/dist/cjs/Stream.js +15 -2
  23. package/dist/cjs/Stream.js.map +1 -1
  24. package/dist/cjs/index.js +4 -2
  25. package/dist/cjs/index.js.map +1 -1
  26. package/dist/cjs/internal/config.js +18 -1
  27. package/dist/cjs/internal/config.js.map +1 -1
  28. package/dist/cjs/internal/effect/circular.js +1 -4
  29. package/dist/cjs/internal/effect/circular.js.map +1 -1
  30. package/dist/cjs/internal/executionPlan.js +68 -0
  31. package/dist/cjs/internal/executionPlan.js.map +1 -0
  32. package/dist/cjs/internal/hashMap.js +3 -1
  33. package/dist/cjs/internal/hashMap.js.map +1 -1
  34. package/dist/cjs/internal/metric/polling.js +3 -4
  35. package/dist/cjs/internal/metric/polling.js.map +1 -1
  36. package/dist/cjs/internal/schedule.js +66 -25
  37. package/dist/cjs/internal/schedule.js.map +1 -1
  38. package/dist/cjs/internal/stream.js +60 -10
  39. package/dist/cjs/internal/stream.js.map +1 -1
  40. package/dist/cjs/internal/version.js +1 -1
  41. package/dist/dts/Array.d.ts +110 -0
  42. package/dist/dts/Array.d.ts.map +1 -1
  43. package/dist/dts/BigDecimal.d.ts +235 -0
  44. package/dist/dts/BigDecimal.d.ts.map +1 -1
  45. package/dist/dts/Chunk.d.ts +13 -0
  46. package/dist/dts/Chunk.d.ts.map +1 -1
  47. package/dist/dts/Config.d.ts +38 -1
  48. package/dist/dts/Config.d.ts.map +1 -1
  49. package/dist/dts/Effect.d.ts +99 -27
  50. package/dist/dts/Effect.d.ts.map +1 -1
  51. package/dist/dts/ExecutionPlan.d.ts +213 -0
  52. package/dist/dts/ExecutionPlan.d.ts.map +1 -0
  53. package/dist/dts/HashMap.d.ts +52 -0
  54. package/dist/dts/HashMap.d.ts.map +1 -1
  55. package/dist/dts/Iterable.d.ts +49 -0
  56. package/dist/dts/Iterable.d.ts.map +1 -1
  57. package/dist/dts/LayerMap.d.ts +79 -72
  58. package/dist/dts/LayerMap.d.ts.map +1 -1
  59. package/dist/dts/Schedule.d.ts +26 -0
  60. package/dist/dts/Schedule.d.ts.map +1 -1
  61. package/dist/dts/Stream.d.ts +57 -2
  62. package/dist/dts/Stream.d.ts.map +1 -1
  63. package/dist/dts/index.d.ts +5 -0
  64. package/dist/dts/index.d.ts.map +1 -1
  65. package/dist/dts/internal/executionPlan.d.ts +2 -0
  66. package/dist/dts/internal/executionPlan.d.ts.map +1 -0
  67. package/dist/dts/internal/hashMap.d.ts.map +1 -1
  68. package/dist/dts/internal/stream.d.ts.map +1 -1
  69. package/dist/esm/Array.js +65 -3
  70. package/dist/esm/Array.js.map +1 -1
  71. package/dist/esm/BigDecimal.js +148 -0
  72. package/dist/esm/BigDecimal.js.map +1 -1
  73. package/dist/esm/Chunk.js +15 -2
  74. package/dist/esm/Chunk.js.map +1 -1
  75. package/dist/esm/Config.js +15 -1
  76. package/dist/esm/Config.js.map +1 -1
  77. package/dist/esm/Effect.js +29 -1
  78. package/dist/esm/Effect.js.map +1 -1
  79. package/dist/esm/ExecutionPlan.js +99 -0
  80. package/dist/esm/ExecutionPlan.js.map +1 -0
  81. package/dist/esm/HashMap.js +17 -0
  82. package/dist/esm/HashMap.js.map +1 -1
  83. package/dist/esm/Iterable.js +26 -0
  84. package/dist/esm/Iterable.js.map +1 -1
  85. package/dist/esm/LayerMap.js +86 -64
  86. package/dist/esm/LayerMap.js.map +1 -1
  87. package/dist/esm/Schedule.js +5 -0
  88. package/dist/esm/Schedule.js.map +1 -1
  89. package/dist/esm/Stream.js +13 -0
  90. package/dist/esm/Stream.js.map +1 -1
  91. package/dist/esm/index.js +5 -0
  92. package/dist/esm/index.js.map +1 -1
  93. package/dist/esm/internal/config.js +16 -0
  94. package/dist/esm/internal/config.js.map +1 -1
  95. package/dist/esm/internal/effect/circular.js +0 -3
  96. package/dist/esm/internal/effect/circular.js.map +1 -1
  97. package/dist/esm/internal/executionPlan.js +59 -0
  98. package/dist/esm/internal/executionPlan.js.map +1 -0
  99. package/dist/esm/internal/hashMap.js +2 -0
  100. package/dist/esm/internal/hashMap.js.map +1 -1
  101. package/dist/esm/internal/metric/polling.js +3 -4
  102. package/dist/esm/internal/metric/polling.js.map +1 -1
  103. package/dist/esm/internal/schedule.js +61 -23
  104. package/dist/esm/internal/schedule.js.map +1 -1
  105. package/dist/esm/internal/stream.js +57 -7
  106. package/dist/esm/internal/stream.js.map +1 -1
  107. package/dist/esm/internal/version.js +1 -1
  108. package/package.json +9 -1
  109. package/src/Array.ts +147 -4
  110. package/src/BigDecimal.ts +355 -0
  111. package/src/Chunk.ts +28 -3
  112. package/src/Config.ts +40 -1
  113. package/src/Effect.ts +145 -36
  114. package/src/ExecutionPlan.ts +302 -0
  115. package/src/HashMap.ts +56 -0
  116. package/src/Iterable.ts +66 -0
  117. package/src/LayerMap.ts +126 -114
  118. package/src/Schedule.ts +32 -0
  119. package/src/Stream.ts +51 -2
  120. package/src/index.ts +6 -0
  121. package/src/internal/config.ts +55 -0
  122. package/src/internal/effect/circular.ts +0 -15
  123. package/src/internal/executionPlan.ts +114 -0
  124. package/src/internal/hashMap.ts +6 -0
  125. package/src/internal/metric/polling.ts +3 -4
  126. package/src/internal/schedule.ts +169 -50
  127. package/src/internal/stream.ts +140 -15
  128. package/src/internal/version.ts +1 -1
@@ -8,11 +8,13 @@ import * as Duration from "../Duration.js"
8
8
  import * as Effect from "../Effect.js"
9
9
  import * as Either from "../Either.js"
10
10
  import * as Equal from "../Equal.js"
11
+ import type { ExecutionPlan } from "../ExecutionPlan.js"
11
12
  import * as Exit from "../Exit.js"
12
13
  import * as Fiber from "../Fiber.js"
13
14
  import * as FiberRef from "../FiberRef.js"
14
15
  import type { LazyArg } from "../Function.js"
15
16
  import { constTrue, dual, identity, pipe } from "../Function.js"
17
+ import * as internalExecutionPlan from "../internal/executionPlan.js"
16
18
  import * as Layer from "../Layer.js"
17
19
  import * as MergeDecision from "../MergeDecision.js"
18
20
  import * as Option from "../Option.js"
@@ -42,6 +44,7 @@ import * as MergeStrategy from "./channel/mergeStrategy.js"
42
44
  import * as core from "./core-stream.js"
43
45
  import * as doNotation from "./doNotation.js"
44
46
  import { RingBuffer } from "./ringBuffer.js"
47
+ import * as InternalSchedule from "./schedule.js"
45
48
  import * as sink_ from "./sink.js"
46
49
  import * as DebounceState from "./stream/debounceState.js"
47
50
  import * as emit from "./stream/emit.js"
@@ -4848,6 +4851,16 @@ export const provideContext = dual<
4848
4851
  new StreamImpl(pipe(toChannel(self), core.provideContext(context)))
4849
4852
  )
4850
4853
 
4854
+ /** @internal */
4855
+ export const provideSomeContext = dual<
4856
+ <R2>(context: Context.Context<R2>) => <A, E, R>(self: Stream.Stream<A, E, R>) => Stream.Stream<A, E, Exclude<R, R2>>,
4857
+ <A, E, R, R2>(self: Stream.Stream<A, E, R>, context: Context.Context<R2>) => Stream.Stream<A, E, Exclude<R, R2>>
4858
+ >(
4859
+ 2,
4860
+ <A, E, R, R2>(self: Stream.Stream<A, E, R>, context: Context.Context<R2>): Stream.Stream<A, E, Exclude<R, R2>> =>
4861
+ mapInputContext(self as any, Context.merge(context))
4862
+ )
4863
+
4851
4864
  /** @internal */
4852
4865
  export const provideLayer = dual<
4853
4866
  <RIn, E2, ROut>(
@@ -5382,8 +5395,13 @@ export const repeatWith = dual<
5382
5395
  return pipe(
5383
5396
  Schedule.driver(schedule),
5384
5397
  Effect.map((driver) => {
5398
+ const provideLastIterationInfo = provideServiceEffect(
5399
+ Schedule.CurrentIterationMetadata,
5400
+ Ref.get(driver.iterationMeta)
5401
+ )
5402
+
5385
5403
  const scheduleOutput = pipe(driver.last, Effect.orDie, Effect.map(options.onSchedule))
5386
- const process = pipe(self, map(options.onElement), toChannel)
5404
+ const process = pipe(self, provideLastIterationInfo, map(options.onElement), toChannel)
5387
5405
  const loop: Channel.Channel<Chunk.Chunk<C>, unknown, E, unknown, void, unknown, R | R2> = channel.unwrap(
5388
5406
  Effect.match(driver.next(void 0), {
5389
5407
  onFailure: () => core.void,
@@ -5419,34 +5437,45 @@ export const repeatEffectWithSchedule = <A, E, R, X, A0 extends A, R2>(
5419
5437
  ): Stream.Stream<A, E, R | R2> =>
5420
5438
  flatMap(
5421
5439
  fromEffect(Effect.zip(effect, Schedule.driver(schedule))),
5422
- ([a, driver]) =>
5423
- concat(
5440
+ ([a, driver]) => {
5441
+ const provideLastIterationInfo = Effect.provideServiceEffect(
5442
+ Schedule.CurrentIterationMetadata,
5443
+ Ref.get(driver.iterationMeta)
5444
+ )
5445
+ return concat(
5424
5446
  succeed(a),
5425
5447
  unfoldEffect(a, (s) =>
5426
5448
  Effect.matchEffect(driver.next(s as A0), {
5427
5449
  onFailure: Effect.succeed,
5428
- onSuccess: () => Effect.map(effect, (nextA) => Option.some([nextA, nextA] as const))
5450
+ onSuccess: () =>
5451
+ Effect.map(provideLastIterationInfo(effect), (nextA) => Option.some([nextA, nextA] as const))
5429
5452
  }))
5430
5453
  )
5454
+ }
5431
5455
  )
5432
5456
 
5433
5457
  /** @internal */
5434
5458
  export const retry = dual<
5435
- <E0 extends E, R2, E, X>(
5436
- schedule: Schedule.Schedule<X, E0, R2>
5459
+ <E, R2, X>(
5460
+ policy: Schedule.Schedule<X, Types.NoInfer<E>, R2>
5437
5461
  ) => <A, R>(self: Stream.Stream<A, E, R>) => Stream.Stream<A, E, R2 | R>,
5438
- <A, E, R, X, E0 extends E, R2>(
5462
+ <A, E, R, X, R2>(
5439
5463
  self: Stream.Stream<A, E, R>,
5440
- schedule: Schedule.Schedule<X, E0, R2>
5464
+ policy: Schedule.Schedule<X, Types.NoInfer<E>, R2>
5441
5465
  ) => Stream.Stream<A, E, R2 | R>
5442
5466
  >(
5443
5467
  2,
5444
- <A, E, R, X, E0 extends E, R2>(
5468
+ <A, E, R, X, R2>(
5445
5469
  self: Stream.Stream<A, E, R>,
5446
- schedule: Schedule.Schedule<X, E0, R2>
5447
- ): Stream.Stream<A, E, R | R2> =>
5448
- Schedule.driver(schedule).pipe(
5470
+ policy: Schedule.Schedule<X, Types.NoInfer<E>, R2>
5471
+ ): Stream.Stream<A, E, R2 | R> =>
5472
+ Schedule.driver(policy).pipe(
5449
5473
  Effect.map((driver) => {
5474
+ const provideLastIterationInfo = provideServiceEffect(
5475
+ Schedule.CurrentIterationMetadata,
5476
+ Ref.get(driver.iterationMeta)
5477
+ )
5478
+
5450
5479
  const loop: Channel.Channel<
5451
5480
  Chunk.Chunk<A>,
5452
5481
  unknown,
@@ -5454,11 +5483,11 @@ export const retry = dual<
5454
5483
  unknown,
5455
5484
  unknown,
5456
5485
  unknown,
5457
- R | R2
5458
- > = toChannel(self).pipe(
5486
+ R2 | R
5487
+ > = toChannel(provideLastIterationInfo(self)).pipe(
5459
5488
  channel.mapOutEffect((out) => Effect.as(driver.reset, out)),
5460
5489
  channel.catchAll((error) =>
5461
- driver.next(error as E0).pipe(
5490
+ driver.next(error).pipe(
5462
5491
  Effect.match({
5463
5492
  onFailure: () => core.fail(error),
5464
5493
  onSuccess: () => loop
@@ -5474,6 +5503,102 @@ export const retry = dual<
5474
5503
  )
5475
5504
  )
5476
5505
 
5506
+ /** @internal */
5507
+ export const withExecutionPlan: {
5508
+ <Input, R2, Provides, PolicyE>(
5509
+ policy: ExecutionPlan<{
5510
+ provides: Provides
5511
+ input: Input
5512
+ error: PolicyE
5513
+ requirements: R2
5514
+ }>,
5515
+ options?: {
5516
+ readonly preventFallbackOnPartialStream?: boolean | undefined
5517
+ }
5518
+ ): <A, E extends Input, R>(
5519
+ self: Stream.Stream<A, E, R>
5520
+ ) => Stream.Stream<A, E | PolicyE, R2 | Exclude<R, Provides>>
5521
+ <A, E extends Input, R, R2, Input, Provides, PolicyE>(
5522
+ self: Stream.Stream<A, E, R>,
5523
+ policy: ExecutionPlan<{
5524
+ provides: Provides
5525
+ input: Input
5526
+ error: PolicyE
5527
+ requirements: R2
5528
+ }>,
5529
+ options?: {
5530
+ readonly preventFallbackOnPartialStream?: boolean | undefined
5531
+ }
5532
+ ): Stream.Stream<A, E | PolicyE, R2 | Exclude<R, Provides>>
5533
+ } = dual((args) => isStream(args[0]), <A, E extends Input, R, R2, Input, Provides, PolicyE>(
5534
+ self: Stream.Stream<A, E, R>,
5535
+ policy: ExecutionPlan<{
5536
+ provides: Provides
5537
+ input: Input
5538
+ error: PolicyE
5539
+ requirements: R2
5540
+ }>,
5541
+ options?: {
5542
+ readonly preventFallbackOnPartialStream?: boolean | undefined
5543
+ }
5544
+ ): Stream.Stream<A, E | PolicyE, R2 | Exclude<R, Provides>> =>
5545
+ suspend(() => {
5546
+ const preventFallbackOnPartialStream = options?.preventFallbackOnPartialStream ?? false
5547
+ let i = 0
5548
+ let lastError = Option.none<E | PolicyE>()
5549
+ const loop: Stream.Stream<
5550
+ A,
5551
+ E | PolicyE,
5552
+ R2 | Exclude<R, Provides>
5553
+ > = suspend(() => {
5554
+ const step = policy.steps[i++]
5555
+ if (!step) {
5556
+ return fail(Option.getOrThrow(lastError))
5557
+ }
5558
+
5559
+ let nextStream: Stream.Stream<A, E | PolicyE, R2 | Exclude<R, Provides>> = Context.isContext(step.provide)
5560
+ ? provideSomeContext(self, step.provide)
5561
+ : provideSomeLayer(self, step.provide as Layer.Layer<Provides, E | PolicyE, R2>)
5562
+ let receivedElements = false
5563
+
5564
+ if (Option.isSome(lastError)) {
5565
+ const error = lastError.value
5566
+ let attempted = false
5567
+ const wrapped = nextStream
5568
+ // ensure the schedule is applied at least once
5569
+ nextStream = suspend(() => {
5570
+ if (attempted) return wrapped
5571
+ attempted = true
5572
+ return fail(error)
5573
+ })
5574
+ nextStream = scheduleDefectRefail(retry(nextStream, internalExecutionPlan.scheduleFromStep(step, false)!))
5575
+ } else {
5576
+ const schedule = internalExecutionPlan.scheduleFromStep(step, true)
5577
+ nextStream = schedule ? scheduleDefectRefail(retry(nextStream, schedule)) : nextStream
5578
+ }
5579
+
5580
+ return catchAll(
5581
+ preventFallbackOnPartialStream ?
5582
+ mapChunks(nextStream, (chunk) => {
5583
+ receivedElements = true
5584
+ return chunk
5585
+ }) :
5586
+ nextStream,
5587
+ (error) => {
5588
+ if (preventFallbackOnPartialStream && receivedElements) {
5589
+ return fail(error)
5590
+ }
5591
+ lastError = Option.some(error)
5592
+ return loop
5593
+ }
5594
+ )
5595
+ })
5596
+ return loop
5597
+ }))
5598
+
5599
+ const scheduleDefectRefail = <A, E, R>(self: Stream.Stream<A, E, R>) =>
5600
+ catchAllCause(self, (cause) => failCause(InternalSchedule.scheduleDefectRefailCause(cause)))
5601
+
5477
5602
  /** @internal */
5478
5603
  export const run = dual<
5479
5604
  <A2, A, E2, R2>(
@@ -1,4 +1,4 @@
1
- let moduleVersion = "3.15.4"
1
+ let moduleVersion = "3.16.0"
2
2
 
3
3
  export const getCurrentVersion = () => moduleVersion
4
4