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
@@ -11,6 +11,7 @@ import * as Exit from "../Exit.js";
11
11
  import * as Fiber from "../Fiber.js";
12
12
  import * as FiberRef from "../FiberRef.js";
13
13
  import { constTrue, dual, identity, pipe } from "../Function.js";
14
+ import * as internalExecutionPlan from "../internal/executionPlan.js";
14
15
  import * as Layer from "../Layer.js";
15
16
  import * as MergeDecision from "../MergeDecision.js";
16
17
  import * as Option from "../Option.js";
@@ -32,6 +33,7 @@ import * as MergeStrategy from "./channel/mergeStrategy.js";
32
33
  import * as core from "./core-stream.js";
33
34
  import * as doNotation from "./doNotation.js";
34
35
  import { RingBuffer } from "./ringBuffer.js";
36
+ import * as InternalSchedule from "./schedule.js";
35
37
  import * as sink_ from "./sink.js";
36
38
  import * as DebounceState from "./stream/debounceState.js";
37
39
  import * as emit from "./stream/emit.js";
@@ -1487,6 +1489,8 @@ export const prepend = /*#__PURE__*/dual(2, (self, values) => new StreamImpl(cha
1487
1489
  /** @internal */
1488
1490
  export const provideContext = /*#__PURE__*/dual(2, (self, context) => new StreamImpl(pipe(toChannel(self), core.provideContext(context))));
1489
1491
  /** @internal */
1492
+ export const provideSomeContext = /*#__PURE__*/dual(2, (self, context) => mapInputContext(self, Context.merge(context)));
1493
+ /** @internal */
1490
1494
  export const provideLayer = /*#__PURE__*/dual(2, (self, layer) => new StreamImpl(channel.unwrapScopedWith(scope => Layer.buildWithScope(layer, scope).pipe(Effect.map(env => pipe(toChannel(self), core.provideContext(env)))))));
1491
1495
  /** @internal */
1492
1496
  export const provideService = /*#__PURE__*/dual(3, (self, tag, resource) => provideServiceEffect(self, tag, Effect.succeed(resource)));
@@ -1650,8 +1654,9 @@ export const repeatValue = value => new StreamImpl(channel.repeated(core.write(C
1650
1654
  /** @internal */
1651
1655
  export const repeatWith = /*#__PURE__*/dual(3, (self, schedule, options) => {
1652
1656
  return pipe(Schedule.driver(schedule), Effect.map(driver => {
1657
+ const provideLastIterationInfo = provideServiceEffect(Schedule.CurrentIterationMetadata, Ref.get(driver.iterationMeta));
1653
1658
  const scheduleOutput = pipe(driver.last, Effect.orDie, Effect.map(options.onSchedule));
1654
- const process = pipe(self, map(options.onElement), toChannel);
1659
+ const process = pipe(self, provideLastIterationInfo, map(options.onElement), toChannel);
1655
1660
  const loop = channel.unwrap(Effect.match(driver.next(void 0), {
1656
1661
  onFailure: () => core.void,
1657
1662
  onSuccess: () => pipe(process, channel.zipRight(pipe(scheduleOutput, Effect.map(c => pipe(core.write(Chunk.of(c)), core.flatMap(() => loop))), channel.unwrap)))
@@ -1661,19 +1666,64 @@ export const repeatWith = /*#__PURE__*/dual(3, (self, schedule, options) => {
1661
1666
  });
1662
1667
  const repeatWithSchedule = (value, schedule) => repeatEffectWithSchedule(Effect.succeed(value), schedule);
1663
1668
  /** @internal */
1664
- export const repeatEffectWithSchedule = (effect, schedule) => flatMap(fromEffect(Effect.zip(effect, Schedule.driver(schedule))), ([a, driver]) => concat(succeed(a), unfoldEffect(a, s => Effect.matchEffect(driver.next(s), {
1665
- onFailure: Effect.succeed,
1666
- onSuccess: () => Effect.map(effect, nextA => Option.some([nextA, nextA]))
1667
- }))));
1669
+ export const repeatEffectWithSchedule = (effect, schedule) => flatMap(fromEffect(Effect.zip(effect, Schedule.driver(schedule))), ([a, driver]) => {
1670
+ const provideLastIterationInfo = Effect.provideServiceEffect(Schedule.CurrentIterationMetadata, Ref.get(driver.iterationMeta));
1671
+ return concat(succeed(a), unfoldEffect(a, s => Effect.matchEffect(driver.next(s), {
1672
+ onFailure: Effect.succeed,
1673
+ onSuccess: () => Effect.map(provideLastIterationInfo(effect), nextA => Option.some([nextA, nextA]))
1674
+ })));
1675
+ });
1668
1676
  /** @internal */
1669
- export const retry = /*#__PURE__*/dual(2, (self, schedule) => Schedule.driver(schedule).pipe(Effect.map(driver => {
1670
- const loop = toChannel(self).pipe(channel.mapOutEffect(out => Effect.as(driver.reset, out)), channel.catchAll(error => driver.next(error).pipe(Effect.match({
1677
+ export const retry = /*#__PURE__*/dual(2, (self, policy) => Schedule.driver(policy).pipe(Effect.map(driver => {
1678
+ const provideLastIterationInfo = provideServiceEffect(Schedule.CurrentIterationMetadata, Ref.get(driver.iterationMeta));
1679
+ const loop = toChannel(provideLastIterationInfo(self)).pipe(channel.mapOutEffect(out => Effect.as(driver.reset, out)), channel.catchAll(error => driver.next(error).pipe(Effect.match({
1671
1680
  onFailure: () => core.fail(error),
1672
1681
  onSuccess: () => loop
1673
1682
  }), channel.unwrap)));
1674
1683
  return loop;
1675
1684
  }), channel.unwrap, fromChannel));
1676
1685
  /** @internal */
1686
+ export const withExecutionPlan = /*#__PURE__*/dual(args => isStream(args[0]), (self, policy, options) => suspend(() => {
1687
+ const preventFallbackOnPartialStream = options?.preventFallbackOnPartialStream ?? false;
1688
+ let i = 0;
1689
+ let lastError = Option.none();
1690
+ const loop = suspend(() => {
1691
+ const step = policy.steps[i++];
1692
+ if (!step) {
1693
+ return fail(Option.getOrThrow(lastError));
1694
+ }
1695
+ let nextStream = Context.isContext(step.provide) ? provideSomeContext(self, step.provide) : provideSomeLayer(self, step.provide);
1696
+ let receivedElements = false;
1697
+ if (Option.isSome(lastError)) {
1698
+ const error = lastError.value;
1699
+ let attempted = false;
1700
+ const wrapped = nextStream;
1701
+ // ensure the schedule is applied at least once
1702
+ nextStream = suspend(() => {
1703
+ if (attempted) return wrapped;
1704
+ attempted = true;
1705
+ return fail(error);
1706
+ });
1707
+ nextStream = scheduleDefectRefail(retry(nextStream, internalExecutionPlan.scheduleFromStep(step, false)));
1708
+ } else {
1709
+ const schedule = internalExecutionPlan.scheduleFromStep(step, true);
1710
+ nextStream = schedule ? scheduleDefectRefail(retry(nextStream, schedule)) : nextStream;
1711
+ }
1712
+ return catchAll(preventFallbackOnPartialStream ? mapChunks(nextStream, chunk => {
1713
+ receivedElements = true;
1714
+ return chunk;
1715
+ }) : nextStream, error => {
1716
+ if (preventFallbackOnPartialStream && receivedElements) {
1717
+ return fail(error);
1718
+ }
1719
+ lastError = Option.some(error);
1720
+ return loop;
1721
+ });
1722
+ });
1723
+ return loop;
1724
+ }));
1725
+ const scheduleDefectRefail = self => catchAllCause(self, cause => failCause(InternalSchedule.scheduleDefectRefailCause(cause)));
1726
+ /** @internal */
1677
1727
  export const run = /*#__PURE__*/dual(2, (self, sink) => toChannel(self).pipe(channel.pipeToOrFail(sink_.toChannel(sink)), channel.runDrain));
1678
1728
  /** @internal */
1679
1729
  export const runCollect = self => run(self, sink_.collectAll());