@typed/fx 2.0.0-beta.0 → 2.0.0-beta.10
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/LICENSE +21 -0
- package/README.md +58 -21
- package/dist/Fx/Fx.d.ts +371 -19
- package/dist/Fx/Fx.d.ts.map +1 -1
- package/dist/Fx/Fx.js +37 -6
- package/dist/Fx/TypeId.d.ts +52 -6
- package/dist/Fx/TypeId.d.ts.map +1 -1
- package/dist/Fx/TypeId.js +41 -4
- package/dist/Fx/combinators/additive.d.ts +245 -0
- package/dist/Fx/combinators/additive.d.ts.map +1 -0
- package/dist/Fx/combinators/additive.js +243 -0
- package/dist/Fx/combinators/catch.d.ts +246 -12
- package/dist/Fx/combinators/catch.d.ts.map +1 -1
- package/dist/Fx/combinators/catch.js +236 -12
- package/dist/Fx/combinators/causes.d.ts +25 -2
- package/dist/Fx/combinators/causes.d.ts.map +1 -1
- package/dist/Fx/combinators/causes.js +25 -2
- package/dist/Fx/combinators/changesWithEffect.d.ts +40 -0
- package/dist/Fx/combinators/changesWithEffect.d.ts.map +1 -0
- package/dist/Fx/combinators/changesWithEffect.js +48 -0
- package/dist/Fx/combinators/compact.d.ts +18 -1
- package/dist/Fx/combinators/compact.d.ts.map +1 -1
- package/dist/Fx/combinators/compact.js +18 -1
- package/dist/Fx/combinators/concatMap.d.ts +86 -0
- package/dist/Fx/combinators/concatMap.d.ts.map +1 -0
- package/dist/Fx/combinators/concatMap.js +86 -0
- package/dist/Fx/combinators/continueWith.d.ts +113 -5
- package/dist/Fx/combinators/continueWith.d.ts.map +1 -1
- package/dist/Fx/combinators/continueWith.js +113 -5
- package/dist/Fx/combinators/debounce.d.ts +34 -0
- package/dist/Fx/combinators/debounce.d.ts.map +1 -0
- package/dist/Fx/combinators/debounce.js +35 -0
- package/dist/Fx/combinators/delay.d.ts +36 -0
- package/dist/Fx/combinators/delay.d.ts.map +1 -0
- package/dist/Fx/combinators/delay.js +33 -0
- package/dist/Fx/combinators/dropUntil.d.ts +71 -0
- package/dist/Fx/combinators/dropUntil.d.ts.map +1 -0
- package/dist/Fx/combinators/dropUntil.js +65 -0
- package/dist/Fx/combinators/during.d.ts +38 -0
- package/dist/Fx/combinators/during.d.ts.map +1 -0
- package/dist/Fx/combinators/during.js +85 -0
- package/dist/Fx/combinators/ensuring.d.ts +34 -4
- package/dist/Fx/combinators/ensuring.d.ts.map +1 -1
- package/dist/Fx/combinators/ensuring.js +34 -4
- package/dist/Fx/combinators/exhaustLatestMap.d.ts +41 -5
- package/dist/Fx/combinators/exhaustLatestMap.d.ts.map +1 -1
- package/dist/Fx/combinators/exhaustLatestMap.js +41 -5
- package/dist/Fx/combinators/exhaustLatestMapEffect.d.ts +40 -4
- package/dist/Fx/combinators/exhaustLatestMapEffect.d.ts.map +1 -1
- package/dist/Fx/combinators/exhaustLatestMapEffect.js +40 -4
- package/dist/Fx/combinators/exhaustMap.d.ts +38 -1
- package/dist/Fx/combinators/exhaustMap.d.ts.map +1 -1
- package/dist/Fx/combinators/exhaustMap.js +38 -1
- package/dist/Fx/combinators/exhaustMapEffect.d.ts +33 -1
- package/dist/Fx/combinators/exhaustMapEffect.d.ts.map +1 -1
- package/dist/Fx/combinators/exhaustMapEffect.js +33 -1
- package/dist/Fx/combinators/exit.d.ts +23 -2
- package/dist/Fx/combinators/exit.d.ts.map +1 -1
- package/dist/Fx/combinators/exit.js +23 -2
- package/dist/Fx/combinators/filter.d.ts +17 -1
- package/dist/Fx/combinators/filter.d.ts.map +1 -1
- package/dist/Fx/combinators/filter.js +17 -1
- package/dist/Fx/combinators/filterEffect.d.ts +22 -1
- package/dist/Fx/combinators/filterEffect.d.ts.map +1 -1
- package/dist/Fx/combinators/filterEffect.js +22 -1
- package/dist/Fx/combinators/filterMap.d.ts +20 -1
- package/dist/Fx/combinators/filterMap.d.ts.map +1 -1
- package/dist/Fx/combinators/filterMap.js +20 -1
- package/dist/Fx/combinators/filterMapEffect.d.ts +21 -1
- package/dist/Fx/combinators/filterMapEffect.d.ts.map +1 -1
- package/dist/Fx/combinators/filterMapEffect.js +21 -1
- package/dist/Fx/combinators/filterMapLoop.d.ts +20 -1
- package/dist/Fx/combinators/filterMapLoop.d.ts.map +1 -1
- package/dist/Fx/combinators/filterMapLoop.js +20 -1
- package/dist/Fx/combinators/filterMapLoopCause.d.ts +21 -1
- package/dist/Fx/combinators/filterMapLoopCause.d.ts.map +1 -1
- package/dist/Fx/combinators/filterMapLoopCause.js +21 -1
- package/dist/Fx/combinators/filterMapLoopCauseEffect.d.ts +21 -1
- package/dist/Fx/combinators/filterMapLoopCauseEffect.d.ts.map +1 -1
- package/dist/Fx/combinators/filterMapLoopCauseEffect.js +21 -1
- package/dist/Fx/combinators/filterMapLoopEffect.d.ts +21 -1
- package/dist/Fx/combinators/filterMapLoopEffect.d.ts.map +1 -1
- package/dist/Fx/combinators/filterMapLoopEffect.js +21 -1
- package/dist/Fx/combinators/flatMap.d.ts +50 -5
- package/dist/Fx/combinators/flatMap.d.ts.map +1 -1
- package/dist/Fx/combinators/flatMap.js +36 -3
- package/dist/Fx/combinators/flatMapConcurrently.d.ts +51 -4
- package/dist/Fx/combinators/flatMapConcurrently.d.ts.map +1 -1
- package/dist/Fx/combinators/flatMapConcurrently.js +51 -4
- package/dist/Fx/combinators/flatMapConcurrentlyEffect.d.ts +48 -4
- package/dist/Fx/combinators/flatMapConcurrentlyEffect.d.ts.map +1 -1
- package/dist/Fx/combinators/flatMapConcurrentlyEffect.js +40 -2
- package/dist/Fx/combinators/flatMapEffect.d.ts +46 -4
- package/dist/Fx/combinators/flatMapEffect.d.ts.map +1 -1
- package/dist/Fx/combinators/flatMapEffect.js +32 -2
- package/dist/Fx/combinators/flip.d.ts +34 -2
- package/dist/Fx/combinators/flip.d.ts.map +1 -1
- package/dist/Fx/combinators/flip.js +34 -2
- package/dist/Fx/combinators/gen.d.ts +29 -10
- package/dist/Fx/combinators/gen.d.ts.map +1 -1
- package/dist/Fx/combinators/gen.js +28 -4
- package/dist/Fx/combinators/genScoped.d.ts +33 -10
- package/dist/Fx/combinators/genScoped.d.ts.map +1 -1
- package/dist/Fx/combinators/genScoped.js +31 -3
- package/dist/Fx/combinators/grouped.d.ts +89 -0
- package/dist/Fx/combinators/grouped.d.ts.map +1 -0
- package/dist/Fx/combinators/grouped.js +146 -0
- package/dist/Fx/combinators/index.d.ts +45 -0
- package/dist/Fx/combinators/index.d.ts.map +1 -1
- package/dist/Fx/combinators/index.js +45 -0
- package/dist/Fx/combinators/keyed.d.ts +124 -10
- package/dist/Fx/combinators/keyed.d.ts.map +1 -1
- package/dist/Fx/combinators/keyed.js +69 -11
- package/dist/Fx/combinators/loop.d.ts +17 -1
- package/dist/Fx/combinators/loop.d.ts.map +1 -1
- package/dist/Fx/combinators/loop.js +17 -1
- package/dist/Fx/combinators/loopCause.d.ts +18 -1
- package/dist/Fx/combinators/loopCause.d.ts.map +1 -1
- package/dist/Fx/combinators/loopCause.js +18 -1
- package/dist/Fx/combinators/loopCauseEffect.d.ts +19 -1
- package/dist/Fx/combinators/loopCauseEffect.d.ts.map +1 -1
- package/dist/Fx/combinators/loopCauseEffect.js +19 -1
- package/dist/Fx/combinators/loopEffect.d.ts +24 -1
- package/dist/Fx/combinators/loopEffect.d.ts.map +1 -1
- package/dist/Fx/combinators/loopEffect.js +24 -1
- package/dist/Fx/combinators/map.d.ts +46 -1
- package/dist/Fx/combinators/map.d.ts.map +1 -1
- package/dist/Fx/combinators/map.js +43 -1
- package/dist/Fx/combinators/mapBoth.d.ts +40 -0
- package/dist/Fx/combinators/mapBoth.d.ts.map +1 -0
- package/dist/Fx/combinators/mapBoth.js +33 -0
- package/dist/Fx/combinators/mapEffect.d.ts +25 -1
- package/dist/Fx/combinators/mapEffect.d.ts.map +1 -1
- package/dist/Fx/combinators/mapEffect.js +25 -1
- package/dist/Fx/combinators/mapError.d.ts +33 -0
- package/dist/Fx/combinators/mapError.d.ts.map +1 -0
- package/dist/Fx/combinators/mapError.js +32 -0
- package/dist/Fx/combinators/mergeAll.d.ts +35 -1
- package/dist/Fx/combinators/mergeAll.d.ts.map +1 -1
- package/dist/Fx/combinators/mergeAll.js +35 -1
- package/dist/Fx/combinators/mergeOrdered.d.ts +36 -4
- package/dist/Fx/combinators/mergeOrdered.d.ts.map +1 -1
- package/dist/Fx/combinators/mergeOrdered.js +68 -14
- package/dist/Fx/combinators/onError.d.ts +34 -4
- package/dist/Fx/combinators/onError.d.ts.map +1 -1
- package/dist/Fx/combinators/onError.js +34 -4
- package/dist/Fx/combinators/onExit.d.ts +29 -3
- package/dist/Fx/combinators/onExit.d.ts.map +1 -1
- package/dist/Fx/combinators/onExit.js +29 -3
- package/dist/Fx/combinators/onInterrupt.d.ts +49 -4
- package/dist/Fx/combinators/onInterrupt.d.ts.map +1 -1
- package/dist/Fx/combinators/onInterrupt.js +49 -4
- package/dist/Fx/combinators/pairwise.d.ts +28 -0
- package/dist/Fx/combinators/pairwise.d.ts.map +1 -0
- package/dist/Fx/combinators/pairwise.js +31 -0
- package/dist/Fx/combinators/provide.d.ts +162 -8
- package/dist/Fx/combinators/provide.d.ts.map +1 -1
- package/dist/Fx/combinators/provide.js +154 -6
- package/dist/Fx/combinators/race.d.ts +92 -0
- package/dist/Fx/combinators/race.d.ts.map +1 -0
- package/dist/Fx/combinators/race.js +149 -0
- package/dist/Fx/combinators/repeat.d.ts +41 -0
- package/dist/Fx/combinators/repeat.d.ts.map +1 -0
- package/dist/Fx/combinators/repeat.js +57 -0
- package/dist/Fx/combinators/result.d.ts +45 -0
- package/dist/Fx/combinators/result.d.ts.map +1 -0
- package/dist/Fx/combinators/result.js +46 -0
- package/dist/Fx/combinators/retry.d.ts +53 -0
- package/dist/Fx/combinators/retry.d.ts.map +1 -0
- package/dist/Fx/combinators/retry.js +71 -0
- package/dist/Fx/combinators/sample.d.ts +31 -0
- package/dist/Fx/combinators/sample.d.ts.map +1 -0
- package/dist/Fx/combinators/sample.js +42 -0
- package/dist/Fx/combinators/scan.d.ts +72 -0
- package/dist/Fx/combinators/scan.d.ts.map +1 -0
- package/dist/Fx/combinators/scan.js +77 -0
- package/dist/Fx/combinators/since.d.ts +30 -0
- package/dist/Fx/combinators/since.d.ts.map +1 -0
- package/dist/Fx/combinators/since.js +39 -0
- package/dist/Fx/combinators/skip.d.ts +45 -1
- package/dist/Fx/combinators/skip.d.ts.map +1 -1
- package/dist/Fx/combinators/skip.js +43 -1
- package/dist/Fx/combinators/skipRepeats.d.ts +17 -1
- package/dist/Fx/combinators/skipRepeats.d.ts.map +1 -1
- package/dist/Fx/combinators/skipRepeats.js +17 -1
- package/dist/Fx/combinators/skipRepeatsWith.d.ts +18 -1
- package/dist/Fx/combinators/skipRepeatsWith.d.ts.map +1 -1
- package/dist/Fx/combinators/skipRepeatsWith.js +18 -1
- package/dist/Fx/combinators/skipWhile.d.ts +117 -0
- package/dist/Fx/combinators/skipWhile.d.ts.map +1 -0
- package/dist/Fx/combinators/skipWhile.js +134 -0
- package/dist/Fx/combinators/slice.d.ts +97 -2
- package/dist/Fx/combinators/slice.d.ts.map +1 -1
- package/dist/Fx/combinators/slice.js +45 -1
- package/dist/Fx/combinators/switchMap.d.ts +39 -1
- package/dist/Fx/combinators/switchMap.d.ts.map +1 -1
- package/dist/Fx/combinators/switchMap.js +43 -5
- package/dist/Fx/combinators/switchMapEffect.d.ts +38 -1
- package/dist/Fx/combinators/switchMapEffect.d.ts.map +1 -1
- package/dist/Fx/combinators/switchMapEffect.js +38 -1
- package/dist/Fx/combinators/take.d.ts +46 -1
- package/dist/Fx/combinators/take.d.ts.map +1 -1
- package/dist/Fx/combinators/take.js +44 -1
- package/dist/Fx/combinators/takeUntil.d.ts +62 -2
- package/dist/Fx/combinators/takeUntil.d.ts.map +1 -1
- package/dist/Fx/combinators/takeUntil.js +62 -2
- package/dist/Fx/combinators/takeWhile.d.ts +60 -0
- package/dist/Fx/combinators/takeWhile.d.ts.map +1 -0
- package/dist/Fx/combinators/takeWhile.js +54 -0
- package/dist/Fx/combinators/tapEffect.d.ts +17 -1
- package/dist/Fx/combinators/tapEffect.d.ts.map +1 -1
- package/dist/Fx/combinators/tapEffect.js +17 -1
- package/dist/Fx/combinators/throttle.d.ts +79 -0
- package/dist/Fx/combinators/throttle.d.ts.map +1 -0
- package/dist/Fx/combinators/throttle.js +99 -0
- package/dist/Fx/combinators/timeout.d.ts +76 -0
- package/dist/Fx/combinators/timeout.d.ts.map +1 -0
- package/dist/Fx/combinators/timeout.js +110 -0
- package/dist/Fx/combinators/tuple.d.ts +32 -2
- package/dist/Fx/combinators/tuple.d.ts.map +1 -1
- package/dist/Fx/combinators/tuple.js +36 -5
- package/dist/Fx/combinators/until.d.ts +27 -0
- package/dist/Fx/combinators/until.d.ts.map +1 -0
- package/dist/Fx/combinators/until.js +56 -0
- package/dist/Fx/combinators/unwrap.d.ts +31 -2
- package/dist/Fx/combinators/unwrap.d.ts.map +1 -1
- package/dist/Fx/combinators/unwrap.js +30 -1
- package/dist/Fx/combinators/unwrapScoped.d.ts +34 -1
- package/dist/Fx/combinators/unwrapScoped.d.ts.map +1 -1
- package/dist/Fx/combinators/unwrapScoped.js +34 -1
- package/dist/Fx/combinators/when.d.ts +37 -2
- package/dist/Fx/combinators/when.d.ts.map +1 -1
- package/dist/Fx/combinators/when.js +38 -3
- package/dist/Fx/combinators/withLatestFrom.d.ts +58 -0
- package/dist/Fx/combinators/withLatestFrom.d.ts.map +1 -0
- package/dist/Fx/combinators/withLatestFrom.js +68 -0
- package/dist/Fx/combinators/withSpan.d.ts +35 -1
- package/dist/Fx/combinators/withSpan.d.ts.map +1 -1
- package/dist/Fx/combinators/withSpan.js +34 -3
- package/dist/Fx/combinators/zip.d.ts +135 -0
- package/dist/Fx/combinators/zip.d.ts.map +1 -0
- package/dist/Fx/combinators/zip.js +160 -0
- package/dist/Fx/constructors/at.d.ts +23 -3
- package/dist/Fx/constructors/at.d.ts.map +1 -1
- package/dist/Fx/constructors/at.js +21 -1
- package/dist/Fx/constructors/die.d.ts +22 -1
- package/dist/Fx/constructors/die.d.ts.map +1 -1
- package/dist/Fx/constructors/die.js +22 -1
- package/dist/Fx/constructors/empty.d.ts +19 -1
- package/dist/Fx/constructors/empty.d.ts.map +1 -1
- package/dist/Fx/constructors/empty.js +19 -1
- package/dist/Fx/constructors/fail.d.ts +22 -1
- package/dist/Fx/constructors/fail.d.ts.map +1 -1
- package/dist/Fx/constructors/fail.js +22 -1
- package/dist/Fx/constructors/failCause.d.ts +23 -1
- package/dist/Fx/constructors/failCause.d.ts.map +1 -1
- package/dist/Fx/constructors/failCause.js +23 -1
- package/dist/Fx/constructors/fn.d.ts +116 -16
- package/dist/Fx/constructors/fn.d.ts.map +1 -1
- package/dist/Fx/constructors/fn.js +36 -0
- package/dist/Fx/constructors/fromEffect.d.ts +45 -3
- package/dist/Fx/constructors/fromEffect.d.ts.map +1 -1
- package/dist/Fx/constructors/fromEffect.js +45 -3
- package/dist/Fx/constructors/fromFailures.d.ts +25 -1
- package/dist/Fx/constructors/fromFailures.d.ts.map +1 -1
- package/dist/Fx/constructors/fromFailures.js +25 -1
- package/dist/Fx/constructors/fromIterable.d.ts +23 -1
- package/dist/Fx/constructors/fromIterable.d.ts.map +1 -1
- package/dist/Fx/constructors/fromIterable.js +23 -1
- package/dist/Fx/constructors/fromSchedule.d.ts +26 -1
- package/dist/Fx/constructors/fromSchedule.d.ts.map +1 -1
- package/dist/Fx/constructors/fromSchedule.js +28 -3
- package/dist/Fx/constructors/index.d.ts +2 -1
- package/dist/Fx/constructors/index.d.ts.map +1 -1
- package/dist/Fx/constructors/index.js +2 -1
- package/dist/Fx/constructors/interrupt.d.ts +22 -2
- package/dist/Fx/constructors/interrupt.d.ts.map +1 -1
- package/dist/Fx/constructors/interrupt.js +22 -2
- package/dist/Fx/constructors/make.d.ts +151 -4
- package/dist/Fx/constructors/make.d.ts.map +1 -1
- package/dist/Fx/constructors/make.js +60 -7
- package/dist/Fx/constructors/periodic.d.ts +31 -2
- package/dist/Fx/constructors/periodic.d.ts.map +1 -1
- package/dist/Fx/constructors/periodic.js +30 -1
- package/dist/Fx/constructors/succeed.d.ts +79 -7
- package/dist/Fx/constructors/succeed.d.ts.map +1 -1
- package/dist/Fx/constructors/succeed.js +79 -7
- package/dist/Fx/constructors/suspend.d.ts +28 -0
- package/dist/Fx/constructors/suspend.d.ts.map +1 -1
- package/dist/Fx/constructors/suspend.js +28 -0
- package/dist/Fx/constructors/sync.d.ts +32 -0
- package/dist/Fx/constructors/sync.d.ts.map +1 -0
- package/dist/Fx/constructors/sync.js +32 -0
- package/dist/Fx/internal/DeferredRef.d.ts +259 -7
- package/dist/Fx/internal/DeferredRef.d.ts.map +1 -1
- package/dist/Fx/internal/DeferredRef.js +260 -9
- package/dist/Fx/internal/UnionToTuple.d.ts +22 -0
- package/dist/Fx/internal/UnionToTuple.d.ts.map +1 -1
- package/dist/Fx/internal/diff.d.ts +586 -0
- package/dist/Fx/internal/diff.d.ts.map +1 -1
- package/dist/Fx/internal/diff.js +120 -9
- package/dist/Fx/internal/effectableEvaluateKey.d.ts +30 -0
- package/dist/Fx/internal/effectableEvaluateKey.d.ts.map +1 -0
- package/dist/Fx/internal/effectableEvaluateKey.js +29 -0
- package/dist/Fx/internal/effectableWithOverride.d.ts +55 -0
- package/dist/Fx/internal/effectableWithOverride.d.ts.map +1 -0
- package/dist/Fx/internal/effectableWithOverride.js +46 -0
- package/dist/Fx/internal/equivalence.d.ts +29 -0
- package/dist/Fx/internal/equivalence.d.ts.map +1 -1
- package/dist/Fx/internal/equivalence.js +29 -0
- package/dist/Fx/internal/multicast.d.ts +145 -2
- package/dist/Fx/internal/multicast.d.ts.map +1 -1
- package/dist/Fx/internal/multicast.js +146 -4
- package/dist/Fx/internal/ring-buffer.d.ts +149 -0
- package/dist/Fx/internal/ring-buffer.d.ts.map +1 -1
- package/dist/Fx/internal/ring-buffer.js +155 -0
- package/dist/Fx/internal/scope.d.ts +184 -0
- package/dist/Fx/internal/scope.d.ts.map +1 -1
- package/dist/Fx/internal/scope.js +150 -0
- package/dist/Fx/internal/yieldable.d.ts +117 -2
- package/dist/Fx/internal/yieldable.d.ts.map +1 -1
- package/dist/Fx/internal/yieldable.js +86 -3
- package/dist/Fx/run/collect.d.ts +93 -4
- package/dist/Fx/run/collect.d.ts.map +1 -1
- package/dist/Fx/run/collect.js +94 -5
- package/dist/Fx/run/first.d.ts +23 -1
- package/dist/Fx/run/first.d.ts.map +1 -1
- package/dist/Fx/run/first.js +23 -1
- package/dist/Fx/run/fork.d.ts +52 -2
- package/dist/Fx/run/fork.d.ts.map +1 -1
- package/dist/Fx/run/fork.js +52 -2
- package/dist/Fx/run/observe.d.ts +112 -4
- package/dist/Fx/run/observe.d.ts.map +1 -1
- package/dist/Fx/run/observe.js +137 -16
- package/dist/Fx/run/runPromise.d.ts +45 -2
- package/dist/Fx/run/runPromise.d.ts.map +1 -1
- package/dist/Fx/run/runPromise.js +45 -2
- package/dist/Fx/stream.d.ts +92 -0
- package/dist/Fx/stream.d.ts.map +1 -1
- package/dist/Fx/stream.js +60 -1
- package/dist/Push/Push.d.ts +1286 -98
- package/dist/Push/Push.d.ts.map +1 -1
- package/dist/Push/Push.js +1074 -88
- package/dist/RefArray.d.ts +2 -0
- package/dist/RefArray.d.ts.map +1 -0
- package/dist/RefArray.js +1 -0
- package/dist/RefBigDecimal.d.ts +2 -0
- package/dist/RefBigDecimal.d.ts.map +1 -0
- package/dist/RefBigDecimal.js +1 -0
- package/dist/RefBigInt.d.ts +2 -0
- package/dist/RefBigInt.d.ts.map +1 -0
- package/dist/RefBigInt.js +1 -0
- package/dist/RefBoolean.d.ts +2 -0
- package/dist/RefBoolean.d.ts.map +1 -0
- package/dist/RefBoolean.js +1 -0
- package/dist/RefCause.d.ts +2 -0
- package/dist/RefCause.d.ts.map +1 -0
- package/dist/RefCause.js +1 -0
- package/dist/RefChunk.d.ts +2 -0
- package/dist/RefChunk.d.ts.map +1 -0
- package/dist/RefChunk.js +1 -0
- package/dist/RefDateTime.d.ts +2 -0
- package/dist/RefDateTime.d.ts.map +1 -0
- package/dist/RefDateTime.js +1 -0
- package/dist/RefDuration.d.ts +2 -0
- package/dist/RefDuration.d.ts.map +1 -0
- package/dist/RefDuration.js +1 -0
- package/dist/RefGraph.d.ts +2 -0
- package/dist/RefGraph.d.ts.map +1 -0
- package/dist/RefGraph.js +1 -0
- package/dist/RefHashMap.d.ts +2 -0
- package/dist/RefHashMap.d.ts.map +1 -0
- package/dist/RefHashMap.js +1 -0
- package/dist/RefHashRing.d.ts +2 -0
- package/dist/RefHashRing.d.ts.map +1 -0
- package/dist/RefHashRing.js +1 -0
- package/dist/RefHashSet.d.ts +2 -0
- package/dist/RefHashSet.d.ts.map +1 -0
- package/dist/RefHashSet.js +1 -0
- package/dist/RefIterable.d.ts +2 -0
- package/dist/RefIterable.d.ts.map +1 -0
- package/dist/RefIterable.js +1 -0
- package/dist/RefOption.d.ts +2 -0
- package/dist/RefOption.d.ts.map +1 -0
- package/dist/RefOption.js +1 -0
- package/dist/RefRecord.d.ts +2 -0
- package/dist/RefRecord.d.ts.map +1 -0
- package/dist/RefRecord.js +1 -0
- package/dist/RefResult.d.ts +2 -0
- package/dist/RefResult.d.ts.map +1 -0
- package/dist/RefResult.js +1 -0
- package/dist/RefString.d.ts +2 -0
- package/dist/RefString.d.ts.map +1 -0
- package/dist/RefString.js +1 -0
- package/dist/RefStruct.d.ts +2 -0
- package/dist/RefStruct.d.ts.map +1 -0
- package/dist/RefStruct.js +1 -0
- package/dist/RefSubject/Hydration.d.ts +504 -0
- package/dist/RefSubject/Hydration.d.ts.map +1 -0
- package/dist/RefSubject/Hydration.js +300 -0
- package/dist/RefSubject/RefArray.d.ts +382 -35
- package/dist/RefSubject/RefArray.d.ts.map +1 -1
- package/dist/RefSubject/RefArray.js +374 -40
- package/dist/RefSubject/RefBigDecimal.d.ts +241 -21
- package/dist/RefSubject/RefBigDecimal.d.ts.map +1 -1
- package/dist/RefSubject/RefBigDecimal.js +229 -20
- package/dist/RefSubject/RefBigInt.d.ts +181 -16
- package/dist/RefSubject/RefBigInt.d.ts.map +1 -1
- package/dist/RefSubject/RefBigInt.js +169 -15
- package/dist/RefSubject/RefBoolean.d.ts +181 -16
- package/dist/RefSubject/RefBoolean.d.ts.map +1 -1
- package/dist/RefSubject/RefBoolean.js +169 -15
- package/dist/RefSubject/RefCause.d.ts +133 -12
- package/dist/RefSubject/RefCause.d.ts.map +1 -1
- package/dist/RefSubject/RefCause.js +121 -11
- package/dist/RefSubject/RefChunk.d.ts +481 -76
- package/dist/RefSubject/RefChunk.d.ts.map +1 -1
- package/dist/RefSubject/RefChunk.js +471 -75
- package/dist/RefSubject/RefDateTime.d.ts +137 -16
- package/dist/RefSubject/RefDateTime.d.ts.map +1 -1
- package/dist/RefSubject/RefDateTime.js +122 -12
- package/dist/RefSubject/RefDuration.d.ts +169 -15
- package/dist/RefSubject/RefDuration.d.ts.map +1 -1
- package/dist/RefSubject/RefDuration.js +157 -14
- package/dist/RefSubject/RefGraph.d.ts +349 -35
- package/dist/RefSubject/RefGraph.d.ts.map +1 -1
- package/dist/RefSubject/RefGraph.js +334 -32
- package/dist/RefSubject/RefHashMap.d.ts +323 -28
- package/dist/RefSubject/RefHashMap.d.ts.map +1 -1
- package/dist/RefSubject/RefHashMap.js +317 -29
- package/dist/RefSubject/RefHashRing.d.ts +159 -15
- package/dist/RefSubject/RefHashRing.d.ts.map +1 -1
- package/dist/RefSubject/RefHashRing.js +145 -12
- package/dist/RefSubject/RefHashSet.d.ts +251 -22
- package/dist/RefSubject/RefHashSet.d.ts.map +1 -1
- package/dist/RefSubject/RefHashSet.js +238 -20
- package/dist/RefSubject/RefIterable.d.ts +358 -32
- package/dist/RefSubject/RefIterable.d.ts.map +1 -1
- package/dist/RefSubject/RefIterable.js +350 -30
- package/dist/RefSubject/RefOption.d.ts +157 -14
- package/dist/RefSubject/RefOption.d.ts.map +1 -1
- package/dist/RefSubject/RefOption.js +145 -13
- package/dist/RefSubject/RefRecord.d.ts +402 -64
- package/dist/RefSubject/RefRecord.d.ts.map +1 -1
- package/dist/RefSubject/RefRecord.js +364 -39
- package/dist/RefSubject/RefResult.d.ts +167 -35
- package/dist/RefSubject/RefResult.d.ts.map +1 -1
- package/dist/RefSubject/RefResult.js +133 -12
- package/dist/RefSubject/RefString.d.ts +205 -18
- package/dist/RefSubject/RefString.d.ts.map +1 -1
- package/dist/RefSubject/RefString.js +193 -17
- package/dist/RefSubject/RefStruct.d.ts +169 -14
- package/dist/RefSubject/RefStruct.d.ts.map +1 -1
- package/dist/RefSubject/RefStruct.js +157 -13
- package/dist/RefSubject/RefSubject.d.ts +1242 -43
- package/dist/RefSubject/RefSubject.d.ts.map +1 -1
- package/dist/RefSubject/RefSubject.js +1012 -86
- package/dist/RefSubject/RefTrie.d.ts +323 -37
- package/dist/RefSubject/RefTrie.d.ts.map +1 -1
- package/dist/RefSubject/RefTrie.js +311 -31
- package/dist/RefSubject/RefTuple.d.ts +127 -11
- package/dist/RefSubject/RefTuple.d.ts.map +1 -1
- package/dist/RefSubject/RefTuple.js +114 -9
- package/dist/RefSubject/index.d.ts +1 -0
- package/dist/RefSubject/index.d.ts.map +1 -1
- package/dist/RefSubject/index.js +1 -0
- package/dist/RefSubject.d.ts +2 -1
- package/dist/RefSubject.d.ts.map +1 -1
- package/dist/RefSubject.js +2 -1
- package/dist/RefTrie.d.ts +2 -0
- package/dist/RefTrie.d.ts.map +1 -0
- package/dist/RefTrie.js +1 -0
- package/dist/RefTuple.d.ts +2 -0
- package/dist/RefTuple.d.ts.map +1 -0
- package/dist/RefTuple.js +1 -0
- package/dist/Sink/Sink.d.ts +396 -23
- package/dist/Sink/Sink.d.ts.map +1 -1
- package/dist/Sink/Sink.js +55 -7
- package/dist/Sink/combinators.d.ts +789 -3
- package/dist/Sink/combinators.d.ts.map +1 -1
- package/dist/Sink/combinators.js +812 -7
- package/dist/Subject/Subject.d.ts +1022 -27
- package/dist/Subject/Subject.d.ts.map +1 -1
- package/dist/Subject/Subject.js +909 -43
- package/dist/Versioned/Versioned.d.ts +475 -25
- package/dist/Versioned/Versioned.d.ts.map +1 -1
- package/dist/Versioned/Versioned.js +298 -46
- package/dist/index.d.ts +22 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -3
- package/package.json +125 -11
- package/dist/Fx/constructors/fromYieldable.d.ts +0 -12
- package/dist/Fx/constructors/fromYieldable.d.ts.map +0 -1
- package/dist/Fx/constructors/fromYieldable.js +0 -12
- package/src/Fx/Fx.ts +0 -164
- package/src/Fx/TypeId.ts +0 -25
- package/src/Fx/combinators/catch.ts +0 -165
- package/src/Fx/combinators/causes.ts +0 -23
- package/src/Fx/combinators/compact.ts +0 -15
- package/src/Fx/combinators/continueWith.ts +0 -78
- package/src/Fx/combinators/ensuring.ts +0 -23
- package/src/Fx/combinators/exhaustLatestMap.ts +0 -74
- package/src/Fx/combinators/exhaustLatestMapEffect.ts +0 -25
- package/src/Fx/combinators/exhaustMap.ts +0 -36
- package/src/Fx/combinators/exhaustMapEffect.ts +0 -23
- package/src/Fx/combinators/exit.ts +0 -15
- package/src/Fx/combinators/filter.ts +0 -22
- package/src/Fx/combinators/filterEffect.ts +0 -31
- package/src/Fx/combinators/filterMap.ts +0 -23
- package/src/Fx/combinators/filterMapEffect.ts +0 -32
- package/src/Fx/combinators/filterMapLoop.ts +0 -35
- package/src/Fx/combinators/filterMapLoopCause.ts +0 -36
- package/src/Fx/combinators/filterMapLoopCauseEffect.ts +0 -46
- package/src/Fx/combinators/filterMapLoopEffect.ts +0 -36
- package/src/Fx/combinators/flatMap.ts +0 -51
- package/src/Fx/combinators/flatMapConcurrently.ts +0 -36
- package/src/Fx/combinators/flatMapConcurrentlyEffect.ts +0 -26
- package/src/Fx/combinators/flatMapEffect.ts +0 -42
- package/src/Fx/combinators/flip.ts +0 -14
- package/src/Fx/combinators/gen.ts +0 -24
- package/src/Fx/combinators/genScoped.ts +0 -24
- package/src/Fx/combinators/index.ts +0 -51
- package/src/Fx/combinators/keyed.ts +0 -369
- package/src/Fx/combinators/loop.ts +0 -27
- package/src/Fx/combinators/loopCause.ts +0 -34
- package/src/Fx/combinators/loopCauseEffect.ts +0 -36
- package/src/Fx/combinators/loopEffect.ts +0 -34
- package/src/Fx/combinators/map.ts +0 -22
- package/src/Fx/combinators/mapEffect.ts +0 -32
- package/src/Fx/combinators/mergeAll.ts +0 -22
- package/src/Fx/combinators/mergeOrdered.ts +0 -123
- package/src/Fx/combinators/onError.ts +0 -40
- package/src/Fx/combinators/onExit.ts +0 -82
- package/src/Fx/combinators/onInterrupt.ts +0 -87
- package/src/Fx/combinators/provide.ts +0 -62
- package/src/Fx/combinators/skip.ts +0 -20
- package/src/Fx/combinators/skipRepeats.ts +0 -15
- package/src/Fx/combinators/skipRepeatsWith.ts +0 -40
- package/src/Fx/combinators/slice.ts +0 -32
- package/src/Fx/combinators/switchMap.ts +0 -55
- package/src/Fx/combinators/switchMapEffect.ts +0 -25
- package/src/Fx/combinators/take.ts +0 -17
- package/src/Fx/combinators/takeUntil.ts +0 -50
- package/src/Fx/combinators/tapEffect.ts +0 -39
- package/src/Fx/combinators/tuple.ts +0 -79
- package/src/Fx/combinators/unwrap.ts +0 -21
- package/src/Fx/combinators/unwrapScoped.ts +0 -26
- package/src/Fx/combinators/when.ts +0 -64
- package/src/Fx/combinators/withSpan.ts +0 -24
- package/src/Fx/constructors/at.ts +0 -23
- package/src/Fx/constructors/die.ts +0 -17
- package/src/Fx/constructors/empty.ts +0 -10
- package/src/Fx/constructors/fail.ts +0 -14
- package/src/Fx/constructors/failCause.ts +0 -14
- package/src/Fx/constructors/fn.ts +0 -245
- package/src/Fx/constructors/fromEffect.ts +0 -24
- package/src/Fx/constructors/fromFailures.ts +0 -19
- package/src/Fx/constructors/fromIterable.ts +0 -15
- package/src/Fx/constructors/fromSchedule.ts +0 -18
- package/src/Fx/constructors/fromYieldable.ts +0 -17
- package/src/Fx/constructors/index.ts +0 -15
- package/src/Fx/constructors/interrupt.ts +0 -13
- package/src/Fx/constructors/make.ts +0 -103
- package/src/Fx/constructors/periodic.ts +0 -15
- package/src/Fx/constructors/succeed.ts +0 -37
- package/src/Fx/constructors/suspend.ts +0 -6
- package/src/Fx/index.ts +0 -6
- package/src/Fx/internal/DeferredRef.ts +0 -87
- package/src/Fx/internal/UnionToTuple.ts +0 -12
- package/src/Fx/internal/diff.ts +0 -191
- package/src/Fx/internal/equivalence.ts +0 -12
- package/src/Fx/internal/multicast.ts +0 -51
- package/src/Fx/internal/ring-buffer.ts +0 -60
- package/src/Fx/internal/scope.ts +0 -58
- package/src/Fx/internal/yieldable.ts +0 -31
- package/src/Fx/run/collect.ts +0 -79
- package/src/Fx/run/first.ts +0 -20
- package/src/Fx/run/fork.ts +0 -40
- package/src/Fx/run/index.ts +0 -5
- package/src/Fx/run/observe.ts +0 -114
- package/src/Fx/run/runPromise.ts +0 -32
- package/src/Fx/stream.ts +0 -42
- package/src/Fx.catch.test.ts +0 -61
- package/src/Fx.fn.test.ts +0 -51
- package/src/Fx.lifecycle.test.ts +0 -80
- package/src/Fx.test.ts +0 -71
- package/src/Fx.ts +0 -1
- package/src/Push/Push.ts +0 -903
- package/src/Push/index.ts +0 -1
- package/src/Push.test.ts +0 -26
- package/src/Push.ts +0 -1
- package/src/RefSubject/RefArray.ts +0 -512
- package/src/RefSubject/RefBigDecimal.test.ts +0 -56
- package/src/RefSubject/RefBigDecimal.ts +0 -295
- package/src/RefSubject/RefBigInt.test.ts +0 -56
- package/src/RefSubject/RefBigInt.ts +0 -189
- package/src/RefSubject/RefBoolean.test.ts +0 -57
- package/src/RefSubject/RefBoolean.ts +0 -185
- package/src/RefSubject/RefCause.test.ts +0 -53
- package/src/RefSubject/RefCause.ts +0 -146
- package/src/RefSubject/RefChunk.ts +0 -510
- package/src/RefSubject/RefDateTime.test.ts +0 -43
- package/src/RefSubject/RefDateTime.ts +0 -264
- package/src/RefSubject/RefDuration.test.ts +0 -49
- package/src/RefSubject/RefDuration.ts +0 -188
- package/src/RefSubject/RefGraph.ts +0 -650
- package/src/RefSubject/RefHashMap.ts +0 -465
- package/src/RefSubject/RefHashRing.ts +0 -262
- package/src/RefSubject/RefHashSet.ts +0 -308
- package/src/RefSubject/RefIterable.ts +0 -445
- package/src/RefSubject/RefOption.test.ts +0 -67
- package/src/RefSubject/RefOption.ts +0 -193
- package/src/RefSubject/RefRecord.ts +0 -612
- package/src/RefSubject/RefResult.test.ts +0 -63
- package/src/RefSubject/RefResult.ts +0 -209
- package/src/RefSubject/RefString.test.ts +0 -61
- package/src/RefSubject/RefString.ts +0 -256
- package/src/RefSubject/RefStruct.test.ts +0 -60
- package/src/RefSubject/RefStruct.ts +0 -253
- package/src/RefSubject/RefSubject.ts +0 -2545
- package/src/RefSubject/RefTrie.ts +0 -356
- package/src/RefSubject/RefTuple.test.ts +0 -60
- package/src/RefSubject/RefTuple.ts +0 -231
- package/src/RefSubject/index.ts +0 -21
- package/src/RefSubject.test.ts +0 -65
- package/src/RefSubject.ts +0 -1
- package/src/Sink/Sink.ts +0 -159
- package/src/Sink/combinators.ts +0 -993
- package/src/Sink/index.ts +0 -2
- package/src/Sink.ts +0 -1
- package/src/Subject/Subject.ts +0 -441
- package/src/Subject/index.ts +0 -1
- package/src/Subject.test.ts +0 -47
- package/src/Subject.ts +0 -1
- package/src/Versioned/Versioned.ts +0 -521
- package/src/Versioned/index.ts +0 -1
- package/src/Versioned.test.ts +0 -23
- package/src/Versioned.ts +0 -1
- package/src/index.ts +0 -7
- package/tsconfig.json +0 -6
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as Cause from "effect/Cause";
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
3
|
import * as Exit from "effect/Exit";
|
|
4
4
|
import * as Fiber from "effect/Fiber";
|
|
@@ -6,47 +6,274 @@ import * as Layer from "effect/Layer";
|
|
|
6
6
|
import * as MutableRef from "effect/MutableRef";
|
|
7
7
|
import * as Option from "effect/Option";
|
|
8
8
|
import * as Scope from "effect/Scope";
|
|
9
|
-
import * as
|
|
9
|
+
import * as Context from "effect/Context";
|
|
10
10
|
import type * as Fx from "../Fx/index.js";
|
|
11
11
|
import { RingBuffer } from "../Fx/internal/ring-buffer.js";
|
|
12
12
|
import { FxTypeId } from "../Fx/TypeId.js";
|
|
13
13
|
import type * as Sink from "../Sink/Sink.js";
|
|
14
14
|
/**
|
|
15
|
-
* A
|
|
16
|
-
*
|
|
15
|
+
* A multicast boundary that is both an `Fx` of its publications and a `Sink` that accepts them.
|
|
16
|
+
* Successes and failures are pushed to every subscriber present when that publication begins.
|
|
17
|
+
*
|
|
18
|
+
* @remarks
|
|
19
|
+
* ## Why
|
|
20
|
+
*
|
|
21
|
+
* `Subject` connects imperative or independently owned producers to `Fx` without changing the
|
|
22
|
+
* producer-driven direction of the work. Because the same value is also a `Sink`, another `Fx` can
|
|
23
|
+
* publish into it with `run` while any number of consumers subscribe through the ordinary `Fx`
|
|
24
|
+
* surface.
|
|
25
|
+
*
|
|
26
|
+
* ## Publication order
|
|
27
|
+
*
|
|
28
|
+
* Publications are serialized in FIFO order, including publications made concurrently or from
|
|
29
|
+
* inside a subscriber callback. The subscriber set is snapshotted once per publication: a
|
|
30
|
+
* subscriber removed during a delivery receives no later publication, and a subscriber added
|
|
31
|
+
* during a delivery begins with the next publication. A failure publication uses the error channel
|
|
32
|
+
* but does not permanently terminate the subject. A reentrant `onSuccess` or `onFailure` call from
|
|
33
|
+
* the fiber currently draining subscribers enqueues its publication and returns before that queued
|
|
34
|
+
* publication is delivered; the outer drain still delivers it in FIFO order.
|
|
35
|
+
*
|
|
36
|
+
* ## Ownership and lifetime
|
|
37
|
+
*
|
|
38
|
+
* Each call to `run` registers its sink in the caller's `Scope`; closing that scope removes only
|
|
39
|
+
* that subscription. `interrupt` closes all current subscriber scopes and clears retained replay
|
|
40
|
+
* state. A subject created by `make` is interrupted automatically when its owning scope closes;
|
|
41
|
+
* `unsafeMake` leaves that responsibility with the caller.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* import { Effect, Fiber } from "effect"
|
|
46
|
+
* import { Fx } from "@typed/fx"
|
|
47
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
48
|
+
*
|
|
49
|
+
* const program = Effect.gen(function* () {
|
|
50
|
+
* const events = yield* Subject.make<string>(2)
|
|
51
|
+
* const collected = yield* Effect.forkScoped(Fx.collectAll(Fx.take(events, 2)))
|
|
52
|
+
*
|
|
53
|
+
* yield* events.onSuccess("connected")
|
|
54
|
+
* yield* events.onSuccess("ready")
|
|
55
|
+
*
|
|
56
|
+
* return yield* Fiber.join(collected)
|
|
57
|
+
* }).pipe(Effect.scoped)
|
|
58
|
+
* ```
|
|
17
59
|
*
|
|
18
60
|
* @since 1.0.0
|
|
19
|
-
* @category
|
|
61
|
+
* @category Publication contracts
|
|
20
62
|
*/
|
|
21
63
|
export interface Subject<A, E = never, R = never> extends Fx.Fx<A, E, R | Scope.Scope>, Sink.Sink<A, E, R> {
|
|
22
64
|
/**
|
|
23
|
-
*
|
|
65
|
+
* Samples the number of sinks currently registered with this subject.
|
|
66
|
+
*
|
|
67
|
+
* @remarks
|
|
68
|
+
* ## Why
|
|
69
|
+
*
|
|
70
|
+
* Exposes demand for diagnostics and demand-sensitive coordination without coupling producers to
|
|
71
|
+
* the subject implementation.
|
|
72
|
+
*
|
|
73
|
+
* ## Ownership and lifetime
|
|
74
|
+
*
|
|
75
|
+
* The returned `Effect` does not subscribe or retain anything. It reads the count when executed
|
|
76
|
+
* and requires the same services `R` as the subject implementation.
|
|
77
|
+
*
|
|
78
|
+
* @since 1.0.0
|
|
79
|
+
* @category utilities
|
|
24
80
|
*/
|
|
25
81
|
readonly subscriberCount: Effect.Effect<number, never, R>;
|
|
26
82
|
/**
|
|
27
|
-
* Interrupts
|
|
83
|
+
* Interrupts every current subscription and clears any retained replay values.
|
|
84
|
+
*
|
|
85
|
+
* @remarks
|
|
86
|
+
* ## Why
|
|
87
|
+
*
|
|
88
|
+
* Gives the subject owner one deterministic shutdown operation for all active consumers and
|
|
89
|
+
* retained publications.
|
|
90
|
+
*
|
|
91
|
+
* ## Ownership and lifetime
|
|
92
|
+
*
|
|
93
|
+
* Closing subscriber scopes runs their finalizers. The effect cannot fail, and the subject may be
|
|
94
|
+
* subscribed to and published through again after the interruption.
|
|
95
|
+
*
|
|
96
|
+
* @since 1.0.0
|
|
97
|
+
* @category utilities
|
|
28
98
|
*/
|
|
29
99
|
readonly interrupt: Effect.Effect<void, never, R>;
|
|
30
100
|
}
|
|
31
101
|
export declare namespace Subject {
|
|
102
|
+
/**
|
|
103
|
+
* The service-shaped form of a `Subject` created by `Subject.Service`.
|
|
104
|
+
*
|
|
105
|
+
* @remarks
|
|
106
|
+
* ## Why
|
|
107
|
+
*
|
|
108
|
+
* A service form lets producers and consumers refer to one shared subject through Effect's
|
|
109
|
+
* context instead of passing the concrete instance through every call.
|
|
110
|
+
*
|
|
111
|
+
* ## Ownership and lifetime
|
|
112
|
+
*
|
|
113
|
+
* Static Subject operations require `Self` and delegate to the instance installed by `make`.
|
|
114
|
+
* The layer owns that instance in a `Scope` and interrupts it when the layer is released.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```ts
|
|
118
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
119
|
+
*
|
|
120
|
+
* class Events extends Subject.Service<Events, string>()("Events") {}
|
|
121
|
+
* const EventsLive = Events.make()
|
|
122
|
+
* ```
|
|
123
|
+
*
|
|
124
|
+
* @since 1.0.0
|
|
125
|
+
* @category Subject services
|
|
126
|
+
*/
|
|
32
127
|
interface Service<Self, Id extends string, A, E> extends Subject<A, E, Self> {
|
|
128
|
+
/**
|
|
129
|
+
* The literal context identifier supplied to `Subject.Service`.
|
|
130
|
+
*
|
|
131
|
+
* @remarks
|
|
132
|
+
* ## Why
|
|
133
|
+
*
|
|
134
|
+
* Preserves the service's stable identity for diagnostics and layer composition.
|
|
135
|
+
*
|
|
136
|
+
* ## Ownership and lifetime
|
|
137
|
+
*
|
|
138
|
+
* This string literal acquires and retains no resources.
|
|
139
|
+
*
|
|
140
|
+
* @since 1.0.0
|
|
141
|
+
* @category identifiers
|
|
142
|
+
*/
|
|
33
143
|
readonly id: Id;
|
|
34
|
-
|
|
35
|
-
|
|
144
|
+
/**
|
|
145
|
+
* The Effect context service used to retrieve the live subject instance.
|
|
146
|
+
*
|
|
147
|
+
* @remarks
|
|
148
|
+
* ## Why
|
|
149
|
+
*
|
|
150
|
+
* Provides the standard Effect service lookup used by every static Subject operation.
|
|
151
|
+
*
|
|
152
|
+
* ## Ownership and lifetime
|
|
153
|
+
*
|
|
154
|
+
* The tag acquires nothing; the layer installed for it owns the concrete subject.
|
|
155
|
+
*
|
|
156
|
+
* @since 1.0.0
|
|
157
|
+
* @category context
|
|
158
|
+
*/
|
|
159
|
+
readonly service: Context.Service<Self, Subject<A, E>>;
|
|
160
|
+
/**
|
|
161
|
+
* Builds a scoped layer containing one subject with the requested replay capacity.
|
|
162
|
+
*
|
|
163
|
+
* @remarks
|
|
164
|
+
* ## Why
|
|
165
|
+
*
|
|
166
|
+
* Packages one shared subject as a normal Effect layer for dependency composition.
|
|
167
|
+
*
|
|
168
|
+
* ## Ownership and lifetime
|
|
169
|
+
*
|
|
170
|
+
* Invalid capacities fail layer construction with `Cause.IllegalArgumentError`. The layer's
|
|
171
|
+
* scope owns the subject and interrupts its subscribers and clears its replay buffer on release.
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* ```ts
|
|
175
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
176
|
+
*
|
|
177
|
+
* class Events extends Subject.Service<Events, string>()("Events") {}
|
|
178
|
+
* const EventsLive = Events.make(1)
|
|
179
|
+
* ```
|
|
180
|
+
*
|
|
181
|
+
* @since 1.0.0
|
|
182
|
+
* @category layers
|
|
183
|
+
*/
|
|
184
|
+
readonly make: (replay?: number) => Layer.Layer<Self, Cause.IllegalArgumentError, Scope.Scope>;
|
|
36
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* A constructible service facade whose static side is also the contextual `Subject`.
|
|
188
|
+
*
|
|
189
|
+
* @remarks
|
|
190
|
+
* ## Why
|
|
191
|
+
*
|
|
192
|
+
* Supports the class-based Effect service declaration pattern without creating a second runtime
|
|
193
|
+
* object distinct from the static Subject facade.
|
|
194
|
+
*
|
|
195
|
+
* ## Ownership and lifetime
|
|
196
|
+
*
|
|
197
|
+
* Constructing the class returns its service facade; it does not allocate a subject. Use the
|
|
198
|
+
* static `make` layer to allocate and scope the backing instance.
|
|
199
|
+
*
|
|
200
|
+
* @since 1.0.0
|
|
201
|
+
* @category Subject services
|
|
202
|
+
*/
|
|
37
203
|
interface Class<Self, Id extends string, A, E> extends Service<Self, Id, A, E> {
|
|
204
|
+
/**
|
|
205
|
+
* Returns the contextual service facade without allocating a subject.
|
|
206
|
+
*
|
|
207
|
+
* @remarks
|
|
208
|
+
* ## Why
|
|
209
|
+
*
|
|
210
|
+
* Enables `class Events extends Subject.Service<...>()("Events") {}` while retaining the
|
|
211
|
+
* facade's static `Fx`, `Sink`, and layer operations.
|
|
212
|
+
*
|
|
213
|
+
* ## Ownership and lifetime
|
|
214
|
+
*
|
|
215
|
+
* Construction acquires no resources; the static `make` layer owns the backing subject.
|
|
216
|
+
*
|
|
217
|
+
* @example
|
|
218
|
+
* ```ts
|
|
219
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
220
|
+
*
|
|
221
|
+
* class Events extends Subject.Service<Events, string>()("Events") {}
|
|
222
|
+
* const facade = new Events()
|
|
223
|
+
* ```
|
|
224
|
+
*
|
|
225
|
+
* @since 1.0.0
|
|
226
|
+
* @category constructors
|
|
227
|
+
*/
|
|
38
228
|
new (): Service<Self, Id, A, E>;
|
|
39
229
|
}
|
|
40
230
|
}
|
|
41
231
|
/**
|
|
42
|
-
* Shares
|
|
43
|
-
*
|
|
232
|
+
* Shares one active execution of an `Fx` among subscribers through the supplied `Subject`.
|
|
233
|
+
*
|
|
234
|
+
* @remarks
|
|
235
|
+
* ## Why
|
|
236
|
+
*
|
|
237
|
+
* Use `share` when the caller must choose the multicast boundary—for example, a replaying subject,
|
|
238
|
+
* a renderer-independent state object, or a service-backed subject—while ensuring that simultaneous
|
|
239
|
+
* consumers do not duplicate the source's effects.
|
|
240
|
+
*
|
|
241
|
+
* ## Subscription and publication
|
|
242
|
+
*
|
|
243
|
+
* A subscriber is registered with the subject before the source starts, so the first subscriber
|
|
244
|
+
* observes synchronous first values and failures. The first active subscriber starts the source;
|
|
245
|
+
* later subscribers join that execution. When the last subscriber leaves, the source fiber is
|
|
246
|
+
* interrupted. A later subscriber starts a fresh session.
|
|
247
|
+
*
|
|
248
|
+
* ## Errors, services, and interruption
|
|
249
|
+
*
|
|
250
|
+
* Source successes and failures are pushed unchanged through the subject. The returned `Fx`
|
|
251
|
+
* requires the union of source services and subject services.
|
|
252
|
+
*
|
|
253
|
+
* ## Ownership and lifetime
|
|
254
|
+
*
|
|
255
|
+
* `Scope` owns each individual subscription. The shared source is finalized exactly once when the
|
|
256
|
+
* active session ends or the source itself exits. `share` takes session ownership of the supplied
|
|
257
|
+
* subject: source exit calls its `interrupt`, closing all of that subject's subscribers and clearing
|
|
258
|
+
* retained state. Do not concurrently reuse the same subject for an independently owned producer
|
|
259
|
+
* or subscriber population.
|
|
260
|
+
*
|
|
261
|
+
* @example
|
|
262
|
+
* ```ts
|
|
263
|
+
* import { Effect } from "effect"
|
|
264
|
+
* import { Fx } from "@typed/fx"
|
|
265
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
266
|
+
*
|
|
267
|
+
* const backing = Subject.unsafeMake<number>(1)
|
|
268
|
+
* const request = Fx.fromEffect(Effect.succeed(42))
|
|
269
|
+
* const shared = Subject.share(request, backing)
|
|
270
|
+
* ```
|
|
44
271
|
*
|
|
45
272
|
* @param fx - The source Fx.
|
|
46
273
|
* @param subject - The subject to use for multicasting.
|
|
47
274
|
* @returns A shared `Fx`.
|
|
48
275
|
* @since 1.0.0
|
|
49
|
-
* @category
|
|
276
|
+
* @category Sharing sources
|
|
50
277
|
*/
|
|
51
278
|
export declare function share<A, E, R, R2>(fx: Fx.Fx<A, E, R>, subject: Subject<A, E, R2>): Fx.Fx<A, E, R | R2 | Scope.Scope>;
|
|
52
279
|
declare class RefCounter {
|
|
@@ -54,99 +281,867 @@ declare class RefCounter {
|
|
|
54
281
|
increment(): number;
|
|
55
282
|
decrement(): number;
|
|
56
283
|
}
|
|
284
|
+
/**
|
|
285
|
+
* The concrete lazy `Fx` returned by `share`.
|
|
286
|
+
*
|
|
287
|
+
* @remarks
|
|
288
|
+
* ## Why
|
|
289
|
+
*
|
|
290
|
+
* `Share` exposes the ref-counted sharing mechanism as an ordinary `Fx`: one source execution feeds
|
|
291
|
+
* the selected subject while each caller has an independently scoped subscription to that subject.
|
|
292
|
+
* Most callers should prefer `share`, `multicast`, `hold`, or `replay` for clearer intent.
|
|
293
|
+
*
|
|
294
|
+
* ## Ownership and lifetime
|
|
295
|
+
*
|
|
296
|
+
* Construction acquires nothing. The first executing `run` starts a detached source fiber; the
|
|
297
|
+
* final executing `run` interrupts it. Source completion interrupts the subject's current
|
|
298
|
+
* subscribers. Source, subject, and sink services are required only when `run` executes.
|
|
299
|
+
*
|
|
300
|
+
* @example
|
|
301
|
+
* ```ts
|
|
302
|
+
* import { Fx } from "@typed/fx"
|
|
303
|
+
* import { Share, unsafeMake } from "@typed/fx/Subject"
|
|
304
|
+
*
|
|
305
|
+
* const shared = new Share(Fx.succeed(1), unsafeMake<number>())
|
|
306
|
+
* ```
|
|
307
|
+
*
|
|
308
|
+
* @since 1.0.0
|
|
309
|
+
* @category Sharing sources
|
|
310
|
+
*/
|
|
57
311
|
export declare class Share<A, E, R, R2> implements Fx.Fx<A, E, R | R2 | Scope.Scope> {
|
|
312
|
+
/**
|
|
313
|
+
* Carries `Fx` variance information for the shared output, error, and service channels.
|
|
314
|
+
*
|
|
315
|
+
* @remarks
|
|
316
|
+
* ## Why
|
|
317
|
+
*
|
|
318
|
+
* Lets generic `Fx` utilities recognize and infer a `Share` without inspecting its runtime fields.
|
|
319
|
+
*
|
|
320
|
+
* ## Ownership and lifetime
|
|
321
|
+
*
|
|
322
|
+
* The marker is immutable metadata and acquires no resources.
|
|
323
|
+
*
|
|
324
|
+
* @since 1.0.0
|
|
325
|
+
* @category type-level
|
|
326
|
+
*/
|
|
58
327
|
readonly [FxTypeId]: Fx.Fx.Variance<A, E, R | R2 | Scope.Scope>;
|
|
328
|
+
/**
|
|
329
|
+
* Tracks the source fiber for the current active subscriber session.
|
|
330
|
+
*
|
|
331
|
+
* @remarks
|
|
332
|
+
* ## Why
|
|
333
|
+
*
|
|
334
|
+
* Gives the final departing subscriber an exact fiber to interrupt without restarting or
|
|
335
|
+
* duplicating the source.
|
|
336
|
+
*
|
|
337
|
+
* ## Ownership and lifetime
|
|
338
|
+
*
|
|
339
|
+
* The reference is empty before a session, set after the first subscriber starts the source, and
|
|
340
|
+
* cleared before or when that session ends. It does not outlive the `Share` instance.
|
|
341
|
+
*
|
|
342
|
+
* @since 1.0.0
|
|
343
|
+
* @category state
|
|
344
|
+
*/
|
|
59
345
|
_FxFiber: MutableRef.MutableRef<Option.Option<Fiber.Fiber<unknown>>>;
|
|
346
|
+
/**
|
|
347
|
+
* Tracks how many executing `run` effects participate in the active source session.
|
|
348
|
+
*
|
|
349
|
+
* @remarks
|
|
350
|
+
* ## Why
|
|
351
|
+
*
|
|
352
|
+
* Implements the first-subscriber start and last-subscriber stop boundary.
|
|
353
|
+
*
|
|
354
|
+
* ## Ownership and lifetime
|
|
355
|
+
*
|
|
356
|
+
* The counter is owned by the `Share` instance and never falls below zero. Each executing `run`
|
|
357
|
+
* increments once and decrements in its exit finalizer.
|
|
358
|
+
*
|
|
359
|
+
* @since 1.0.0
|
|
360
|
+
* @category state
|
|
361
|
+
*/
|
|
60
362
|
_RefCount: RefCounter;
|
|
363
|
+
/**
|
|
364
|
+
* The source whose execution is shared.
|
|
365
|
+
*
|
|
366
|
+
* @remarks
|
|
367
|
+
* ## Why
|
|
368
|
+
*
|
|
369
|
+
* Retains the original source so every active session can start exactly that `Fx`.
|
|
370
|
+
*
|
|
371
|
+
* ## Ownership and lifetime
|
|
372
|
+
*
|
|
373
|
+
* Holding the `Fx` value starts no work. Its `R` services and cleanup participate only while a
|
|
374
|
+
* subscriber session is active.
|
|
375
|
+
*
|
|
376
|
+
* @since 1.0.0
|
|
377
|
+
* @category inputs
|
|
378
|
+
*/
|
|
61
379
|
readonly i0: Fx.Fx<A, E, R>;
|
|
380
|
+
/**
|
|
381
|
+
* The multicast subject receiving source publications.
|
|
382
|
+
*
|
|
383
|
+
* @remarks
|
|
384
|
+
* ## Why
|
|
385
|
+
*
|
|
386
|
+
* Separates source sharing from retention and publication policy.
|
|
387
|
+
*
|
|
388
|
+
* ## Ownership and lifetime
|
|
389
|
+
*
|
|
390
|
+
* `Share` does not allocate this subject. It subscribes sinks to it and interrupts it when the
|
|
391
|
+
* source session exits; the subject's `R2` services remain required by `run`.
|
|
392
|
+
*
|
|
393
|
+
* @since 1.0.0
|
|
394
|
+
* @category inputs
|
|
395
|
+
*/
|
|
62
396
|
readonly i1: Subject<A, E, R2>;
|
|
397
|
+
/**
|
|
398
|
+
* Creates the lazy shared `Fx`; source acquisition waits until the first call to `run` executes.
|
|
399
|
+
*
|
|
400
|
+
* @remarks
|
|
401
|
+
* ## Why
|
|
402
|
+
*
|
|
403
|
+
* Keeps selection of the source and multicast policy separate from their execution.
|
|
404
|
+
*
|
|
405
|
+
* ## Ownership and lifetime
|
|
406
|
+
*
|
|
407
|
+
* The constructor only stores `i0` and `i1`; it starts no fiber and installs no finalizer.
|
|
408
|
+
*
|
|
409
|
+
* @example
|
|
410
|
+
* ```ts
|
|
411
|
+
* import { Fx } from "@typed/fx"
|
|
412
|
+
* import { Share, unsafeMake } from "@typed/fx/Subject"
|
|
413
|
+
*
|
|
414
|
+
* const shared = new Share(Fx.succeed("ready"), unsafeMake<string>())
|
|
415
|
+
* ```
|
|
416
|
+
*
|
|
417
|
+
* @since 1.0.0
|
|
418
|
+
* @category constructors
|
|
419
|
+
*/
|
|
63
420
|
constructor(i0: Fx.Fx<A, E, R>, i1: Subject<A, E, R2>);
|
|
421
|
+
/**
|
|
422
|
+
* Returns this value through the concrete class's zero-argument pipe entrypoint.
|
|
423
|
+
*
|
|
424
|
+
* @remarks
|
|
425
|
+
* ## Why
|
|
426
|
+
*
|
|
427
|
+
* Supplies the runtime pipe hook required by `Fx`; the concrete `Share` declaration currently
|
|
428
|
+
* publishes only its zero-argument signature, so typed combinator composition should target the
|
|
429
|
+
* `Fx` returned by `share`, `multicast`, `hold`, or `replay`.
|
|
430
|
+
*
|
|
431
|
+
* ## Ownership and lifetime
|
|
432
|
+
*
|
|
433
|
+
* Calling `pipe` itself acquires no resources; only an executing downstream `run` starts work.
|
|
434
|
+
*
|
|
435
|
+
* @example
|
|
436
|
+
* ```ts
|
|
437
|
+
* import { Fx } from "@typed/fx"
|
|
438
|
+
* import { Share, unsafeMake } from "@typed/fx/Subject"
|
|
439
|
+
*
|
|
440
|
+
* const shared = new Share(Fx.succeed(1), unsafeMake<number>())
|
|
441
|
+
* const same = shared.pipe()
|
|
442
|
+
* ```
|
|
443
|
+
*
|
|
444
|
+
* @since 1.0.0
|
|
445
|
+
* @category utilities
|
|
446
|
+
*/
|
|
64
447
|
pipe(): unknown;
|
|
448
|
+
/**
|
|
449
|
+
* Registers `sink`, joins or starts the active source session, and remains active until the
|
|
450
|
+
* subscription ends. Interruption removes this subscriber and stops the source if it was last.
|
|
451
|
+
*
|
|
452
|
+
* @remarks
|
|
453
|
+
* ## Why
|
|
454
|
+
*
|
|
455
|
+
* Implements `Fx` consumption while coordinating one source execution across independent sinks.
|
|
456
|
+
*
|
|
457
|
+
* ## Ownership and lifetime
|
|
458
|
+
*
|
|
459
|
+
* The caller's `Scope` owns its subject subscription. Source `R`, subject `R2`, and sink `R3`
|
|
460
|
+
* services are required during execution. Source failures are published to the sink rather than
|
|
461
|
+
* failing this returned Effect, whose error channel is `never`.
|
|
462
|
+
*
|
|
463
|
+
* @example
|
|
464
|
+
* ```ts
|
|
465
|
+
* import { Effect } from "effect"
|
|
466
|
+
* import { Fx } from "@typed/fx"
|
|
467
|
+
* import * as Sink from "@typed/fx/Sink"
|
|
468
|
+
* import { Share, unsafeMake } from "@typed/fx/Subject"
|
|
469
|
+
*
|
|
470
|
+
* const shared = new Share(Fx.succeed(1), unsafeMake<number>())
|
|
471
|
+
* const run = shared.run(
|
|
472
|
+
* Sink.make(
|
|
473
|
+
* () => Effect.void,
|
|
474
|
+
* (value) => Effect.sync(() => console.log(value))
|
|
475
|
+
* )
|
|
476
|
+
* )
|
|
477
|
+
* ```
|
|
478
|
+
*
|
|
479
|
+
* @since 1.0.0
|
|
480
|
+
* @category runners
|
|
481
|
+
*/
|
|
65
482
|
run<R3>(sink: Sink.Sink<A, E, R3>): Effect.Effect<unknown, never, R | R2 | R3 | Scope.Scope>;
|
|
66
483
|
private initialize;
|
|
67
484
|
private interrupt;
|
|
68
485
|
}
|
|
69
486
|
/**
|
|
70
|
-
* Multicasts an Fx
|
|
71
|
-
*
|
|
487
|
+
* Multicasts an `Fx` without replaying values that arrived before a subscriber joined.
|
|
488
|
+
*
|
|
489
|
+
* @remarks
|
|
490
|
+
* ## Why
|
|
491
|
+
*
|
|
492
|
+
* `multicast` is the zero-retention sharing policy: simultaneous subscribers share source work,
|
|
493
|
+
* while consumers that arrive later receive only later publications.
|
|
494
|
+
*
|
|
495
|
+
* ## Ownership and lifetime
|
|
496
|
+
*
|
|
497
|
+
* The first subscriber starts one source execution and the last subscriber interrupts it. A later
|
|
498
|
+
* subscriber starts a fresh execution. No replay buffer is retained. Source errors and services
|
|
499
|
+
* are preserved, and `Scope` owns each subscription.
|
|
500
|
+
*
|
|
501
|
+
* @example
|
|
502
|
+
* ```ts
|
|
503
|
+
* import { Fx } from "@typed/fx"
|
|
504
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
505
|
+
*
|
|
506
|
+
* const sharedTicks = Subject.multicast(Fx.periodic("1 second"))
|
|
507
|
+
* ```
|
|
72
508
|
*
|
|
73
509
|
* @param fx - The source Fx.
|
|
74
510
|
* @returns A multicasted `Fx`.
|
|
75
511
|
* @since 1.0.0
|
|
76
|
-
* @category
|
|
512
|
+
* @category Sharing sources
|
|
77
513
|
*/
|
|
78
514
|
export declare function multicast<A, E, R>(fx: Fx.Fx<A, E, R>): Fx.Fx<A, E, R | Scope.Scope>;
|
|
79
515
|
/**
|
|
80
|
-
*
|
|
516
|
+
* Shares an `Fx` and immediately replays its latest success or failure to each new subscriber.
|
|
517
|
+
*
|
|
518
|
+
* @remarks
|
|
519
|
+
* ## Why
|
|
520
|
+
*
|
|
521
|
+
* `hold` gives late subscribers the current publication without restarting an already active
|
|
522
|
+
* source, making it suitable for current-value streams and state-like projections.
|
|
523
|
+
*
|
|
524
|
+
* ## Ownership and lifetime
|
|
525
|
+
*
|
|
526
|
+
* One retained `Exit` belongs to the active shared subject. The first subscriber starts the source,
|
|
527
|
+
* the last subscriber interrupts it, and interruption clears the retained exit. Source errors and
|
|
528
|
+
* services remain visible in the returned `Fx`; subscription cleanup belongs to `Scope`.
|
|
529
|
+
*
|
|
530
|
+
* ## Join-during-publication behavior
|
|
531
|
+
*
|
|
532
|
+
* The latest `Exit` is retained before it enters the serialized publication queue. If a subscriber
|
|
533
|
+
* joins while an earlier publication is still draining, it can receive that queued exit immediately
|
|
534
|
+
* as replay and then receive it again when the queue reaches it. Consumers that require exactly-once
|
|
535
|
+
* delivery across concurrent subscription and publication must coordinate that boundary externally.
|
|
536
|
+
*
|
|
537
|
+
* @example
|
|
538
|
+
* ```ts
|
|
539
|
+
* import { Fx } from "@typed/fx"
|
|
540
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
541
|
+
*
|
|
542
|
+
* const currentStatus = Subject.hold(Fx.succeed("ready"))
|
|
543
|
+
* ```
|
|
81
544
|
*
|
|
82
545
|
* @param fx - The source Fx.
|
|
83
546
|
* @returns A shared `Fx` that replays the latest value.
|
|
84
547
|
* @since 1.0.0
|
|
85
|
-
* @category
|
|
548
|
+
* @category Sharing sources
|
|
86
549
|
*/
|
|
87
550
|
export declare function hold<A, E, R>(fx: Fx.Fx<A, E, R>): Fx.Fx<A, E, R | Scope.Scope>;
|
|
88
551
|
/**
|
|
89
|
-
*
|
|
552
|
+
* Shares an `Fx` and replays up to the last `capacity` successes or failures to new subscribers.
|
|
553
|
+
*
|
|
554
|
+
* @remarks
|
|
555
|
+
* ## Why
|
|
556
|
+
*
|
|
557
|
+
* `replay` makes retention an explicit caller-selected policy rather than an implicit property of
|
|
558
|
+
* every shared stream. Capacity `0` is equivalent to multicast retention; capacity `1` has hold
|
|
559
|
+
* semantics; larger values replay the retained window from oldest to newest.
|
|
90
560
|
*
|
|
91
|
-
*
|
|
561
|
+
* ## Errors and interruption
|
|
562
|
+
*
|
|
563
|
+
* A non-integer, negative, or larger-than-32-bit capacity produces an `Fx` that fails with
|
|
564
|
+
* `Cause.IllegalArgumentError` without starting the source. Valid buffers retain `Exit` values, so
|
|
565
|
+
* typed failures keep their original causes and order. The last subscriber interrupts the source
|
|
566
|
+
* and clears the buffer; source services remain in the return type.
|
|
567
|
+
*
|
|
568
|
+
* ## Ownership and lifetime
|
|
569
|
+
*
|
|
570
|
+
* `Scope` owns each subscription and the final subscriber owns shutdown of the active source
|
|
571
|
+
* session. Buffer memory belongs to that session and is cleared when it is interrupted.
|
|
572
|
+
*
|
|
573
|
+
* ## Join-during-publication behavior
|
|
574
|
+
*
|
|
575
|
+
* Each `Exit` enters the replay buffer before it enters the serialized publication queue. A
|
|
576
|
+
* subscriber joining while an earlier publication is still draining can replay a later queued exit
|
|
577
|
+
* and then receive the same exit again when normal delivery reaches it. Replay guarantees retained
|
|
578
|
+
* order, not exactly-once delivery across a concurrent subscribe/publish race.
|
|
579
|
+
*
|
|
580
|
+
* @example
|
|
581
|
+
* ```ts
|
|
582
|
+
* import { Fx } from "@typed/fx"
|
|
583
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
584
|
+
*
|
|
585
|
+
* const recent = Fx.fromIterable([1, 2, 3]).pipe(Subject.replay(2))
|
|
586
|
+
* ```
|
|
587
|
+
*
|
|
588
|
+
* @param capacity - An integer from 0 through 4,294,967,295. The buffer can retain up to
|
|
589
|
+
* `capacity` values, so callers own the memory policy for valid capacities. Invalid capacities
|
|
590
|
+
* fail through the Fx error channel with `Cause.IllegalArgumentError`.
|
|
92
591
|
* @param fx - The source Fx.
|
|
93
592
|
* @returns A shared `Fx` that replays values.
|
|
94
593
|
* @since 1.0.0
|
|
95
|
-
* @category
|
|
594
|
+
* @category Sharing sources
|
|
96
595
|
*/
|
|
97
596
|
export declare const replay: {
|
|
98
|
-
(capacity: number): <A, E, R>(fx: Fx.Fx<A, E, R>) => Fx.Fx<A, E, R>;
|
|
99
|
-
<A, E, R>(fx: Fx.Fx<A, E, R>, capacity: number): Fx.Fx<A, E, R>;
|
|
597
|
+
(capacity: number): <A, E, R>(fx: Fx.Fx<A, E, R>) => Fx.Fx<A, E | Cause.IllegalArgumentError, R | Scope.Scope>;
|
|
598
|
+
<A, E, R>(fx: Fx.Fx<A, E, R>, capacity: number): Fx.Fx<A, E | Cause.IllegalArgumentError, R | Scope.Scope>;
|
|
100
599
|
};
|
|
101
600
|
/**
|
|
601
|
+
* Implements a zero-replay subject with scoped subscribers and serialized publication delivery.
|
|
602
|
+
*
|
|
603
|
+
* @remarks
|
|
604
|
+
* ## Why
|
|
605
|
+
*
|
|
606
|
+
* This is the queueing core behind public subjects. It snapshots subscribers per publication and
|
|
607
|
+
* drains successes and failures in FIFO order without recursive stack growth.
|
|
608
|
+
*
|
|
609
|
+
* ## Publication and errors
|
|
610
|
+
*
|
|
611
|
+
* A non-reentrant publisher waits for its publication to finish delivery. A publisher called from
|
|
612
|
+
* the active drain fiber enqueues and returns immediately so subscriber callbacks cannot deadlock;
|
|
613
|
+
* the outer drain subsequently delivers that publication. Sink callback defects or interruption
|
|
614
|
+
* are handled by the sink boundary and do not become a typed Subject failure.
|
|
615
|
+
*
|
|
616
|
+
* ## Ownership and lifetime
|
|
617
|
+
*
|
|
618
|
+
* Each `run` call creates a child scope for its sink and removes it on closure. `interrupt` closes
|
|
619
|
+
* all current child scopes. The instance may accept later subscriptions and publications.
|
|
620
|
+
*
|
|
621
|
+
* This class remains marked `@internal` and is not a supported construction API even though the
|
|
622
|
+
* current wildcard package export makes it import-reachable. Use `make` or `unsafeMake`.
|
|
623
|
+
*
|
|
624
|
+
* @example
|
|
625
|
+
* ```ts
|
|
626
|
+
* import { Effect } from "effect"
|
|
627
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
628
|
+
*
|
|
629
|
+
* const supported = Effect.scoped(Subject.make<number>())
|
|
630
|
+
* ```
|
|
631
|
+
*
|
|
632
|
+
* @since 1.0.0
|
|
633
|
+
* @category internal
|
|
102
634
|
* @internal
|
|
103
635
|
*/
|
|
104
636
|
export declare class SubjectImpl<A, E> implements Subject<A, E> {
|
|
637
|
+
/**
|
|
638
|
+
* Carries the `Fx` variance channels implemented by this subject.
|
|
639
|
+
*
|
|
640
|
+
* @remarks
|
|
641
|
+
* ## Why
|
|
642
|
+
*
|
|
643
|
+
* Allows the implementation to satisfy the runtime `Fx` protocol.
|
|
644
|
+
*
|
|
645
|
+
* ## Ownership and lifetime
|
|
646
|
+
*
|
|
647
|
+
* Immutable metadata; it acquires no resources.
|
|
648
|
+
*
|
|
649
|
+
* @since 1.0.0
|
|
650
|
+
* @category internal
|
|
651
|
+
*/
|
|
105
652
|
readonly [FxTypeId]: Fx.Fx.Variance<A, E, Scope.Scope>;
|
|
106
|
-
protected sinks: Set<readonly [Sink.Sink<A, E, any>,
|
|
653
|
+
protected sinks: Set<readonly [Sink.Sink<A, E, any>, Context.Context<any>, Scope.Closeable]>;
|
|
654
|
+
private readonly publications;
|
|
655
|
+
private publicationIndex;
|
|
656
|
+
private activePublication;
|
|
657
|
+
private activeDrainFiberId;
|
|
658
|
+
/**
|
|
659
|
+
* Creates an empty zero-replay subject and binds its producer callbacks.
|
|
660
|
+
*
|
|
661
|
+
* @remarks
|
|
662
|
+
* ## Why
|
|
663
|
+
*
|
|
664
|
+
* Initializes the internal queueing boundary without starting work.
|
|
665
|
+
*
|
|
666
|
+
* ## Ownership and lifetime
|
|
667
|
+
*
|
|
668
|
+
* Construction acquires no fibers or scopes; later `run` calls own subscriptions.
|
|
669
|
+
*
|
|
670
|
+
* @since 1.0.0
|
|
671
|
+
* @category internal
|
|
672
|
+
*/
|
|
107
673
|
constructor();
|
|
674
|
+
/**
|
|
675
|
+
* Delegates to the Effect pipeable protocol.
|
|
676
|
+
*
|
|
677
|
+
* @remarks
|
|
678
|
+
* ## Why
|
|
679
|
+
*
|
|
680
|
+
* Lets the implementation participate in ordinary `Fx` composition.
|
|
681
|
+
*
|
|
682
|
+
* ## Ownership and lifetime
|
|
683
|
+
*
|
|
684
|
+
* Piping starts no subscription; execution begins only when the resulting `Fx` is run.
|
|
685
|
+
*
|
|
686
|
+
* @since 1.0.0
|
|
687
|
+
* @category internal
|
|
688
|
+
*/
|
|
108
689
|
pipe(): unknown;
|
|
690
|
+
/**
|
|
691
|
+
* Registers a sink until its child scope closes.
|
|
692
|
+
*
|
|
693
|
+
* @remarks
|
|
694
|
+
* ## Why
|
|
695
|
+
*
|
|
696
|
+
* Implements the subscription side of the `Fx` contract.
|
|
697
|
+
*
|
|
698
|
+
* ## Ownership and lifetime
|
|
699
|
+
*
|
|
700
|
+
* The caller's `Scope` owns this subscription and its captured `R2` context. Publications deliver
|
|
701
|
+
* `A` or `Cause<E>` to the sink; the returned Effect itself cannot fail.
|
|
702
|
+
*
|
|
703
|
+
* @since 1.0.0
|
|
704
|
+
* @category internal
|
|
705
|
+
*/
|
|
109
706
|
run<R2>(sink: Sink.Sink<A, E, R2>): Effect.Effect<unknown, never, R2 | Scope.Scope>;
|
|
707
|
+
/**
|
|
708
|
+
* Enqueues a failure publication for the current subscriber snapshot.
|
|
709
|
+
*
|
|
710
|
+
* @remarks
|
|
711
|
+
* ## Why
|
|
712
|
+
*
|
|
713
|
+
* Preserves the complete Effect `Cause`, including defects and interruption, at the Sink boundary.
|
|
714
|
+
*
|
|
715
|
+
* ## Ownership and lifetime
|
|
716
|
+
*
|
|
717
|
+
* Non-reentrant callers wait for delivery; a call from the active drain fiber returns after
|
|
718
|
+
* enqueueing. The publication is not retained for later subscribers.
|
|
719
|
+
*
|
|
720
|
+
* @since 1.0.0
|
|
721
|
+
* @category internal
|
|
722
|
+
*/
|
|
110
723
|
onFailure(cause: Cause.Cause<E>): Effect.Effect<void, never, never>;
|
|
724
|
+
/**
|
|
725
|
+
* Enqueues a successful value for the current subscriber snapshot.
|
|
726
|
+
*
|
|
727
|
+
* @remarks
|
|
728
|
+
* ## Why
|
|
729
|
+
*
|
|
730
|
+
* Provides the producer-facing push operation while preserving FIFO delivery.
|
|
731
|
+
*
|
|
732
|
+
* ## Ownership and lifetime
|
|
733
|
+
*
|
|
734
|
+
* Non-reentrant callers wait for delivery; a call from the active drain fiber returns after
|
|
735
|
+
* enqueueing. The value is not retained for later subscribers.
|
|
736
|
+
*
|
|
737
|
+
* @since 1.0.0
|
|
738
|
+
* @category internal
|
|
739
|
+
*/
|
|
111
740
|
onSuccess(a: A): Effect.Effect<void, never, never>;
|
|
112
741
|
protected interruptScopes: Effect.Effect<void, never, never>;
|
|
742
|
+
/**
|
|
743
|
+
* Closes every currently registered subscriber scope.
|
|
744
|
+
*
|
|
745
|
+
* @remarks
|
|
746
|
+
* ## Why
|
|
747
|
+
*
|
|
748
|
+
* Gives the owner one cleanup boundary for all active subscriptions.
|
|
749
|
+
*
|
|
750
|
+
* ## Ownership and lifetime
|
|
751
|
+
*
|
|
752
|
+
* Finalizers run for current subscribers; later subscriptions remain possible. This base class
|
|
753
|
+
* retains no replay state.
|
|
754
|
+
*
|
|
755
|
+
* @since 1.0.0
|
|
756
|
+
* @category internal
|
|
757
|
+
*/
|
|
113
758
|
readonly interrupt: Effect.Effect<void, never, never>;
|
|
114
759
|
protected addSink<R, B, R2>(sink: Sink.Sink<A, E, R>, f: (scope: Scope.Scope) => Effect.Effect<B, never, R2>): Effect.Effect<B, never, R2 | Scope.Scope>;
|
|
760
|
+
/**
|
|
761
|
+
* Samples the number of currently registered sinks without subscribing.
|
|
762
|
+
*
|
|
763
|
+
* @remarks
|
|
764
|
+
* ## Why
|
|
765
|
+
*
|
|
766
|
+
* Exposes current demand for diagnostics and coordination.
|
|
767
|
+
*
|
|
768
|
+
* ## Ownership and lifetime
|
|
769
|
+
*
|
|
770
|
+
* The Effect reads the owned sink set when executed and retains no additional state.
|
|
771
|
+
*
|
|
772
|
+
* @since 1.0.0
|
|
773
|
+
* @category internal
|
|
774
|
+
*/
|
|
115
775
|
readonly subscriberCount: Effect.Effect<number>;
|
|
116
776
|
protected onEvent(a: A): Effect.Effect<void, never, never>;
|
|
117
777
|
protected onCause(cause: Cause.Cause<E>): Effect.Effect<void, never, never>;
|
|
778
|
+
private enqueue;
|
|
779
|
+
private drain;
|
|
780
|
+
private clearDrain;
|
|
118
781
|
}
|
|
119
782
|
/**
|
|
783
|
+
* Internal one-exit replay implementation used for public hold semantics.
|
|
784
|
+
*
|
|
785
|
+
* @remarks
|
|
786
|
+
* ## Why
|
|
787
|
+
*
|
|
788
|
+
* Extends the serialized Subject core with a current `Exit`, allowing a new subscriber to observe
|
|
789
|
+
* the latest success or failure immediately.
|
|
790
|
+
*
|
|
791
|
+
* ## Join-during-publication behavior
|
|
792
|
+
*
|
|
793
|
+
* The current exit is updated before queue delivery. A subscriber joining while another
|
|
794
|
+
* publication drains can replay a later queued exit and receive it again when the queue reaches it.
|
|
795
|
+
*
|
|
796
|
+
* ## Ownership and lifetime
|
|
797
|
+
*
|
|
798
|
+
* The instance owns one retained exit. `interrupt` closes subscribers and clears it. This class is
|
|
799
|
+
* import-reachable under the current wildcard export but remains `@internal`; use `hold`, `make(1)`,
|
|
800
|
+
* or `unsafeMake(1)`.
|
|
801
|
+
*
|
|
802
|
+
* @example
|
|
803
|
+
* ```ts
|
|
804
|
+
* import { Fx } from "@typed/fx"
|
|
805
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
806
|
+
*
|
|
807
|
+
* const supported = Subject.hold(Fx.succeed("ready"))
|
|
808
|
+
* ```
|
|
809
|
+
*
|
|
810
|
+
* @since 1.0.0
|
|
811
|
+
* @category internal
|
|
120
812
|
* @internal
|
|
121
813
|
*/
|
|
122
814
|
export declare class HoldSubjectImpl<A, E> extends SubjectImpl<A, E> implements Subject<A, E> {
|
|
815
|
+
/**
|
|
816
|
+
* Stores the most recently published success or failure.
|
|
817
|
+
*
|
|
818
|
+
* @remarks
|
|
819
|
+
* ## Why
|
|
820
|
+
*
|
|
821
|
+
* Supplies the immediate current-state replay used when a sink subscribes.
|
|
822
|
+
*
|
|
823
|
+
* ## Ownership and lifetime
|
|
824
|
+
*
|
|
825
|
+
* Updated before enqueueing each publication and cleared by `interrupt`; it retains at most one
|
|
826
|
+
* `Exit<A, E>`.
|
|
827
|
+
*
|
|
828
|
+
* @since 1.0.0
|
|
829
|
+
* @category internal
|
|
830
|
+
*/
|
|
123
831
|
readonly lastValue: MutableRef.MutableRef<Option.Option<Exit.Exit<A, E>>>;
|
|
832
|
+
/**
|
|
833
|
+
* Retains a success, then enqueues it for serialized delivery.
|
|
834
|
+
*
|
|
835
|
+
* @remarks
|
|
836
|
+
* ## Why
|
|
837
|
+
*
|
|
838
|
+
* Makes the latest value immediately visible to subscribers without bypassing FIFO live delivery.
|
|
839
|
+
*
|
|
840
|
+
* ## Ownership and lifetime
|
|
841
|
+
*
|
|
842
|
+
* The retained value remains until replaced or interrupted. A reentrant call returns after
|
|
843
|
+
* enqueueing; a joining subscriber can therefore observe the queued value twice.
|
|
844
|
+
*
|
|
845
|
+
* @since 1.0.0
|
|
846
|
+
* @category internal
|
|
847
|
+
*/
|
|
124
848
|
onSuccess: (a: A) => Effect.Effect<void, never, never>;
|
|
849
|
+
/**
|
|
850
|
+
* Retains a failure cause, then enqueues it for serialized delivery.
|
|
851
|
+
*
|
|
852
|
+
* @remarks
|
|
853
|
+
* ## Why
|
|
854
|
+
*
|
|
855
|
+
* Gives late subscribers the same current failure, preserving its complete `Cause`.
|
|
856
|
+
*
|
|
857
|
+
* ## Ownership and lifetime
|
|
858
|
+
*
|
|
859
|
+
* The retained failure remains until replaced or interrupted. A joining subscriber can replay a
|
|
860
|
+
* queued cause and receive it again from the live drain.
|
|
861
|
+
*
|
|
862
|
+
* @since 1.0.0
|
|
863
|
+
* @category internal
|
|
864
|
+
*/
|
|
125
865
|
onFailure: (cause: Cause.Cause<E>) => Effect.Effect<void, never, never>;
|
|
866
|
+
/**
|
|
867
|
+
* Registers a sink, delivers the retained exit if present, then awaits scope closure.
|
|
868
|
+
*
|
|
869
|
+
* @remarks
|
|
870
|
+
* ## Why
|
|
871
|
+
*
|
|
872
|
+
* Combines a current-state read with the live Subject subscription.
|
|
873
|
+
*
|
|
874
|
+
* ## Ownership and lifetime
|
|
875
|
+
*
|
|
876
|
+
* The caller's `Scope` owns registration and captured `R2` services. Replay occurs before waiting
|
|
877
|
+
* for later publications; concurrent queued publication can duplicate that replay as described on
|
|
878
|
+
* the class.
|
|
879
|
+
*
|
|
880
|
+
* @since 1.0.0
|
|
881
|
+
* @category internal
|
|
882
|
+
*/
|
|
126
883
|
run<R2>(sink: Sink.Sink<A, E, R2>): Effect.Effect<unknown, never, R2 | Scope.Scope>;
|
|
884
|
+
/**
|
|
885
|
+
* Closes current subscribers and clears the retained exit.
|
|
886
|
+
*
|
|
887
|
+
* @remarks
|
|
888
|
+
* ## Why
|
|
889
|
+
*
|
|
890
|
+
* Couples subscription cleanup with current-state cleanup.
|
|
891
|
+
*
|
|
892
|
+
* ## Ownership and lifetime
|
|
893
|
+
*
|
|
894
|
+
* Later subscriptions remain possible but have no replay until another publication arrives.
|
|
895
|
+
*
|
|
896
|
+
* @since 1.0.0
|
|
897
|
+
* @category internal
|
|
898
|
+
*/
|
|
127
899
|
readonly interrupt: Effect.Effect<void, never, never>;
|
|
128
900
|
}
|
|
129
901
|
/**
|
|
902
|
+
* Internal bounded replay implementation used for public replay semantics.
|
|
903
|
+
*
|
|
904
|
+
* @remarks
|
|
905
|
+
* ## Why
|
|
906
|
+
*
|
|
907
|
+
* Extends the serialized Subject core with an explicit-capacity FIFO window of successful and
|
|
908
|
+
* failed publications.
|
|
909
|
+
*
|
|
910
|
+
* ## Join-during-publication behavior
|
|
911
|
+
*
|
|
912
|
+
* Each exit enters the ring buffer before queue delivery. A subscriber joining while another
|
|
913
|
+
* publication drains can replay a later queued exit and receive it again when the queue reaches it.
|
|
914
|
+
*
|
|
915
|
+
* ## Ownership and lifetime
|
|
916
|
+
*
|
|
917
|
+
* The instance owns the supplied ring buffer. `interrupt` closes subscribers and clears the buffer.
|
|
918
|
+
* This class is import-reachable under the current wildcard export but remains `@internal`; use
|
|
919
|
+
* `replay`, `make`, or `unsafeMake`.
|
|
920
|
+
*
|
|
921
|
+
* @example
|
|
922
|
+
* ```ts
|
|
923
|
+
* import { Fx } from "@typed/fx"
|
|
924
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
925
|
+
*
|
|
926
|
+
* const supported = Fx.fromIterable([1, 2, 3]).pipe(Subject.replay(2))
|
|
927
|
+
* ```
|
|
928
|
+
*
|
|
929
|
+
* @since 1.0.0
|
|
930
|
+
* @category internal
|
|
130
931
|
* @internal
|
|
131
932
|
*/
|
|
132
933
|
export declare class ReplaySubjectImpl<A, E> extends SubjectImpl<A, E> {
|
|
934
|
+
/**
|
|
935
|
+
* Stores the bounded FIFO window of retained successes and failures.
|
|
936
|
+
*
|
|
937
|
+
* @remarks
|
|
938
|
+
* ## Why
|
|
939
|
+
*
|
|
940
|
+
* Makes replay capacity and eviction explicit in the implementation.
|
|
941
|
+
*
|
|
942
|
+
* ## Ownership and lifetime
|
|
943
|
+
*
|
|
944
|
+
* Owned by this subject, filled before live queue delivery, and emptied by `interrupt`.
|
|
945
|
+
*
|
|
946
|
+
* @since 1.0.0
|
|
947
|
+
* @category internal
|
|
948
|
+
*/
|
|
133
949
|
readonly buffer: RingBuffer<Exit.Exit<A, E>>;
|
|
950
|
+
/**
|
|
951
|
+
* Creates a replay subject around an already allocated ring buffer.
|
|
952
|
+
*
|
|
953
|
+
* @remarks
|
|
954
|
+
* ## Why
|
|
955
|
+
*
|
|
956
|
+
* Keeps capacity validation and allocation in the public factories while this class owns replay.
|
|
957
|
+
*
|
|
958
|
+
* ## Ownership and lifetime
|
|
959
|
+
*
|
|
960
|
+
* Construction starts no fibers. The instance retains and later clears the supplied buffer.
|
|
961
|
+
*
|
|
962
|
+
* @since 1.0.0
|
|
963
|
+
* @category internal
|
|
964
|
+
*/
|
|
134
965
|
constructor(buffer: RingBuffer<Exit.Exit<A, E>>);
|
|
966
|
+
/**
|
|
967
|
+
* Appends a success to the ring buffer, then enqueues it for live delivery.
|
|
968
|
+
*
|
|
969
|
+
* @remarks
|
|
970
|
+
* ## Why
|
|
971
|
+
*
|
|
972
|
+
* Preserves one order for retained and live values while bounding memory by capacity.
|
|
973
|
+
*
|
|
974
|
+
* ## Ownership and lifetime
|
|
975
|
+
*
|
|
976
|
+
* The buffer evicts its oldest exit when full. A joining subscriber can replay this queued value
|
|
977
|
+
* and receive it again from the live drain.
|
|
978
|
+
*
|
|
979
|
+
* @since 1.0.0
|
|
980
|
+
* @category internal
|
|
981
|
+
*/
|
|
135
982
|
onSuccess: (a: A) => Effect.Effect<void, never, never>;
|
|
983
|
+
/**
|
|
984
|
+
* Appends a failure cause to the ring buffer, then enqueues it for live delivery.
|
|
985
|
+
*
|
|
986
|
+
* @remarks
|
|
987
|
+
* ## Why
|
|
988
|
+
*
|
|
989
|
+
* Replays failures in causal order without reducing them to typed error values.
|
|
990
|
+
*
|
|
991
|
+
* ## Ownership and lifetime
|
|
992
|
+
*
|
|
993
|
+
* The complete `Cause` remains retained until eviction or interruption. A joining subscriber can
|
|
994
|
+
* replay the queued cause and receive it again from the live drain.
|
|
995
|
+
*
|
|
996
|
+
* @since 1.0.0
|
|
997
|
+
* @category internal
|
|
998
|
+
*/
|
|
136
999
|
onFailure: (cause: Cause.Cause<E>) => Effect.Effect<void, never, never>;
|
|
1000
|
+
/**
|
|
1001
|
+
* Registers a sink, replays the retained window oldest-to-newest, then awaits scope closure.
|
|
1002
|
+
*
|
|
1003
|
+
* @remarks
|
|
1004
|
+
* ## Why
|
|
1005
|
+
*
|
|
1006
|
+
* Gives late subscribers bounded history before they consume subsequent live publications.
|
|
1007
|
+
*
|
|
1008
|
+
* ## Ownership and lifetime
|
|
1009
|
+
*
|
|
1010
|
+
* The caller's `Scope` owns registration and captured `R2` services. Replay itself does not remove
|
|
1011
|
+
* entries. Concurrent queued publication can duplicate an exit as described on the class.
|
|
1012
|
+
*
|
|
1013
|
+
* @since 1.0.0
|
|
1014
|
+
* @category internal
|
|
1015
|
+
*/
|
|
137
1016
|
run<R2>(sink: Sink.Sink<A, E, R2>): Effect.Effect<unknown, never, R2 | Scope.Scope>;
|
|
1017
|
+
/**
|
|
1018
|
+
* Closes current subscribers and empties the replay buffer.
|
|
1019
|
+
*
|
|
1020
|
+
* @remarks
|
|
1021
|
+
* ## Why
|
|
1022
|
+
*
|
|
1023
|
+
* Releases both subscriber lifetimes and caller-selected retained memory at one boundary.
|
|
1024
|
+
*
|
|
1025
|
+
* ## Ownership and lifetime
|
|
1026
|
+
*
|
|
1027
|
+
* Later subscriptions remain possible but have no history until new publications arrive.
|
|
1028
|
+
*
|
|
1029
|
+
* @since 1.0.0
|
|
1030
|
+
* @category internal
|
|
1031
|
+
*/
|
|
138
1032
|
readonly interrupt: Effect.Effect<void, never, never>;
|
|
139
1033
|
}
|
|
140
1034
|
/**
|
|
141
|
-
*
|
|
142
|
-
*
|
|
1035
|
+
* Immediately allocates a `Subject` with the requested replay capacity and manual ownership.
|
|
1036
|
+
*
|
|
1037
|
+
* @remarks
|
|
1038
|
+
* ## Why
|
|
1039
|
+
*
|
|
1040
|
+
* `unsafeMake` is the escape hatch for owners that cannot acquire through an Effect `Scope`, such
|
|
1041
|
+
* as a long-lived host object with its own explicit teardown. Prefer `make` inside Effect programs.
|
|
1042
|
+
*
|
|
1043
|
+
* ## Ownership and lifetime
|
|
1044
|
+
*
|
|
1045
|
+
* Allocation is synchronous and starts no fibers. The caller must execute `interrupt` to close
|
|
1046
|
+
* subscribers and clear retained `Exit` values. Capacity `0` retains nothing, capacity `1` retains
|
|
1047
|
+
* the latest publication, and larger capacities retain the newest window in FIFO replay order.
|
|
1048
|
+
*
|
|
1049
|
+
* ## Errors
|
|
1050
|
+
*
|
|
1051
|
+
* Invalid capacities throw `Cause.IllegalArgumentError` synchronously; this function has no typed
|
|
1052
|
+
* Effect error channel. Publishing and subscribing use the `E` and service channels of the returned
|
|
1053
|
+
* subject.
|
|
1054
|
+
*
|
|
1055
|
+
* @example
|
|
1056
|
+
* ```ts
|
|
1057
|
+
* import { Effect } from "effect"
|
|
1058
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
1059
|
+
*
|
|
1060
|
+
* const events = Subject.unsafeMake<string>(10)
|
|
1061
|
+
*
|
|
1062
|
+
* const shutdown = events.interrupt
|
|
1063
|
+
* const publish = events.onSuccess("ready").pipe(Effect.asVoid)
|
|
1064
|
+
* ```
|
|
1065
|
+
*
|
|
1066
|
+
* @param replay - An integer from 0 through 4,294,967,295. The buffer can retain up to
|
|
1067
|
+
* `replay` values, so callers own the memory policy for valid capacities.
|
|
143
1068
|
* @returns A `Subject` that replays the last `replay` values.
|
|
1069
|
+
* @since 1.0.0
|
|
1070
|
+
* @category Subject construction
|
|
144
1071
|
*/
|
|
145
1072
|
export declare function unsafeMake<A, E = never>(replay?: number): Subject<A, E>;
|
|
146
1073
|
/**
|
|
147
|
-
*
|
|
1074
|
+
* Acquires a `Subject` whose subscribers and replay state are released with the current `Scope`.
|
|
1075
|
+
*
|
|
1076
|
+
* @remarks
|
|
1077
|
+
* ## Why
|
|
1078
|
+
*
|
|
1079
|
+
* `make` places the imperative subject boundary under Effect's structured resource ownership, so
|
|
1080
|
+
* cancellation and scope closure cannot leave subscriptions or retained values behind.
|
|
1081
|
+
*
|
|
1082
|
+
* ## Ownership and lifetime
|
|
1083
|
+
*
|
|
1084
|
+
* The effect allocates when executed, not when described. Its required `Scope` installs a finalizer
|
|
1085
|
+
* that runs `interrupt`, closing all subscriber scopes and clearing the replay buffer. Individual
|
|
1086
|
+
* subscriber scopes may still end earlier without affecting other subscribers.
|
|
1087
|
+
*
|
|
1088
|
+
* ## Errors
|
|
1089
|
+
*
|
|
1090
|
+
* Invalid capacities fail in the typed error channel with `Cause.IllegalArgumentError`; no subject
|
|
1091
|
+
* is allocated. Once acquired, publication callbacks have no typed failure result; the subject's
|
|
1092
|
+
* `E` parameter describes incoming Causes rather than publication acknowledgment errors.
|
|
1093
|
+
* Interruption and defects remain distinct from that typed channel.
|
|
1094
|
+
*
|
|
1095
|
+
* @example
|
|
1096
|
+
* ```ts
|
|
1097
|
+
* import { Effect } from "effect"
|
|
1098
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
1099
|
+
*
|
|
1100
|
+
* const program = Effect.gen(function* () {
|
|
1101
|
+
* const messages = yield* Subject.make<string>(1)
|
|
1102
|
+
* yield* messages.onSuccess("online")
|
|
1103
|
+
* return yield* messages.subscriberCount
|
|
1104
|
+
* }).pipe(Effect.scoped)
|
|
1105
|
+
* ```
|
|
1106
|
+
*
|
|
1107
|
+
* @since 1.0.0
|
|
1108
|
+
* @category Subject construction
|
|
1109
|
+
*/
|
|
1110
|
+
export declare function make<A, E = never>(replay?: number): Effect.Effect<Subject<A, E>, Cause.IllegalArgumentError, Scope.Scope>;
|
|
1111
|
+
/**
|
|
1112
|
+
* Defines an Effect context service that is simultaneously a `Subject`, `Fx`, and `Sink` facade.
|
|
1113
|
+
*
|
|
1114
|
+
* @remarks
|
|
1115
|
+
* ## Why
|
|
1116
|
+
*
|
|
1117
|
+
* A named subject often represents an application-wide event boundary. `Service` keeps that
|
|
1118
|
+
* boundary type-safe and lets producers, consumers, and layers compose through Effect's normal
|
|
1119
|
+
* service channel instead of a module-global mutable instance.
|
|
1120
|
+
*
|
|
1121
|
+
* ## Ownership and lifetime
|
|
1122
|
+
*
|
|
1123
|
+
* Defining the class acquires nothing. Calling its static `make` creates a layer backed by scoped
|
|
1124
|
+
* `Subject.make`; releasing the layer interrupts subscriptions and clears replay. Static `Fx` and
|
|
1125
|
+
* `Sink` operations require `Self`, then delegate to the installed subject. Invalid replay
|
|
1126
|
+
* capacities fail layer construction with `Cause.IllegalArgumentError`.
|
|
1127
|
+
*
|
|
1128
|
+
* @example
|
|
1129
|
+
* ```ts
|
|
1130
|
+
* import { Effect } from "effect"
|
|
1131
|
+
* import { Fx } from "@typed/fx"
|
|
1132
|
+
* import * as Subject from "@typed/fx/Subject"
|
|
1133
|
+
*
|
|
1134
|
+
* class Notifications extends Subject.Service<Notifications, string>()("Notifications") {}
|
|
1135
|
+
*
|
|
1136
|
+
* const program = Effect.gen(function* () {
|
|
1137
|
+
* yield* Notifications.onSuccess("saved")
|
|
1138
|
+
* return yield* Fx.first(Notifications)
|
|
1139
|
+
* }).pipe(Effect.provide(Notifications.make(1)), Effect.scoped)
|
|
1140
|
+
* ```
|
|
1141
|
+
*
|
|
1142
|
+
* @since 1.0.0
|
|
1143
|
+
* @category Subject services
|
|
148
1144
|
*/
|
|
149
|
-
export declare function make<A, E = never>(replay?: number): Effect.Effect<Subject<A, E>, never, Scope.Scope>;
|
|
150
1145
|
export declare function Service<Self, A, E = never>(): <const Id extends string>(id: Id) => Subject.Class<Self, Id, A, E>;
|
|
151
1146
|
export {};
|
|
152
1147
|
//# sourceMappingURL=Subject.d.ts.map
|