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.
- package/ExecutionPlan/package.json +6 -0
- package/dist/cjs/Array.js +67 -5
- package/dist/cjs/Array.js.map +1 -1
- package/dist/cjs/BigDecimal.js +150 -1
- package/dist/cjs/BigDecimal.js.map +1 -1
- package/dist/cjs/Chunk.js +16 -3
- package/dist/cjs/Chunk.js.map +1 -1
- package/dist/cjs/Config.js +16 -2
- package/dist/cjs/Config.js.map +1 -1
- package/dist/cjs/Effect.js +31 -3
- package/dist/cjs/Effect.js.map +1 -1
- package/dist/cjs/ExecutionPlan.js +108 -0
- package/dist/cjs/ExecutionPlan.js.map +1 -0
- package/dist/cjs/HashMap.js +18 -1
- package/dist/cjs/HashMap.js.map +1 -1
- package/dist/cjs/Iterable.js +27 -1
- package/dist/cjs/Iterable.js.map +1 -1
- package/dist/cjs/LayerMap.js +86 -64
- package/dist/cjs/LayerMap.js.map +1 -1
- package/dist/cjs/Schedule.js +7 -1
- package/dist/cjs/Schedule.js.map +1 -1
- package/dist/cjs/Stream.js +15 -2
- package/dist/cjs/Stream.js.map +1 -1
- package/dist/cjs/index.js +4 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internal/config.js +18 -1
- package/dist/cjs/internal/config.js.map +1 -1
- package/dist/cjs/internal/effect/circular.js +1 -4
- package/dist/cjs/internal/effect/circular.js.map +1 -1
- package/dist/cjs/internal/executionPlan.js +68 -0
- package/dist/cjs/internal/executionPlan.js.map +1 -0
- package/dist/cjs/internal/hashMap.js +3 -1
- package/dist/cjs/internal/hashMap.js.map +1 -1
- package/dist/cjs/internal/metric/polling.js +3 -4
- package/dist/cjs/internal/metric/polling.js.map +1 -1
- package/dist/cjs/internal/schedule.js +66 -25
- package/dist/cjs/internal/schedule.js.map +1 -1
- package/dist/cjs/internal/stream.js +60 -10
- package/dist/cjs/internal/stream.js.map +1 -1
- package/dist/cjs/internal/version.js +1 -1
- package/dist/dts/Array.d.ts +110 -0
- package/dist/dts/Array.d.ts.map +1 -1
- package/dist/dts/BigDecimal.d.ts +235 -0
- package/dist/dts/BigDecimal.d.ts.map +1 -1
- package/dist/dts/Chunk.d.ts +13 -0
- package/dist/dts/Chunk.d.ts.map +1 -1
- package/dist/dts/Config.d.ts +38 -1
- package/dist/dts/Config.d.ts.map +1 -1
- package/dist/dts/Effect.d.ts +99 -27
- package/dist/dts/Effect.d.ts.map +1 -1
- package/dist/dts/ExecutionPlan.d.ts +213 -0
- package/dist/dts/ExecutionPlan.d.ts.map +1 -0
- package/dist/dts/HashMap.d.ts +52 -0
- package/dist/dts/HashMap.d.ts.map +1 -1
- package/dist/dts/Iterable.d.ts +49 -0
- package/dist/dts/Iterable.d.ts.map +1 -1
- package/dist/dts/LayerMap.d.ts +79 -72
- package/dist/dts/LayerMap.d.ts.map +1 -1
- package/dist/dts/Schedule.d.ts +26 -0
- package/dist/dts/Schedule.d.ts.map +1 -1
- package/dist/dts/Stream.d.ts +57 -2
- package/dist/dts/Stream.d.ts.map +1 -1
- package/dist/dts/index.d.ts +5 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/executionPlan.d.ts +2 -0
- package/dist/dts/internal/executionPlan.d.ts.map +1 -0
- package/dist/dts/internal/hashMap.d.ts.map +1 -1
- package/dist/dts/internal/stream.d.ts.map +1 -1
- package/dist/esm/Array.js +65 -3
- package/dist/esm/Array.js.map +1 -1
- package/dist/esm/BigDecimal.js +148 -0
- package/dist/esm/BigDecimal.js.map +1 -1
- package/dist/esm/Chunk.js +15 -2
- package/dist/esm/Chunk.js.map +1 -1
- package/dist/esm/Config.js +15 -1
- package/dist/esm/Config.js.map +1 -1
- package/dist/esm/Effect.js +29 -1
- package/dist/esm/Effect.js.map +1 -1
- package/dist/esm/ExecutionPlan.js +99 -0
- package/dist/esm/ExecutionPlan.js.map +1 -0
- package/dist/esm/HashMap.js +17 -0
- package/dist/esm/HashMap.js.map +1 -1
- package/dist/esm/Iterable.js +26 -0
- package/dist/esm/Iterable.js.map +1 -1
- package/dist/esm/LayerMap.js +86 -64
- package/dist/esm/LayerMap.js.map +1 -1
- package/dist/esm/Schedule.js +5 -0
- package/dist/esm/Schedule.js.map +1 -1
- package/dist/esm/Stream.js +13 -0
- package/dist/esm/Stream.js.map +1 -1
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/config.js +16 -0
- package/dist/esm/internal/config.js.map +1 -1
- package/dist/esm/internal/effect/circular.js +0 -3
- package/dist/esm/internal/effect/circular.js.map +1 -1
- package/dist/esm/internal/executionPlan.js +59 -0
- package/dist/esm/internal/executionPlan.js.map +1 -0
- package/dist/esm/internal/hashMap.js +2 -0
- package/dist/esm/internal/hashMap.js.map +1 -1
- package/dist/esm/internal/metric/polling.js +3 -4
- package/dist/esm/internal/metric/polling.js.map +1 -1
- package/dist/esm/internal/schedule.js +61 -23
- package/dist/esm/internal/schedule.js.map +1 -1
- package/dist/esm/internal/stream.js +57 -7
- package/dist/esm/internal/stream.js.map +1 -1
- package/dist/esm/internal/version.js +1 -1
- package/package.json +9 -1
- package/src/Array.ts +147 -4
- package/src/BigDecimal.ts +355 -0
- package/src/Chunk.ts +28 -3
- package/src/Config.ts +40 -1
- package/src/Effect.ts +145 -36
- package/src/ExecutionPlan.ts +302 -0
- package/src/HashMap.ts +56 -0
- package/src/Iterable.ts +66 -0
- package/src/LayerMap.ts +126 -114
- package/src/Schedule.ts +32 -0
- package/src/Stream.ts +51 -2
- package/src/index.ts +6 -0
- package/src/internal/config.ts +55 -0
- package/src/internal/effect/circular.ts +0 -15
- package/src/internal/executionPlan.ts +114 -0
- package/src/internal/hashMap.ts +6 -0
- package/src/internal/metric/polling.ts +3 -4
- package/src/internal/schedule.ts +169 -50
- package/src/internal/stream.ts +140 -15
- package/src/internal/version.ts +1 -1
package/src/internal/stream.ts
CHANGED
|
@@ -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
|
-
|
|
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: () =>
|
|
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
|
-
<
|
|
5436
|
-
|
|
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,
|
|
5462
|
+
<A, E, R, X, R2>(
|
|
5439
5463
|
self: Stream.Stream<A, E, R>,
|
|
5440
|
-
|
|
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,
|
|
5468
|
+
<A, E, R, X, R2>(
|
|
5445
5469
|
self: Stream.Stream<A, E, R>,
|
|
5446
|
-
|
|
5447
|
-
): Stream.Stream<A, E,
|
|
5448
|
-
Schedule.driver(
|
|
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
|
-
|
|
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
|
|
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>(
|
package/src/internal/version.ts
CHANGED