@typed/fx 1.18.4 → 1.20.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/AsyncData/package.json +6 -0
- package/Emitter/package.json +6 -0
- package/Form/package.json +6 -0
- package/FormEntry/package.json +6 -0
- package/Fx/package.json +6 -0
- package/Guard/package.json +6 -0
- package/Idle/package.json +6 -0
- package/Match/package.json +6 -0
- package/Pull/package.json +6 -0
- package/Push/package.json +6 -0
- package/RefArray/package.json +6 -0
- package/RefChunk/package.json +6 -0
- package/RefHashMap/package.json +6 -0
- package/RefHashSet/package.json +6 -0
- package/RefSubject/package.json +6 -0
- package/Sink/package.json +6 -0
- package/Stream/package.json +6 -0
- package/Subject/package.json +6 -0
- package/TypeId/package.json +6 -0
- package/Typeclass/package.json +6 -0
- package/Versioned/package.json +6 -0
- package/dist/cjs/AsyncData.js +177 -0
- package/dist/cjs/AsyncData.js.map +1 -0
- package/dist/cjs/Emitter.js +24 -21
- package/dist/cjs/Emitter.js.map +1 -1
- package/dist/cjs/Form.js +78 -21
- package/dist/cjs/Form.js.map +1 -1
- package/dist/cjs/FormEntry.js +75 -48
- package/dist/cjs/FormEntry.js.map +1 -1
- package/dist/cjs/Fx.js +517 -872
- package/dist/cjs/Fx.js.map +1 -1
- package/dist/cjs/Guard.js +21 -13
- package/dist/cjs/Guard.js.map +1 -1
- package/dist/cjs/Idle.js +49 -37
- package/dist/cjs/Idle.js.map +1 -1
- package/dist/cjs/Match.js +99 -61
- package/dist/cjs/Match.js.map +1 -1
- package/dist/cjs/Pull.js.map +1 -1
- package/dist/cjs/Push.js +168 -0
- package/dist/cjs/Push.js.map +1 -0
- package/dist/cjs/RefArray.js +32 -30
- package/dist/cjs/RefArray.js.map +1 -1
- package/dist/cjs/RefChunk.js +26 -24
- package/dist/cjs/RefChunk.js.map +1 -1
- package/dist/cjs/RefHashMap.js +20 -20
- package/dist/cjs/RefHashMap.js.map +1 -1
- package/dist/cjs/RefHashSet.js +11 -8
- package/dist/cjs/RefHashSet.js.map +1 -1
- package/dist/cjs/RefSubject.js +899 -158
- package/dist/cjs/RefSubject.js.map +1 -1
- package/dist/cjs/Sink.js +588 -62
- package/dist/cjs/Sink.js.map +1 -1
- package/dist/cjs/Stream.js +15 -10
- package/dist/cjs/Stream.js.map +1 -1
- package/dist/cjs/Subject.js +153 -55
- package/dist/cjs/Subject.js.map +1 -1
- package/dist/cjs/TypeId.js +10 -5
- package/dist/cjs/TypeId.js.map +1 -1
- package/dist/cjs/Typeclass.js +28 -31
- package/dist/cjs/Typeclass.js.map +1 -1
- package/dist/cjs/Versioned.js +118 -57
- package/dist/cjs/Versioned.js.map +1 -1
- package/dist/cjs/index.js +44 -8
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internal/{deferred-ref.js → DeferredRef.js} +45 -13
- package/dist/cjs/internal/DeferredRef.js.map +1 -0
- package/dist/cjs/internal/UnionToTuple.js +6 -0
- package/dist/cjs/internal/UnionToTuple.js.map +1 -0
- package/dist/cjs/internal/core.js +1590 -779
- package/dist/cjs/internal/core.js.map +1 -1
- package/dist/cjs/internal/diff.js +114 -0
- package/dist/cjs/internal/diff.js.map +1 -0
- package/dist/cjs/internal/effect-loop-operator.js +288 -0
- package/dist/cjs/internal/effect-loop-operator.js.map +1 -0
- package/dist/cjs/internal/effect-operator.js +46 -37
- package/dist/cjs/internal/effect-operator.js.map +1 -1
- package/dist/cjs/internal/effect-producer.js +74 -0
- package/dist/cjs/internal/effect-producer.js.map +1 -0
- package/dist/cjs/internal/helpers.js +158 -128
- package/dist/cjs/internal/helpers.js.map +1 -1
- package/dist/cjs/internal/keyed.js +136 -173
- package/dist/cjs/internal/keyed.js.map +1 -1
- package/dist/cjs/internal/loop-operator.js +213 -0
- package/dist/cjs/internal/loop-operator.js.map +1 -0
- package/dist/cjs/internal/operator.js +79 -0
- package/dist/cjs/internal/operator.js.map +1 -0
- package/dist/cjs/internal/protos.js +19 -81
- package/dist/cjs/internal/protos.js.map +1 -1
- package/dist/cjs/internal/provide.js +47 -25
- package/dist/cjs/internal/provide.js.map +1 -1
- package/dist/cjs/internal/requestIdleCallback.js +5 -5
- package/dist/cjs/internal/requestIdleCallback.js.map +1 -1
- package/dist/cjs/internal/share.js +12 -15
- package/dist/cjs/internal/share.js.map +1 -1
- package/dist/cjs/internal/sync-operator.js +50 -22
- package/dist/cjs/internal/sync-operator.js.map +1 -1
- package/dist/cjs/internal/sync-producer.js +114 -0
- package/dist/cjs/internal/sync-producer.js.map +1 -0
- package/dist/cjs/internal/withKey.js +45 -51
- package/dist/cjs/internal/withKey.js.map +1 -1
- package/dist/dts/AsyncData.d.ts +185 -0
- package/dist/dts/AsyncData.d.ts.map +1 -0
- package/dist/dts/Emitter.d.ts +13 -20
- package/dist/dts/Emitter.d.ts.map +1 -1
- package/dist/dts/Form.d.ts +45 -28
- package/dist/dts/Form.d.ts.map +1 -1
- package/dist/dts/FormEntry.d.ts +25 -13
- package/dist/dts/FormEntry.d.ts.map +1 -1
- package/dist/dts/Fx.d.ts +983 -1387
- package/dist/dts/Fx.d.ts.map +1 -1
- package/dist/dts/Guard.d.ts +8 -1
- package/dist/dts/Guard.d.ts.map +1 -1
- package/dist/dts/Idle.d.ts +3 -3
- package/dist/dts/Idle.d.ts.map +1 -1
- package/dist/dts/Match.d.ts +8 -8
- package/dist/dts/Match.d.ts.map +1 -1
- package/dist/dts/Pull.d.ts +5 -5
- package/dist/dts/Pull.d.ts.map +1 -1
- package/dist/dts/Push.d.ts +170 -0
- package/dist/dts/Push.d.ts.map +1 -0
- package/dist/dts/RefArray.d.ts +21 -23
- package/dist/dts/RefArray.d.ts.map +1 -1
- package/dist/dts/RefChunk.d.ts +17 -19
- package/dist/dts/RefChunk.d.ts.map +1 -1
- package/dist/dts/RefHashMap.d.ts +19 -20
- package/dist/dts/RefHashMap.d.ts.map +1 -1
- package/dist/dts/RefHashSet.d.ts +12 -16
- package/dist/dts/RefHashSet.d.ts.map +1 -1
- package/dist/dts/RefSubject.d.ts +396 -187
- package/dist/dts/RefSubject.d.ts.map +1 -1
- package/dist/dts/Sink.d.ts +193 -93
- package/dist/dts/Sink.d.ts.map +1 -1
- package/dist/dts/Stream.d.ts +7 -1
- package/dist/dts/Stream.d.ts.map +1 -1
- package/dist/dts/Subject.d.ts +27 -36
- package/dist/dts/Subject.d.ts.map +1 -1
- package/dist/dts/TypeId.d.ts +10 -0
- package/dist/dts/TypeId.d.ts.map +1 -1
- package/dist/dts/Typeclass.d.ts +2 -2
- package/dist/dts/Typeclass.d.ts.map +1 -1
- package/dist/dts/Versioned.d.ts +50 -78
- package/dist/dts/Versioned.d.ts.map +1 -1
- package/dist/dts/index.d.ts +66 -6
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/DeferredRef.d.ts +20 -0
- package/dist/dts/internal/DeferredRef.d.ts.map +1 -0
- package/dist/dts/internal/UnionToTuple.d.ts +6 -0
- package/dist/dts/internal/UnionToTuple.d.ts.map +1 -0
- package/dist/dts/internal/core.d.ts +218 -450
- package/dist/dts/internal/core.d.ts.map +1 -1
- package/dist/dts/internal/diff.d.ts +38 -0
- package/dist/dts/internal/diff.d.ts.map +1 -0
- package/dist/dts/internal/effect-loop-operator.d.ts +34 -0
- package/dist/dts/internal/effect-loop-operator.d.ts.map +1 -0
- package/dist/dts/internal/effect-operator.d.ts +8 -5
- package/dist/dts/internal/effect-operator.d.ts.map +1 -1
- package/dist/dts/internal/effect-producer.d.ts +25 -0
- package/dist/dts/internal/effect-producer.d.ts.map +1 -0
- package/dist/dts/internal/helpers.d.ts +33 -24
- package/dist/dts/internal/helpers.d.ts.map +1 -1
- package/dist/dts/internal/keyed.d.ts +3 -3
- package/dist/dts/internal/keyed.d.ts.map +1 -1
- package/dist/dts/internal/loop-operator.d.ts +40 -0
- package/dist/dts/internal/loop-operator.d.ts.map +1 -0
- package/dist/dts/internal/operator.d.ts +16 -0
- package/dist/dts/internal/operator.d.ts.map +1 -0
- package/dist/dts/internal/protos.d.ts +16 -43
- package/dist/dts/internal/protos.d.ts.map +1 -1
- package/dist/dts/internal/provide.d.ts +7 -1
- package/dist/dts/internal/provide.d.ts.map +1 -1
- package/dist/dts/internal/share.d.ts +12 -9
- package/dist/dts/internal/share.d.ts.map +1 -1
- package/dist/dts/internal/sync-operator.d.ts +7 -3
- package/dist/dts/internal/sync-operator.d.ts.map +1 -1
- package/dist/dts/internal/sync-producer.d.ts +36 -0
- package/dist/dts/internal/sync-producer.d.ts.map +1 -0
- package/dist/dts/internal/withKey.d.ts +3 -3
- package/dist/dts/internal/withKey.d.ts.map +1 -1
- package/dist/esm/AsyncData.js +151 -0
- package/dist/esm/AsyncData.js.map +1 -0
- package/dist/esm/Emitter.js +24 -21
- package/dist/esm/Emitter.js.map +1 -1
- package/dist/esm/Form.js +69 -14
- package/dist/esm/Form.js.map +1 -1
- package/dist/esm/FormEntry.js +77 -52
- package/dist/esm/FormEntry.js.map +1 -1
- package/dist/esm/Fx.js +509 -874
- package/dist/esm/Fx.js.map +1 -1
- package/dist/esm/Guard.js +5 -1
- package/dist/esm/Guard.js.map +1 -1
- package/dist/esm/Idle.js +49 -39
- package/dist/esm/Idle.js.map +1 -1
- package/dist/esm/Match.js +103 -63
- package/dist/esm/Match.js.map +1 -1
- package/dist/esm/Pull.js.map +1 -1
- package/dist/esm/Push.js +159 -0
- package/dist/esm/Push.js.map +1 -0
- package/dist/esm/RefArray.js +32 -30
- package/dist/esm/RefArray.js.map +1 -1
- package/dist/esm/RefChunk.js +26 -24
- package/dist/esm/RefChunk.js.map +1 -1
- package/dist/esm/RefHashMap.js +20 -20
- package/dist/esm/RefHashMap.js.map +1 -1
- package/dist/esm/RefHashSet.js +11 -8
- package/dist/esm/RefHashSet.js.map +1 -1
- package/dist/esm/RefSubject.js +873 -150
- package/dist/esm/RefSubject.js.map +1 -1
- package/dist/esm/Sink.js +608 -57
- package/dist/esm/Sink.js.map +1 -1
- package/dist/esm/Stream.js +13 -9
- package/dist/esm/Stream.js.map +1 -1
- package/dist/esm/Subject.js +151 -56
- package/dist/esm/Subject.js.map +1 -1
- package/dist/esm/TypeId.js +9 -4
- package/dist/esm/TypeId.js.map +1 -1
- package/dist/esm/Typeclass.js +29 -29
- package/dist/esm/Typeclass.js.map +1 -1
- package/dist/esm/Versioned.js +110 -53
- package/dist/esm/Versioned.js.map +1 -1
- package/dist/esm/index.js +66 -6
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/DeferredRef.js +54 -0
- package/dist/esm/internal/DeferredRef.js.map +1 -0
- package/dist/esm/internal/UnionToTuple.js +2 -0
- package/dist/esm/internal/UnionToTuple.js.map +1 -0
- package/dist/esm/internal/core.js +1439 -719
- package/dist/esm/internal/core.js.map +1 -1
- package/dist/esm/internal/diff.js +82 -0
- package/dist/esm/internal/diff.js.map +1 -0
- package/dist/esm/internal/effect-loop-operator.js +269 -0
- package/dist/esm/internal/effect-loop-operator.js.map +1 -0
- package/dist/esm/internal/effect-operator.js +44 -37
- package/dist/esm/internal/effect-operator.js.map +1 -1
- package/dist/esm/internal/effect-producer.js +47 -0
- package/dist/esm/internal/effect-producer.js.map +1 -0
- package/dist/esm/internal/helpers.js +157 -129
- package/dist/esm/internal/helpers.js.map +1 -1
- package/dist/esm/internal/keyed.js +128 -139
- package/dist/esm/internal/keyed.js.map +1 -1
- package/dist/esm/internal/loop-operator.js +186 -0
- package/dist/esm/internal/loop-operator.js.map +1 -0
- package/dist/esm/internal/operator.js +68 -0
- package/dist/esm/internal/operator.js.map +1 -0
- package/dist/esm/internal/protos.js +16 -75
- package/dist/esm/internal/protos.js.map +1 -1
- package/dist/esm/internal/provide.js +33 -25
- package/dist/esm/internal/provide.js.map +1 -1
- package/dist/esm/internal/requestIdleCallback.js +5 -5
- package/dist/esm/internal/requestIdleCallback.js.map +1 -1
- package/dist/esm/internal/share.js +12 -12
- package/dist/esm/internal/share.js.map +1 -1
- package/dist/esm/internal/sync-operator.js +49 -21
- package/dist/esm/internal/sync-operator.js.map +1 -1
- package/dist/esm/internal/sync-producer.js +88 -0
- package/dist/esm/internal/sync-producer.js.map +1 -0
- package/dist/esm/internal/withKey.js +46 -47
- package/dist/esm/internal/withKey.js.map +1 -1
- package/package.json +22 -62
- package/src/AsyncData.ts +447 -0
- package/src/Emitter.ts +47 -38
- package/src/Form.ts +185 -65
- package/src/FormEntry.ts +142 -109
- package/src/Fx.ts +1685 -1851
- package/src/Guard.ts +12 -1
- package/src/Idle.ts +76 -62
- package/src/Match.ts +149 -93
- package/src/Pull.ts +8 -8
- package/src/Push.ts +472 -0
- package/src/RefArray.ts +53 -51
- package/src/RefChunk.ts +44 -41
- package/src/RefHashMap.ts +57 -43
- package/src/RefHashSet.ts +21 -31
- package/src/RefSubject.ts +1984 -457
- package/src/Sink.ts +922 -171
- package/src/Stream.ts +32 -20
- package/src/Subject.ts +230 -87
- package/src/TypeId.ts +16 -4
- package/src/Typeclass.ts +31 -32
- package/src/Versioned.ts +220 -168
- package/src/index.ts +78 -6
- package/src/internal/DeferredRef.ts +62 -0
- package/src/internal/UnionToTuple.ts +11 -0
- package/src/internal/core.ts +2491 -1950
- package/src/internal/diff.ts +157 -0
- package/src/internal/effect-loop-operator.ts +466 -0
- package/src/internal/effect-operator.ts +89 -54
- package/src/internal/effect-producer.ts +125 -0
- package/src/internal/helpers.ts +275 -205
- package/src/internal/keyed.ts +192 -241
- package/src/internal/loop-operator.ts +266 -0
- package/src/internal/operator.ts +87 -0
- package/src/internal/protos.ts +29 -104
- package/src/internal/provide.ts +48 -40
- package/src/internal/requestIdleCallback.ts +5 -6
- package/src/internal/share.ts +26 -24
- package/src/internal/sync-operator.ts +68 -27
- package/src/internal/sync-producer.ts +146 -0
- package/src/internal/withKey.ts +64 -74
- package/dist/cjs/Computed.js +0 -115
- package/dist/cjs/Computed.js.map +0 -1
- package/dist/cjs/Filtered.js +0 -95
- package/dist/cjs/Filtered.js.map +0 -1
- package/dist/cjs/Model.js +0 -119
- package/dist/cjs/Model.js.map +0 -1
- package/dist/cjs/RefAsyncData.js +0 -187
- package/dist/cjs/RefAsyncData.js.map +0 -1
- package/dist/cjs/RefAsyncDataArray.js +0 -38
- package/dist/cjs/RefAsyncDataArray.js.map +0 -1
- package/dist/cjs/RefBoolean.js +0 -45
- package/dist/cjs/RefBoolean.js.map +0 -1
- package/dist/cjs/RefNumber.js +0 -49
- package/dist/cjs/RefNumber.js.map +0 -1
- package/dist/cjs/internal/core-ref-subject.js +0 -254
- package/dist/cjs/internal/core-ref-subject.js.map +0 -1
- package/dist/cjs/internal/core-subject.js +0 -108
- package/dist/cjs/internal/core-subject.js.map +0 -1
- package/dist/cjs/internal/deferred-ref.js.map +0 -1
- package/dist/cjs/internal/effect-primitive.js +0 -47
- package/dist/cjs/internal/effect-primitive.js.map +0 -1
- package/dist/cjs/internal/fx-effect-proto.js +0 -58
- package/dist/cjs/internal/fx-effect-proto.js.map +0 -1
- package/dist/cjs/internal/fx-primitive.js +0 -193
- package/dist/cjs/internal/fx-primitive.js.map +0 -1
- package/dist/cjs/internal/fx.js +0 -240
- package/dist/cjs/internal/fx.js.map +0 -1
- package/dist/cjs/internal/matchers.js +0 -34
- package/dist/cjs/internal/matchers.js.map +0 -1
- package/dist/cjs/internal/run.js +0 -54
- package/dist/cjs/internal/run.js.map +0 -1
- package/dist/cjs/internal/schema-ref-subject.js +0 -132
- package/dist/cjs/internal/schema-ref-subject.js.map +0 -1
- package/dist/cjs/internal/versioned-transform.js +0 -46
- package/dist/cjs/internal/versioned-transform.js.map +0 -1
- package/dist/dts/Computed.d.ts +0 -106
- package/dist/dts/Computed.d.ts.map +0 -1
- package/dist/dts/Filtered.d.ts +0 -97
- package/dist/dts/Filtered.d.ts.map +0 -1
- package/dist/dts/Model.d.ts +0 -200
- package/dist/dts/Model.d.ts.map +0 -1
- package/dist/dts/RefAsyncData.d.ts +0 -236
- package/dist/dts/RefAsyncData.d.ts.map +0 -1
- package/dist/dts/RefAsyncDataArray.d.ts +0 -56
- package/dist/dts/RefAsyncDataArray.d.ts.map +0 -1
- package/dist/dts/RefBoolean.d.ts +0 -47
- package/dist/dts/RefBoolean.d.ts.map +0 -1
- package/dist/dts/RefNumber.d.ts +0 -48
- package/dist/dts/RefNumber.d.ts.map +0 -1
- package/dist/dts/internal/core-ref-subject.d.ts +0 -100
- package/dist/dts/internal/core-ref-subject.d.ts.map +0 -1
- package/dist/dts/internal/core-subject.d.ts +0 -5
- package/dist/dts/internal/core-subject.d.ts.map +0 -1
- package/dist/dts/internal/deferred-ref.d.ts +0 -12
- package/dist/dts/internal/deferred-ref.d.ts.map +0 -1
- package/dist/dts/internal/effect-primitive.d.ts +0 -6
- package/dist/dts/internal/effect-primitive.d.ts.map +0 -1
- package/dist/dts/internal/fx-effect-proto.d.ts +0 -30
- package/dist/dts/internal/fx-effect-proto.d.ts.map +0 -1
- package/dist/dts/internal/fx-primitive.d.ts +0 -109
- package/dist/dts/internal/fx-primitive.d.ts.map +0 -1
- package/dist/dts/internal/fx.d.ts +0 -245
- package/dist/dts/internal/fx.d.ts.map +0 -1
- package/dist/dts/internal/matchers.d.ts +0 -33
- package/dist/dts/internal/matchers.d.ts.map +0 -1
- package/dist/dts/internal/run.d.ts +0 -8
- package/dist/dts/internal/run.d.ts.map +0 -1
- package/dist/dts/internal/schema-ref-subject.d.ts +0 -5
- package/dist/dts/internal/schema-ref-subject.d.ts.map +0 -1
- package/dist/dts/internal/versioned-transform.d.ts +0 -17
- package/dist/dts/internal/versioned-transform.d.ts.map +0 -1
- package/dist/esm/Computed.js +0 -103
- package/dist/esm/Computed.js.map +0 -1
- package/dist/esm/Filtered.js +0 -83
- package/dist/esm/Filtered.js.map +0 -1
- package/dist/esm/Model.js +0 -100
- package/dist/esm/Model.js.map +0 -1
- package/dist/esm/RefAsyncData.js +0 -163
- package/dist/esm/RefAsyncData.js.map +0 -1
- package/dist/esm/RefAsyncDataArray.js +0 -27
- package/dist/esm/RefAsyncDataArray.js.map +0 -1
- package/dist/esm/RefBoolean.js +0 -31
- package/dist/esm/RefBoolean.js.map +0 -1
- package/dist/esm/RefNumber.js +0 -35
- package/dist/esm/RefNumber.js.map +0 -1
- package/dist/esm/internal/core-ref-subject.js +0 -242
- package/dist/esm/internal/core-ref-subject.js.map +0 -1
- package/dist/esm/internal/core-subject.js +0 -90
- package/dist/esm/internal/core-subject.js.map +0 -1
- package/dist/esm/internal/deferred-ref.js +0 -23
- package/dist/esm/internal/deferred-ref.js.map +0 -1
- package/dist/esm/internal/effect-primitive.js +0 -41
- package/dist/esm/internal/effect-primitive.js.map +0 -1
- package/dist/esm/internal/fx-effect-proto.js +0 -43
- package/dist/esm/internal/fx-effect-proto.js.map +0 -1
- package/dist/esm/internal/fx-primitive.js +0 -175
- package/dist/esm/internal/fx-primitive.js.map +0 -1
- package/dist/esm/internal/fx.js +0 -216
- package/dist/esm/internal/fx.js.map +0 -1
- package/dist/esm/internal/matchers.js +0 -38
- package/dist/esm/internal/matchers.js.map +0 -1
- package/dist/esm/internal/run.js +0 -32
- package/dist/esm/internal/run.js.map +0 -1
- package/dist/esm/internal/schema-ref-subject.js +0 -121
- package/dist/esm/internal/schema-ref-subject.js.map +0 -1
- package/dist/esm/internal/versioned-transform.js +0 -37
- package/dist/esm/internal/versioned-transform.js.map +0 -1
- package/src/Computed.ts +0 -289
- package/src/Filtered.ts +0 -274
- package/src/Model.ts +0 -483
- package/src/RefAsyncData.ts +0 -547
- package/src/RefAsyncDataArray.ts +0 -135
- package/src/RefBoolean.ts +0 -71
- package/src/RefNumber.ts +0 -77
- package/src/internal/core-ref-subject.ts +0 -528
- package/src/internal/core-subject.ts +0 -143
- package/src/internal/deferred-ref.ts +0 -26
- package/src/internal/effect-primitive.ts +0 -230
- package/src/internal/fx-effect-proto.ts +0 -56
- package/src/internal/fx-primitive.ts +0 -223
- package/src/internal/fx.ts +0 -619
- package/src/internal/matchers.ts +0 -83
- package/src/internal/run.ts +0 -51
- package/src/internal/schema-ref-subject.ts +0 -163
- package/src/internal/versioned-transform.ts +0 -48
package/src/Sink.ts
CHANGED
|
@@ -1,115 +1,81 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sink is a data structure
|
|
3
|
-
*
|
|
4
|
-
* @since 1.18.0
|
|
2
|
+
* Sink is a data structure which can be used to consume values from a stream.
|
|
3
|
+
* @since 1.20.0
|
|
5
4
|
*/
|
|
6
5
|
|
|
7
|
-
import
|
|
6
|
+
import * as C from "@typed/context"
|
|
7
|
+
import type { Predicate, Tracer } from "effect"
|
|
8
8
|
import * as Cause from "effect/Cause"
|
|
9
9
|
import * as Clock from "effect/Clock"
|
|
10
10
|
import * as Effect from "effect/Effect"
|
|
11
|
-
import * as Either from "effect/Either"
|
|
12
11
|
import { dual } from "effect/Function"
|
|
13
|
-
import
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
* Sink is a data structure that represents a place to send failures and successes
|
|
17
|
-
* over time in an effectful manner.
|
|
18
|
-
* @since 1.18.0
|
|
19
|
-
* @category models
|
|
20
|
-
*/
|
|
21
|
-
export interface Sink<E, A> extends WithContext<never, E, A> {}
|
|
12
|
+
import * as Layer from "effect/Layer"
|
|
13
|
+
import * as Option from "effect/Option"
|
|
14
|
+
import { type Bounds } from "./internal/bounds.js"
|
|
22
15
|
|
|
23
16
|
/**
|
|
24
|
-
*
|
|
25
|
-
* @since 1.
|
|
26
|
-
* @category constructors
|
|
17
|
+
* Sink is a data structure which can be used to consume values from a stream.
|
|
18
|
+
* @since 1.20.0
|
|
27
19
|
*/
|
|
28
|
-
export
|
|
29
|
-
onFailure
|
|
30
|
-
onSuccess
|
|
31
|
-
): Sink<E, A> {
|
|
32
|
-
return {
|
|
33
|
-
onFailure,
|
|
34
|
-
onSuccess
|
|
35
|
-
}
|
|
20
|
+
export interface Sink<out R, in E, in A> {
|
|
21
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown>
|
|
22
|
+
onSuccess(value: A): Effect.Effect<R, never, unknown>
|
|
36
23
|
}
|
|
37
24
|
|
|
38
25
|
/**
|
|
39
|
-
* @since 1.
|
|
26
|
+
* @since 1.20.0
|
|
40
27
|
*/
|
|
41
28
|
export namespace Sink {
|
|
42
29
|
/**
|
|
43
|
-
*
|
|
44
|
-
|
|
30
|
+
* @since 1.20.0
|
|
31
|
+
*/
|
|
32
|
+
export type Context<T> = T extends Sink<infer R, infer _E, infer _A> ? R : never
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @since 1.20.0
|
|
45
36
|
*/
|
|
46
|
-
export type Error<T> = T extends Sink<infer E,
|
|
37
|
+
export type Error<T> = T extends Sink<infer _R, infer E, infer _A> ? E : never
|
|
47
38
|
|
|
48
39
|
/**
|
|
49
|
-
*
|
|
50
|
-
* @since 1.18.0
|
|
40
|
+
* @since 1.20.0
|
|
51
41
|
*/
|
|
52
|
-
export type Success<T> = T extends Sink<
|
|
42
|
+
export type Success<T> = T extends Sink<infer _R, infer _E, infer A> ? A : never
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @since 1.20.0
|
|
46
|
+
*/
|
|
47
|
+
export interface Tagged<I, E, A> extends Sink<I, E, A> {
|
|
48
|
+
readonly tag: C.Tagged<I, Sink<never, E, A>>
|
|
49
|
+
readonly make: <R>(sink: Sink<R, E, A>) => Layer.Layer<R, never, I>
|
|
50
|
+
}
|
|
53
51
|
}
|
|
54
52
|
|
|
55
53
|
/**
|
|
56
|
-
*
|
|
57
|
-
* @since 1.18.0
|
|
58
|
-
* @category models
|
|
54
|
+
* @since 1.20.0
|
|
59
55
|
*/
|
|
60
|
-
export
|
|
61
|
-
readonly onFailure: (cause: Cause.Cause<E>) => Effect.Effect<R, never, unknown>
|
|
62
|
-
readonly onSuccess: (a: A) => Effect.Effect<R, never, unknown>
|
|
63
|
-
}
|
|
56
|
+
export type Context<T> = Sink.Context<T>
|
|
64
57
|
|
|
65
58
|
/**
|
|
66
|
-
*
|
|
67
|
-
* @since 1.18.0
|
|
68
|
-
* @category constructors
|
|
59
|
+
* @since 1.20.0
|
|
69
60
|
*/
|
|
70
|
-
export
|
|
71
|
-
onFailure: (cause: Cause.Cause<E>) => Effect.Effect<R, never, unknown>,
|
|
72
|
-
onSuccess: (a: A) => Effect.Effect<R2, never, unknown>
|
|
73
|
-
): WithContext<R | R2, E, A> {
|
|
74
|
-
return {
|
|
75
|
-
onFailure,
|
|
76
|
-
onSuccess
|
|
77
|
-
}
|
|
78
|
-
}
|
|
61
|
+
export type Error<T> = Sink.Error<T>
|
|
79
62
|
|
|
80
63
|
/**
|
|
81
|
-
* @since 1.
|
|
64
|
+
* @since 1.20.0
|
|
82
65
|
*/
|
|
83
|
-
export
|
|
84
|
-
/**
|
|
85
|
-
* Extract the Context type from a Sink
|
|
86
|
-
* @since 1.18.0
|
|
87
|
-
*/
|
|
88
|
-
export type Context<T> = T extends WithContext<infer R, any, any> ? R : never
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Extract the Error type from a Sink
|
|
92
|
-
* @since 1.18.0
|
|
93
|
-
*/
|
|
94
|
-
export type Error<T> = T extends WithContext<any, infer E, any> ? E : never
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Extract the Success type from a Sink
|
|
98
|
-
* @since 1.18.0
|
|
99
|
-
*/
|
|
100
|
-
export type Success<T> = T extends WithContext<any, any, infer A> ? A : never
|
|
101
|
-
}
|
|
66
|
+
export type Success<T> = Sink.Success<T>
|
|
102
67
|
|
|
103
68
|
/**
|
|
104
|
-
*
|
|
105
|
-
* @since 1.18.0
|
|
106
|
-
* @category context
|
|
69
|
+
* @since 1.20.0
|
|
107
70
|
*/
|
|
108
|
-
export function
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
71
|
+
export function make<E, R, A, R2>(
|
|
72
|
+
onFailure: (cause: Cause.Cause<E>) => Effect.Effect<R, never, unknown>,
|
|
73
|
+
onSuccess: (value: A) => Effect.Effect<R2, never, unknown>
|
|
74
|
+
): Sink<R | R2, E, A> {
|
|
75
|
+
return {
|
|
76
|
+
onFailure,
|
|
77
|
+
onSuccess
|
|
78
|
+
}
|
|
113
79
|
}
|
|
114
80
|
|
|
115
81
|
/**
|
|
@@ -118,137 +84,858 @@ export function provide<R, E, A>(sink: WithContext<R, E, A>, ctx: Context<R>): S
|
|
|
118
84
|
* @since 1.18.0
|
|
119
85
|
* @category models
|
|
120
86
|
*/
|
|
121
|
-
export interface WithEarlyExit<E, A> extends Sink<E, A> {
|
|
87
|
+
export interface WithEarlyExit<R, E, A> extends Sink<R, E, A> {
|
|
122
88
|
readonly earlyExit: Effect.Effect<never, never, void>
|
|
123
89
|
}
|
|
124
90
|
|
|
91
|
+
/**
|
|
92
|
+
* @since 1.20.0
|
|
93
|
+
*/
|
|
94
|
+
export function withEarlyExit<R, E, A, R2, B>(
|
|
95
|
+
sink: Sink<R, E, A>,
|
|
96
|
+
f: (sink: WithEarlyExit<R, E, A>) => Effect.Effect<R2, E, B>
|
|
97
|
+
): Effect.Effect<R | R2, never, void> {
|
|
98
|
+
return Effect.asyncEffect<never, never, void, R | R2, never, void>((resume) => {
|
|
99
|
+
const earlyExit: WithEarlyExit<R, E, A> = {
|
|
100
|
+
...sink,
|
|
101
|
+
earlyExit: Effect.sync(() => resume(Effect.unit))
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return Effect.matchCauseEffect(f(earlyExit), {
|
|
105
|
+
onFailure: (cause) => sink.onFailure(cause),
|
|
106
|
+
onSuccess: () => earlyExit.earlyExit
|
|
107
|
+
})
|
|
108
|
+
})
|
|
109
|
+
}
|
|
110
|
+
|
|
125
111
|
/**
|
|
126
112
|
* Transform the input value of a Sink.
|
|
127
113
|
* @since 1.18.0
|
|
128
114
|
* @category combinators
|
|
129
115
|
*/
|
|
130
116
|
export const map: {
|
|
131
|
-
<B, A>(f: (b: B) => A): <R, E>(sink:
|
|
132
|
-
<R, E, A, B>(sink:
|
|
117
|
+
<B, A>(f: (b: B) => A): <R, E>(sink: Sink<R, E, A>) => Sink<R, E, B>
|
|
118
|
+
<R, E, A, B>(sink: Sink<R, E, A>, f: (b: B) => A): Sink<R, E, B>
|
|
133
119
|
} = dual(2, function map<R, E, A, B>(
|
|
134
|
-
sink:
|
|
120
|
+
sink: Sink<R, E, A>,
|
|
135
121
|
f: (b: B) => A
|
|
136
|
-
):
|
|
137
|
-
return
|
|
138
|
-
sink.onFailure,
|
|
139
|
-
(a) => sink.onSuccess(f(a))
|
|
140
|
-
)
|
|
122
|
+
): Sink<R, E, B> {
|
|
123
|
+
return new MapSink(sink, f)
|
|
141
124
|
})
|
|
142
125
|
|
|
126
|
+
class MapSink<R, E, A, B> implements Sink<R, E, A> {
|
|
127
|
+
constructor(
|
|
128
|
+
readonly sink: Sink<R, E, B>,
|
|
129
|
+
readonly f: (a: A) => B
|
|
130
|
+
) {
|
|
131
|
+
this.onFailure = this.onFailure.bind(this)
|
|
132
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
|
|
136
|
+
return this.sink.onFailure(cause)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
onSuccess(value: A) {
|
|
140
|
+
return this.sink.onSuccess(this.f(value))
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
143
144
|
/**
|
|
144
|
-
*
|
|
145
|
-
|
|
146
|
-
|
|
145
|
+
* @since 1.20.0
|
|
146
|
+
*/
|
|
147
|
+
export function filter<R, E, A>(sink: Sink<R, E, A>, predicate: Predicate.Predicate<A>): Sink<R, E, A> {
|
|
148
|
+
return new FilterSink(sink, predicate)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
class FilterSink<R, E, A> implements Sink<R, E, A> {
|
|
152
|
+
constructor(
|
|
153
|
+
readonly sink: Sink<R, E, A>,
|
|
154
|
+
readonly predicate: Predicate.Predicate<A>
|
|
155
|
+
) {
|
|
156
|
+
this.onFailure = this.onFailure.bind(this)
|
|
157
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
|
|
161
|
+
return this.sink.onFailure(cause)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
onSuccess(value: A) {
|
|
165
|
+
if (this.predicate(value)) return this.sink.onSuccess(value)
|
|
166
|
+
else return Effect.unit
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @since 1.20.0
|
|
172
|
+
*/
|
|
173
|
+
export function filterMap<R, E, A, B>(sink: Sink<R, E, B>, f: (a: A) => Option.Option<B>): Sink<R, E, A> {
|
|
174
|
+
return new FilterMapSink(sink, f)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
class FilterMapSink<R, E, A, B> implements Sink<R, E, A> {
|
|
178
|
+
constructor(
|
|
179
|
+
readonly sink: Sink<R, E, B>,
|
|
180
|
+
readonly f: (a: A) => Option.Option<B>
|
|
181
|
+
) {
|
|
182
|
+
this.onFailure = this.onFailure.bind(this)
|
|
183
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
|
|
187
|
+
return this.sink.onFailure(cause)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
onSuccess(value: A) {
|
|
191
|
+
const option = this.f(value)
|
|
192
|
+
if (Option.isSome(option)) return this.sink.onSuccess(option.value)
|
|
193
|
+
else return Effect.unit
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* @since 1.20.0
|
|
147
199
|
*/
|
|
148
200
|
export const mapEffect: {
|
|
149
|
-
<B, R2,
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
sink:
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
)
|
|
201
|
+
<B, R2, E2, A>(f: (b: B) => Effect.Effect<R2, E2, A>): <R, E>(
|
|
202
|
+
sink: Sink<R, E | E2, A>
|
|
203
|
+
) => Sink<R | R2, E | E2, B>
|
|
204
|
+
<R, E, A, R2, E2, B>(sink: Sink<R, E | E2, A>, f: (b: B) => Effect.Effect<R2, E2, A>): Sink<R | R2, E | E2, B>
|
|
205
|
+
} = dual(2, function mapEffect<R, E, A, R2, E2, B>(
|
|
206
|
+
sink: Sink<R, E | E2, A>,
|
|
207
|
+
f: (b: B) => Effect.Effect<R2, E2, A>
|
|
208
|
+
): Sink<R | R2, E | E2, B> {
|
|
209
|
+
return new MapEffectSink(sink, f)
|
|
159
210
|
})
|
|
160
211
|
|
|
212
|
+
class MapEffectSink<R, E, A, R2, E2, B> implements Sink<R | R2, E2, B> {
|
|
213
|
+
constructor(
|
|
214
|
+
readonly sink: Sink<R, E | E2, A>,
|
|
215
|
+
readonly f: (b: B) => Effect.Effect<R2, E2, A>
|
|
216
|
+
) {
|
|
217
|
+
this.onFailure = this.onFailure.bind(this)
|
|
218
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
onFailure(cause: Cause.Cause<E2>): Effect.Effect<R | R2, never, unknown> {
|
|
222
|
+
return this.sink.onFailure(cause)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
onSuccess(value: B) {
|
|
226
|
+
return Effect.matchCauseEffect(this.f(value), this.sink)
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
161
230
|
/**
|
|
162
|
-
*
|
|
163
|
-
* @since 1.18.0
|
|
164
|
-
* @category combinators
|
|
231
|
+
* @since 1.20.0
|
|
165
232
|
*/
|
|
166
|
-
export const
|
|
167
|
-
<
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
233
|
+
export const filterMapEffect: {
|
|
234
|
+
<B, R2, E2, A>(f: (b: B) => Effect.Effect<R2, E2, Option.Option<A>>): <R, E>(
|
|
235
|
+
sink: Sink<R, E | E2, A>
|
|
236
|
+
) => Sink<R | R2, E | E2, B>
|
|
237
|
+
|
|
238
|
+
<R, E, A, R2, E2, B>(
|
|
239
|
+
sink: Sink<R, E | E2, A>,
|
|
240
|
+
f: (b: B) => Effect.Effect<R2, E2, Option.Option<A>>
|
|
241
|
+
): Sink<R | R2, E | E2, B>
|
|
242
|
+
} = dual(2, function filterMapEffect<R, E, A, R2, E2, B>(
|
|
243
|
+
sink: Sink<R, E | E2, A>,
|
|
244
|
+
f: (b: B) => Effect.Effect<R2, E2, Option.Option<A>>
|
|
245
|
+
): Sink<R | R2, E | E2, B> {
|
|
246
|
+
return new FilterMapEffectSink(sink, f)
|
|
177
247
|
})
|
|
178
248
|
|
|
249
|
+
class FilterMapEffectSink<R, E, A, R2, E2, B> implements Sink<R | R2, E2, B> {
|
|
250
|
+
constructor(
|
|
251
|
+
readonly sink: Sink<R, E | E2, A>,
|
|
252
|
+
readonly f: (b: B) => Effect.Effect<R2, E2, Option.Option<A>>
|
|
253
|
+
) {
|
|
254
|
+
this.onFailure = this.onFailure.bind(this)
|
|
255
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
onFailure(cause: Cause.Cause<E2>): Effect.Effect<R | R2, never, unknown> {
|
|
259
|
+
return this.sink.onFailure(cause)
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
onSuccess(value: B) {
|
|
263
|
+
return Effect.matchCauseEffect(this.f(value), {
|
|
264
|
+
onFailure: (cause) => this.sink.onFailure(cause),
|
|
265
|
+
onSuccess: (option) => {
|
|
266
|
+
if (Option.isSome(option)) return this.sink.onSuccess(option.value)
|
|
267
|
+
else return Effect.unit
|
|
268
|
+
}
|
|
269
|
+
})
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
179
273
|
/**
|
|
180
|
-
*
|
|
181
|
-
* @since 1.18.0
|
|
182
|
-
* @category combinators
|
|
274
|
+
* @since 1.20.0
|
|
183
275
|
*/
|
|
184
|
-
export const
|
|
185
|
-
<
|
|
186
|
-
|
|
187
|
-
)
|
|
276
|
+
export const filterEffect: {
|
|
277
|
+
<A, R2, E2>(f: (a: A) => Effect.Effect<R2, E2, boolean>): <R, E>(
|
|
278
|
+
sink: Sink<R, E | E2, A>
|
|
279
|
+
) => Sink<R | R2, E | E2, A>
|
|
280
|
+
<R, E, A>(sink: Sink<R, E, A>, f: (a: A) => Effect.Effect<R, E, boolean>): Sink<R, E, A>
|
|
281
|
+
} = dual(2, function filterEffect<R, E, A, R2>(
|
|
282
|
+
sink: Sink<R, E, A>,
|
|
283
|
+
f: (a: A) => Effect.Effect<R2, E, boolean>
|
|
284
|
+
): Sink<R | R2, E, A> {
|
|
285
|
+
return new FilterEffectSink<R | R2, E, A>(sink, f)
|
|
286
|
+
})
|
|
287
|
+
|
|
288
|
+
class FilterEffectSink<R, E, A> implements Sink<R, E, A> {
|
|
289
|
+
constructor(
|
|
290
|
+
readonly sink: Sink<R, E, A>,
|
|
291
|
+
readonly f: (a: A) => Effect.Effect<R, E, boolean>
|
|
292
|
+
) {
|
|
293
|
+
this.onFailure = this.onFailure.bind(this)
|
|
294
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
|
|
298
|
+
return this.sink.onFailure(cause)
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
onSuccess(value: A) {
|
|
302
|
+
return Effect.matchCauseEffect(this.f(value), {
|
|
303
|
+
onFailure: (cause) => this.sink.onFailure(cause),
|
|
304
|
+
onSuccess: (b) => {
|
|
305
|
+
if (b) return this.sink.onSuccess(value)
|
|
306
|
+
else return Effect.unit
|
|
307
|
+
}
|
|
308
|
+
})
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* @since 1.20.0
|
|
314
|
+
*/
|
|
315
|
+
export const tapEffect: {
|
|
316
|
+
<A, R2, E2>(f: (a: A) => Effect.Effect<R2, E2, unknown>): <R, E>(
|
|
317
|
+
sink: Sink<R, E | E2, A>
|
|
318
|
+
) => Sink<R | R2, E | E2, A>
|
|
319
|
+
<R, E, A, R2, E2>(sink: Sink<R, E | E2, A>, f: (a: A) => Effect.Effect<R2, E2, unknown>): Sink<R | R2, E | E2, A>
|
|
320
|
+
} = dual(2, function tapEffect<R, E, A, R2, E2>(
|
|
321
|
+
sink: Sink<R, E | E2, A>,
|
|
322
|
+
f: (a: A) => Effect.Effect<R2, E2, unknown>
|
|
323
|
+
): Sink<R | R2, E | E2, A> {
|
|
324
|
+
return new TapEffectSink(sink, f)
|
|
325
|
+
})
|
|
326
|
+
|
|
327
|
+
class TapEffectSink<R, E, A, R2, E2> implements Sink<R | R2, E, A> {
|
|
328
|
+
constructor(
|
|
329
|
+
readonly sink: Sink<R, E | E2, A>,
|
|
330
|
+
readonly f: (a: A) => Effect.Effect<R2, E2, unknown>
|
|
331
|
+
) {
|
|
332
|
+
this.onFailure = this.onFailure.bind(this)
|
|
333
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R | R2, never, unknown> {
|
|
337
|
+
return this.sink.onFailure(cause)
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
onSuccess(value: A) {
|
|
341
|
+
return Effect.matchCauseEffect(this.f(value), {
|
|
342
|
+
onFailure: (cause) => this.sink.onFailure(cause),
|
|
343
|
+
onSuccess: () => this.sink.onSuccess(value)
|
|
344
|
+
})
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* @since 1.20.0
|
|
350
|
+
*/
|
|
351
|
+
export const loop: {
|
|
352
|
+
<B, A, C>(seed: B, f: (acc: B, a: A) => readonly [C, B]): <R, E>(
|
|
353
|
+
sink: Sink<R, E, C>
|
|
354
|
+
) => Sink<R, E, A>
|
|
355
|
+
<R, E, A, B, C>(sink: Sink<R, E, C>, seed: B, f: (acc: B, a: A) => readonly [C, B]): Sink<R, E, A>
|
|
356
|
+
} = dual(3, function loop<R, E, A, B, C>(
|
|
357
|
+
sink: Sink<R, E, C>,
|
|
358
|
+
seed: B,
|
|
359
|
+
f: (acc: B, a: A) => readonly [C, B]
|
|
360
|
+
): Sink<R, E, A> {
|
|
361
|
+
return new LoopSink(sink, seed, f)
|
|
362
|
+
})
|
|
363
|
+
|
|
364
|
+
class LoopSink<R, E, A, B, C> implements Sink<R, E, A> {
|
|
365
|
+
constructor(
|
|
366
|
+
readonly sink: Sink<R, E, C>,
|
|
367
|
+
private seed: B,
|
|
368
|
+
readonly f: (acc: B, a: A) => readonly [C, B]
|
|
369
|
+
) {
|
|
370
|
+
this.onFailure = this.onFailure.bind(this)
|
|
371
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
|
|
375
|
+
return this.sink.onFailure(cause)
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
onSuccess(value: A) {
|
|
379
|
+
const [c, acc] = this.f(this.seed, value)
|
|
380
|
+
this.seed = acc
|
|
381
|
+
return this.sink.onSuccess(c)
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* @since 1.20.0
|
|
387
|
+
*/
|
|
388
|
+
export const loopCause: {
|
|
389
|
+
<B, A, C>(seed: B, f: (acc: B, a: Cause.Cause<A>) => readonly [Cause.Cause<C>, B]): <R, E>(
|
|
390
|
+
sink: Sink<R, C, A>
|
|
391
|
+
) => Sink<R, E, A>
|
|
392
|
+
<R, E, A, B, C>(
|
|
393
|
+
sink: Sink<R, C, A>,
|
|
394
|
+
seed: B,
|
|
395
|
+
f: (acc: B, a: Cause.Cause<E>) => readonly [Cause.Cause<C>, B]
|
|
396
|
+
): Sink<R, E, A>
|
|
397
|
+
} = dual(3, function loopCause<R, E, A, B, C>(
|
|
398
|
+
sink: Sink<R, C, A>,
|
|
399
|
+
seed: B,
|
|
400
|
+
f: (acc: B, a: Cause.Cause<E>) => readonly [Cause.Cause<C>, B]
|
|
401
|
+
): Sink<R, E, A> {
|
|
402
|
+
return new LoopCauseSink(sink, seed, f)
|
|
403
|
+
})
|
|
404
|
+
|
|
405
|
+
class LoopCauseSink<R, E, A, B, C> implements Sink<R, E, A> {
|
|
406
|
+
constructor(
|
|
407
|
+
readonly sink: Sink<R, C, A>,
|
|
408
|
+
private seed: B,
|
|
409
|
+
readonly f: (acc: B, a: Cause.Cause<E>) => readonly [Cause.Cause<C>, B]
|
|
410
|
+
) {
|
|
411
|
+
this.onFailure = this.onFailure.bind(this)
|
|
412
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
|
|
416
|
+
const [c, acc] = this.f(this.seed, cause)
|
|
417
|
+
this.seed = acc
|
|
418
|
+
return this.sink.onFailure(c)
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
onSuccess(value: A) {
|
|
422
|
+
return this.sink.onSuccess(value)
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* @since 1.20.0
|
|
428
|
+
*/
|
|
429
|
+
export const filterMapLoop: {
|
|
430
|
+
<B, A, C>(seed: B, f: (acc: B, a: A) => readonly [Option.Option<C>, B]): <R, E>(
|
|
431
|
+
sink: Sink<R, E, C>
|
|
432
|
+
) => Sink<R, E, A>
|
|
433
|
+
<R, E, A, B, C>(sink: Sink<R, E, C>, seed: B, f: (acc: B, a: A) => readonly [Option.Option<C>, B]): Sink<R, E, A>
|
|
434
|
+
} = dual(3, function filterMapLoop<R, E, A, B, C>(
|
|
435
|
+
sink: Sink<R, E, C>,
|
|
436
|
+
seed: B,
|
|
437
|
+
f: (acc: B, a: A) => readonly [Option.Option<C>, B]
|
|
438
|
+
): Sink<R, E, A> {
|
|
439
|
+
return new FilterMapLoopSink(sink, seed, f)
|
|
440
|
+
})
|
|
441
|
+
|
|
442
|
+
class FilterMapLoopSink<R, E, A, B, C> implements Sink<R, E, A> {
|
|
443
|
+
constructor(
|
|
444
|
+
readonly sink: Sink<R, E, C>,
|
|
445
|
+
private seed: B,
|
|
446
|
+
readonly f: (acc: B, a: A) => readonly [Option.Option<C>, B]
|
|
447
|
+
) {
|
|
448
|
+
this.onFailure = this.onFailure.bind(this)
|
|
449
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
|
|
453
|
+
return this.sink.onFailure(cause)
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
onSuccess(value: A) {
|
|
457
|
+
const [option, acc] = this.f(this.seed, value)
|
|
458
|
+
this.seed = acc
|
|
459
|
+
if (Option.isSome(option)) return this.sink.onSuccess(option.value)
|
|
460
|
+
else return Effect.unit
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* @since 1.20.0
|
|
466
|
+
*/
|
|
467
|
+
export const filterMapLoopCause: {
|
|
468
|
+
<B, A, C>(seed: B, f: (acc: B, a: Cause.Cause<A>) => readonly [Option.Option<Cause.Cause<C>>, B]): <R, E>(
|
|
469
|
+
sink: Sink<R, C, A>
|
|
470
|
+
) => Sink<R, E, A>
|
|
471
|
+
<R, E, A, B, C>(
|
|
472
|
+
sink: Sink<R, C, A>,
|
|
473
|
+
seed: B,
|
|
474
|
+
f: (acc: B, a: Cause.Cause<E>) => readonly [Option.Option<Cause.Cause<C>>, B]
|
|
475
|
+
): Sink<R, E, A>
|
|
476
|
+
} = dual(3, function filterMapLoopCause<R, E, A, B, C>(
|
|
477
|
+
sink: Sink<R, C, A>,
|
|
478
|
+
seed: B,
|
|
479
|
+
f: (acc: B, a: Cause.Cause<E>) => readonly [Option.Option<Cause.Cause<C>>, B]
|
|
480
|
+
): Sink<R, E, A> {
|
|
481
|
+
return new FilterMapLoopCauseSink(sink, seed, f)
|
|
482
|
+
})
|
|
483
|
+
|
|
484
|
+
class FilterMapLoopCauseSink<R, E, A, B, C> implements Sink<R, E, A> {
|
|
485
|
+
constructor(
|
|
486
|
+
readonly sink: Sink<R, C, A>,
|
|
487
|
+
private seed: B,
|
|
488
|
+
readonly f: (acc: B, a: Cause.Cause<E>) => readonly [Option.Option<Cause.Cause<C>>, B]
|
|
489
|
+
) {
|
|
490
|
+
this.onFailure = this.onFailure.bind(this)
|
|
491
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
|
|
495
|
+
const [option, acc] = this.f(this.seed, cause)
|
|
496
|
+
this.seed = acc
|
|
497
|
+
if (Option.isSome(option)) return this.sink.onFailure(option.value)
|
|
498
|
+
else return Effect.unit
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
onSuccess(value: A) {
|
|
502
|
+
return this.sink.onSuccess(value)
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* @since 1.20.0
|
|
508
|
+
*/
|
|
509
|
+
export const loopEffect: {
|
|
510
|
+
<B, A, R2, E2, C>(seed: B, f: (acc: B, a: A) => Effect.Effect<R2, E2, readonly [C, B]>): <R, E>(
|
|
511
|
+
sink: Sink<R, E, C>
|
|
512
|
+
) => Sink<R | R2, E | E2, A>
|
|
513
|
+
<R, E, A, B, C>(
|
|
514
|
+
sink: Sink<R, E, C>,
|
|
515
|
+
seed: B,
|
|
516
|
+
f: (acc: B, a: A) => Effect.Effect<R, E, readonly [C, B]>
|
|
517
|
+
): Sink<R, E, A>
|
|
518
|
+
} = dual(3, function loopEffect<R, E, A, B, C>(
|
|
519
|
+
sink: Sink<R, E, C>,
|
|
520
|
+
seed: B,
|
|
521
|
+
f: (acc: B, a: A) => Effect.Effect<R, E, readonly [C, B]>
|
|
522
|
+
): Sink<R, E, A> {
|
|
523
|
+
return new LoopEffectSink(sink, seed, f)
|
|
524
|
+
})
|
|
525
|
+
|
|
526
|
+
class LoopEffectSink<R, E, A, B, C> implements Sink<R, E, A> {
|
|
527
|
+
constructor(
|
|
528
|
+
readonly sink: Sink<R, E, C>,
|
|
529
|
+
private seed: B,
|
|
530
|
+
readonly f: (acc: B, a: A) => Effect.Effect<R, E, readonly [C, B]>
|
|
531
|
+
) {
|
|
532
|
+
this.onFailure = this.onFailure.bind(this)
|
|
533
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
|
|
537
|
+
return this.sink.onFailure(cause)
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
onSuccess(value: A) {
|
|
541
|
+
return Effect.matchCauseEffect(this.f(this.seed, value), {
|
|
542
|
+
onFailure: (cause) => this.sink.onFailure(cause),
|
|
543
|
+
onSuccess: ([c, acc]) => {
|
|
544
|
+
this.seed = acc
|
|
545
|
+
return this.sink.onSuccess(c)
|
|
546
|
+
}
|
|
547
|
+
})
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* @since 1.20.0
|
|
553
|
+
*/
|
|
554
|
+
export const filterMapLoopEffect: {
|
|
555
|
+
<B, A, R2, E2, C>(seed: B, f: (acc: B, a: A) => Effect.Effect<R2, E2, readonly [Option.Option<C>, B]>): <R, E>(
|
|
556
|
+
sink: Sink<R, E, C>
|
|
557
|
+
) => Sink<R | R2, E | E2, A>
|
|
558
|
+
<R, E, A, B, R2, C>(
|
|
559
|
+
sink: Sink<R, E, C>,
|
|
560
|
+
seed: B,
|
|
561
|
+
f: (acc: B, a: A) => Effect.Effect<R2, E, readonly [Option.Option<C>, B]>
|
|
562
|
+
): Sink<R | R2, E, A>
|
|
563
|
+
} = dual(3, function filterMapLoopEffect<R, E, A, B, R2, C>(
|
|
564
|
+
sink: Sink<R, E, C>,
|
|
565
|
+
seed: B,
|
|
566
|
+
f: (acc: B, a: A) => Effect.Effect<R2, E, readonly [Option.Option<C>, B]>
|
|
567
|
+
): Sink<R | R2, E, A> {
|
|
568
|
+
return new FilterMapLoopEffectSink(sink, seed, f)
|
|
569
|
+
})
|
|
570
|
+
|
|
571
|
+
class FilterMapLoopEffectSink<R, E, A, B, R2, C> implements Sink<R | R2, E, A> {
|
|
572
|
+
constructor(
|
|
573
|
+
readonly sink: Sink<R, E, C>,
|
|
574
|
+
private seed: B,
|
|
575
|
+
readonly f: (acc: B, a: A) => Effect.Effect<R2, E, readonly [Option.Option<C>, B]>
|
|
576
|
+
) {
|
|
577
|
+
this.onFailure = this.onFailure.bind(this)
|
|
578
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
|
|
582
|
+
return this.sink.onFailure(cause)
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
onSuccess(value: A) {
|
|
586
|
+
return Effect.matchCauseEffect(this.f(this.seed, value), {
|
|
587
|
+
onFailure: (cause) => this.sink.onFailure(cause),
|
|
588
|
+
onSuccess: ([option, acc]) => {
|
|
589
|
+
this.seed = acc
|
|
590
|
+
if (Option.isSome(option)) return this.sink.onSuccess(option.value)
|
|
591
|
+
else return Effect.unit
|
|
592
|
+
}
|
|
593
|
+
})
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/**
|
|
598
|
+
* @since 1.20.0
|
|
599
|
+
*/
|
|
600
|
+
export const loopCauseEffect: {
|
|
601
|
+
<B, A, R2, E2, C>(
|
|
602
|
+
seed: B,
|
|
603
|
+
f: (acc: B, a: Cause.Cause<A>) => Effect.Effect<R2, E2, readonly [Cause.Cause<C>, B]>
|
|
604
|
+
): <R, E>(
|
|
605
|
+
sink: Sink<R, E | C, A>
|
|
606
|
+
) => Sink<R, E | C, A>
|
|
607
|
+
<R, E, A, B, C>(
|
|
608
|
+
sink: Sink<R, E | C, A>,
|
|
609
|
+
seed: B,
|
|
610
|
+
f: (acc: B, a: Cause.Cause<E>) => Effect.Effect<R, E, readonly [Cause.Cause<C>, B]>
|
|
611
|
+
): Sink<R, E | C, A>
|
|
612
|
+
} = dual(3, function loopCauseEffect<R, E, A, B, C>(
|
|
613
|
+
sink: Sink<R, E | C, A>,
|
|
614
|
+
seed: B,
|
|
615
|
+
f: (acc: B, a: Cause.Cause<E>) => Effect.Effect<R, E, readonly [Cause.Cause<C>, B]>
|
|
616
|
+
): Sink<R, E | C, A> {
|
|
617
|
+
return new LoopCauseEffectSink(sink, seed, f)
|
|
618
|
+
})
|
|
619
|
+
|
|
620
|
+
class LoopCauseEffectSink<R, E, A, B, C> implements Sink<R, E, A> {
|
|
621
|
+
constructor(
|
|
622
|
+
readonly sink: Sink<R, E | C, A>,
|
|
623
|
+
private seed: B,
|
|
624
|
+
readonly f: (acc: B, a: Cause.Cause<E>) => Effect.Effect<R, E, readonly [Cause.Cause<C>, B]>
|
|
625
|
+
) {
|
|
626
|
+
this.onFailure = this.onFailure.bind(this)
|
|
627
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
|
|
631
|
+
return Effect.matchCauseEffect(this.f(this.seed, cause), {
|
|
632
|
+
onFailure: (cause2) => this.sink.onFailure(Cause.sequential(cause, cause2)),
|
|
633
|
+
onSuccess: ([c, acc]) => {
|
|
634
|
+
this.seed = acc
|
|
635
|
+
return this.sink.onFailure(c)
|
|
636
|
+
}
|
|
637
|
+
})
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
onSuccess(value: A) {
|
|
641
|
+
return this.sink.onSuccess(value)
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
/**
|
|
646
|
+
* @since 1.20.0
|
|
647
|
+
*/
|
|
648
|
+
export function filterMapLoopCauseEffect<R, E, A, B, R2, E2, C>(
|
|
649
|
+
sink: Sink<R, E2 | C, A>,
|
|
650
|
+
seed: B,
|
|
651
|
+
f: (acc: B, a: Cause.Cause<E>) => Effect.Effect<R2, E2, readonly [Option.Option<Cause.Cause<C>>, B]>
|
|
652
|
+
): Sink<R | R2, E, A> {
|
|
653
|
+
return new FilterMapLoopCauseEffectSink(sink, seed, f)
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
class FilterMapLoopCauseEffectSink<R, E, A, B, R2, E2, C> implements Sink<R | R2, E, A> {
|
|
657
|
+
constructor(
|
|
658
|
+
readonly sink: Sink<R, E2 | C, A>,
|
|
659
|
+
private seed: B,
|
|
660
|
+
readonly f: (acc: B, a: Cause.Cause<E>) => Effect.Effect<R2, E2, readonly [Option.Option<Cause.Cause<C>>, B]>
|
|
661
|
+
) {
|
|
662
|
+
this.onFailure = this.onFailure.bind(this)
|
|
663
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R | R2, never, unknown> {
|
|
667
|
+
return Effect.matchCauseEffect(this.f(this.seed, cause), {
|
|
668
|
+
onFailure: (cause2) => this.sink.onFailure(cause2),
|
|
669
|
+
onSuccess: ([option, acc]) => {
|
|
670
|
+
this.seed = acc
|
|
671
|
+
if (Option.isSome(option)) return this.sink.onFailure(option.value)
|
|
672
|
+
else return Effect.unit
|
|
673
|
+
}
|
|
674
|
+
})
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
onSuccess(value: A) {
|
|
678
|
+
return this.sink.onSuccess(value)
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
/**
|
|
683
|
+
* @since 1.20.0
|
|
684
|
+
*/
|
|
685
|
+
export const slice: {
|
|
686
|
+
<R, E, A, R2>(bounds: Bounds, f: (sink: Sink<R, E, A>) => Effect.Effect<R2, never, unknown>): (
|
|
687
|
+
sink: Sink<R, E, A>
|
|
688
|
+
) => Effect.Effect<R | R2, never, void>
|
|
689
|
+
<R, E, A, R2>(
|
|
690
|
+
sink: Sink<R, E, A>,
|
|
691
|
+
bounds: Bounds,
|
|
692
|
+
f: (sink: Sink<R, E, A>) => Effect.Effect<R2, never, unknown>
|
|
693
|
+
): Effect.Effect<R | R2, never, void>
|
|
694
|
+
} = dual(3, function slice<R, E, A, R2>(
|
|
695
|
+
sink: Sink<R, E, A>,
|
|
696
|
+
bounds: Bounds,
|
|
697
|
+
f: (sink: Sink<R, E, A>) => Effect.Effect<R2, never, unknown>
|
|
698
|
+
): Effect.Effect<R | R2, never, void> {
|
|
699
|
+
return withEarlyExit(sink, (s) => f(new SliceSink(s, bounds)))
|
|
700
|
+
})
|
|
701
|
+
|
|
702
|
+
class SliceSink<R, E, A> implements Sink<R, E, A> {
|
|
703
|
+
private drop: number
|
|
704
|
+
private take: number
|
|
705
|
+
|
|
706
|
+
constructor(
|
|
707
|
+
readonly sink: WithEarlyExit<R, E, A>,
|
|
708
|
+
readonly bounds: Bounds
|
|
709
|
+
) {
|
|
710
|
+
this.drop = this.bounds.min
|
|
711
|
+
this.take = this.bounds.max
|
|
712
|
+
|
|
713
|
+
this.onFailure = this.onFailure.bind(this)
|
|
714
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
|
|
718
|
+
return this.sink.onFailure(cause)
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
onSuccess(value: A) {
|
|
722
|
+
if (this.drop > 0) {
|
|
723
|
+
this.drop--
|
|
724
|
+
return Effect.unit
|
|
725
|
+
}
|
|
726
|
+
if (this.take-- > 0) {
|
|
727
|
+
return Effect.tap(this.sink.onSuccess(value), () => this.take === 0 ? this.sink.earlyExit : Effect.unit)
|
|
728
|
+
}
|
|
729
|
+
return this.sink.earlyExit
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
/**
|
|
734
|
+
* @since 1.20.0
|
|
735
|
+
*/
|
|
736
|
+
export const takeWhile: {
|
|
737
|
+
<R, E, A, R2, B>(predicate: Predicate.Predicate<A>, f: (sink: Sink<R, E, A>) => Effect.Effect<R2, E, B>): (
|
|
738
|
+
sink: Sink<R, E, A>
|
|
739
|
+
) => Effect.Effect<R | R2, never, void>
|
|
740
|
+
<R, E, A, R2, B>(
|
|
741
|
+
sink: Sink<R, E, A>,
|
|
742
|
+
predicate: Predicate.Predicate<A>,
|
|
743
|
+
f: (sink: Sink<R, E, A>) => Effect.Effect<R2, E, B>
|
|
744
|
+
): Effect.Effect<R | R2, never, void>
|
|
745
|
+
} = dual(3, function takeWhile<R, E, A, R2, B>(
|
|
746
|
+
sink: Sink<R, E, A>,
|
|
747
|
+
predicate: Predicate.Predicate<A>,
|
|
748
|
+
f: (sink: Sink<R, E, A>) => Effect.Effect<R2, E, B>
|
|
749
|
+
) {
|
|
750
|
+
return withEarlyExit(sink, (s) => f(new TakeWhileSink(s, predicate)))
|
|
751
|
+
})
|
|
752
|
+
|
|
753
|
+
class TakeWhileSink<R, E, A> implements Sink<R, E, A> {
|
|
754
|
+
private take: boolean
|
|
755
|
+
|
|
756
|
+
constructor(
|
|
757
|
+
readonly sink: WithEarlyExit<R, E, A>,
|
|
758
|
+
readonly predicate: Predicate.Predicate<A>
|
|
759
|
+
) {
|
|
760
|
+
this.take = true
|
|
761
|
+
this.onFailure = this.onFailure.bind(this)
|
|
762
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<R, never, unknown> {
|
|
766
|
+
return this.sink.onFailure(cause)
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
onSuccess(value: A) {
|
|
770
|
+
if (this.take === true && (this.take = this.predicate(value))) return this.sink.onSuccess(value)
|
|
771
|
+
else {
|
|
772
|
+
this.take = false
|
|
773
|
+
return this.sink.earlyExit
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
/**
|
|
779
|
+
* @since 1.20.0
|
|
780
|
+
*/
|
|
781
|
+
export const dropWhile: {
|
|
782
|
+
<A>(predicate: Predicate.Predicate<A>): <R, E>(
|
|
783
|
+
sink: Sink<R, E, A>
|
|
784
|
+
) => Sink<R, E, A>
|
|
785
|
+
<R, E, A>(sink: Sink<R, E, A>, predicate: Predicate.Predicate<A>): Sink<R, E, A>
|
|
786
|
+
} = dual(2, function dropWhile<R, E, A>(
|
|
787
|
+
sink: Sink<R, E, A>,
|
|
788
|
+
predicate: Predicate.Predicate<A>
|
|
789
|
+
): Sink<R, E, A> {
|
|
790
|
+
return filterMapLoop(sink, true, (drop: boolean, a: A) => {
|
|
791
|
+
const drop2 = drop && predicate(a)
|
|
792
|
+
return [drop2 ? Option.none() : Option.some(a), drop2]
|
|
793
|
+
})
|
|
794
|
+
})
|
|
795
|
+
|
|
796
|
+
/**
|
|
797
|
+
* @since 1.20.0
|
|
798
|
+
*/
|
|
799
|
+
export const dropAfter: {
|
|
800
|
+
<A>(predicate: Predicate.Predicate<A>): <R, E>(
|
|
801
|
+
sink: Sink<R, E, A>
|
|
802
|
+
) => Sink<R, E, A>
|
|
803
|
+
<R, E, A>(sink: Sink<R, E, A>, predicate: Predicate.Predicate<A>): Sink<R, E, A>
|
|
804
|
+
} = dual(2, function dropAfter<R, E, A>(
|
|
805
|
+
sink: Sink<R, E, A>,
|
|
806
|
+
predicate: Predicate.Predicate<A>
|
|
807
|
+
) {
|
|
808
|
+
return filterMapLoop(sink, false, (drop: boolean, a: A) => {
|
|
809
|
+
if (drop === true) return [Option.none(), drop]
|
|
810
|
+
|
|
811
|
+
const drop2 = predicate(a)
|
|
812
|
+
return [Option.some(a), drop2]
|
|
813
|
+
})
|
|
814
|
+
})
|
|
815
|
+
|
|
816
|
+
/**
|
|
817
|
+
* @since 1.20.0
|
|
818
|
+
*/
|
|
819
|
+
export const takeWhileEffect: {
|
|
820
|
+
<R, E, A, R2, E2, R3, E3, B>(
|
|
821
|
+
predicate: (a: A) => Effect.Effect<R2, E2, boolean>,
|
|
822
|
+
f: (sink: Sink<R | R2, E, A>) => Effect.Effect<R3, E3, B>
|
|
823
|
+
): <R, E>(
|
|
824
|
+
sink: Sink<R, E, A>
|
|
825
|
+
) => Effect.Effect<R | R3, never, void>
|
|
826
|
+
<R, E, A, R2, E2, R3, E3, B>(
|
|
827
|
+
sink: Sink<R, E | E2 | E3, A>,
|
|
828
|
+
predicate: (a: A) => Effect.Effect<R2, E2, boolean>,
|
|
829
|
+
f: (sink: Sink<R | R2, E, A>) => Effect.Effect<R3, E3, B>
|
|
830
|
+
): Effect.Effect<R | R3, never, void>
|
|
831
|
+
} = dual(3, function takeWhileEffect<R, E, A, R2, E2, R3, E3, B>(
|
|
832
|
+
sink: Sink<R, E | E2 | E3, A>,
|
|
833
|
+
predicate: (a: A) => Effect.Effect<R2, E2, boolean>,
|
|
834
|
+
f: (sink: Sink<R | R2, E, A>) => Effect.Effect<R3, E3, B>
|
|
835
|
+
) {
|
|
836
|
+
return withEarlyExit(sink, (s) => f(new TakeWhileEffectSink(s, predicate)))
|
|
837
|
+
})
|
|
838
|
+
|
|
839
|
+
class TakeWhileEffectSink<R, E, A, R2, E2> implements Sink<R | R2, E, A> {
|
|
840
|
+
private take: boolean
|
|
841
|
+
|
|
842
|
+
constructor(
|
|
843
|
+
readonly sink: WithEarlyExit<R, E | E2, A>,
|
|
844
|
+
readonly predicate: (a: A) => Effect.Effect<R2, E2, boolean>
|
|
845
|
+
) {
|
|
846
|
+
this.take = true
|
|
847
|
+
this.onFailure = this.onFailure.bind(this)
|
|
848
|
+
this.onSuccess = this.onSuccess.bind(this)
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
onFailure(cause: Cause.Cause<E | E2>): Effect.Effect<R | R2, never, unknown> {
|
|
852
|
+
return this.sink.onFailure(cause)
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
onSuccess(value: A) {
|
|
856
|
+
if (this.take === true) {
|
|
857
|
+
return Effect.matchCauseEffect(this.predicate(value), {
|
|
858
|
+
onFailure: (cause) => this.sink.onFailure(cause),
|
|
859
|
+
onSuccess: (b) => {
|
|
860
|
+
if ((this.take = b)) return this.sink.onSuccess(value)
|
|
861
|
+
else return this.sink.earlyExit
|
|
862
|
+
}
|
|
863
|
+
})
|
|
864
|
+
} else return this.sink.earlyExit
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
/**
|
|
869
|
+
* @since 1.20.0
|
|
870
|
+
*/
|
|
871
|
+
export const dropWhileEffect: {
|
|
872
|
+
<A, R2, E2>(predicate: (a: A) => Effect.Effect<R2, E2, boolean>): <R, E>(
|
|
873
|
+
sink: Sink<R, E | E2, A>
|
|
874
|
+
) => Sink<R | R2, E | E2, A>
|
|
188
875
|
<R, E, A, R2, E2>(
|
|
189
|
-
sink:
|
|
190
|
-
|
|
191
|
-
):
|
|
192
|
-
} = dual(2, function
|
|
193
|
-
sink:
|
|
194
|
-
|
|
195
|
-
):
|
|
196
|
-
return
|
|
197
|
-
(
|
|
198
|
-
|
|
199
|
-
|
|
876
|
+
sink: Sink<R, E | E2, A>,
|
|
877
|
+
predicate: (a: A) => Effect.Effect<R2, E2, boolean>
|
|
878
|
+
): Sink<R | R2, E | E2, A>
|
|
879
|
+
} = dual(2, function dropWhileEffect<R, E, A, R2, E2>(
|
|
880
|
+
sink: Sink<R, E | E2, A>,
|
|
881
|
+
predicate: (a: A) => Effect.Effect<R2, E2, boolean>
|
|
882
|
+
): Sink<R | R2, E | E2, A> {
|
|
883
|
+
return filterMapLoopEffect<R, E | E2, A, boolean, R2, A>(sink, true, (drop: boolean, a: A) => {
|
|
884
|
+
if (drop === false) return Effect.succeed([Option.some(a), drop as boolean] as const)
|
|
885
|
+
|
|
886
|
+
return Effect.map(predicate(a), (b) => [b ? Option.none<A>() : Option.some(a), b] as const)
|
|
887
|
+
})
|
|
200
888
|
})
|
|
201
889
|
|
|
202
890
|
/**
|
|
203
|
-
*
|
|
204
|
-
* @since 1.18.0
|
|
205
|
-
* @category combinators
|
|
891
|
+
* @since 1.20.0
|
|
206
892
|
*/
|
|
207
|
-
export const
|
|
208
|
-
<
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
)
|
|
893
|
+
export const dropAfterEffect: {
|
|
894
|
+
<A, R2, E2>(predicate: (a: A) => Effect.Effect<R2, E2, boolean>): <R, E>(
|
|
895
|
+
sink: Sink<R, E | E2, A>
|
|
896
|
+
) => Sink<R | R2, E | E2, A>
|
|
897
|
+
<R, E, A, R2, E2>(
|
|
898
|
+
sink: Sink<R, E | E2, A>,
|
|
899
|
+
predicate: (a: A) => Effect.Effect<R2, E2, boolean>
|
|
900
|
+
): Sink<R | R2, E | E2, A>
|
|
901
|
+
} = dual(2, function dropAfterEffect<R, E, A, R2, E2>(
|
|
902
|
+
sink: Sink<R, E | E2, A>,
|
|
903
|
+
predicate: (a: A) => Effect.Effect<R2, E2, boolean>
|
|
904
|
+
): Sink<R | R2, E | E2, A> {
|
|
905
|
+
return filterMapLoopEffect<R, E | E2, A, boolean, R2, A>(sink, false, (drop: boolean, a: A) => {
|
|
906
|
+
if (drop === true) return Effect.succeed([Option.none(), drop as boolean] as const)
|
|
907
|
+
|
|
908
|
+
return Effect.map(predicate(a), (b) => [Option.some(a), b] as const)
|
|
909
|
+
})
|
|
218
910
|
})
|
|
219
911
|
|
|
220
912
|
/**
|
|
221
|
-
*
|
|
222
|
-
* @since 1.18.0
|
|
223
|
-
* @category combinators
|
|
913
|
+
* @since 1.20.0
|
|
224
914
|
*/
|
|
225
|
-
export const
|
|
226
|
-
<
|
|
227
|
-
<R, E, A, R2
|
|
228
|
-
} = dual(2, function
|
|
229
|
-
sink:
|
|
230
|
-
|
|
231
|
-
):
|
|
232
|
-
return
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}))
|
|
915
|
+
export const provide: {
|
|
916
|
+
<R2>(ctx: C.Context<R2>): <R, E, A>(sink: Sink<R, E, A>) => Sink<Exclude<R, R2>, E, A>
|
|
917
|
+
<R, E, A, R2>(sink: Sink<R, E, A>, ctx: C.Context<R2>): Sink<Exclude<R, R2>, E, A>
|
|
918
|
+
} = dual(2, function provide<R, E, A, R2>(
|
|
919
|
+
sink: Sink<R, E, A>,
|
|
920
|
+
ctx: C.Context<R2>
|
|
921
|
+
): Sink<Exclude<R, R2>, E, A> {
|
|
922
|
+
return make(
|
|
923
|
+
(cause) => Effect.provide(sink.onFailure(cause), ctx),
|
|
924
|
+
(a) => Effect.provide(sink.onSuccess(a), ctx)
|
|
925
|
+
)
|
|
237
926
|
})
|
|
238
927
|
|
|
239
928
|
/**
|
|
240
|
-
*
|
|
241
|
-
* @since 1.18.0
|
|
242
|
-
* @category tracing
|
|
929
|
+
* @since 1.20.0
|
|
243
930
|
*/
|
|
244
931
|
export const setSpan: {
|
|
245
|
-
(span: Tracer.Span): <R, E, A>(
|
|
246
|
-
<R, E, A>(self:
|
|
247
|
-
} = dual(2, function
|
|
248
|
-
self:
|
|
932
|
+
(span: Tracer.Span): <R, E, A>(sink: Sink<R, E, A>) => Sink<R, E, A>
|
|
933
|
+
<R, E, A>(self: Sink<R, E, A>, span: Tracer.Span): Sink<R, E, A>
|
|
934
|
+
} = dual(2, function setSpan<R, E, A>(
|
|
935
|
+
self: Sink<R, E, A>,
|
|
249
936
|
span: Tracer.Span
|
|
250
|
-
):
|
|
251
|
-
return
|
|
937
|
+
): Sink<R, E, A> {
|
|
938
|
+
return make(
|
|
252
939
|
(cause) =>
|
|
253
940
|
addEvent(self.onFailure(cause), "fx.failure", span, {
|
|
254
941
|
"cause": Cause.pretty(cause)
|
|
@@ -272,3 +959,67 @@ const addEvent = <R, E, A>(
|
|
|
272
959
|
|
|
273
960
|
return effect
|
|
274
961
|
}))
|
|
962
|
+
|
|
963
|
+
/**
|
|
964
|
+
* @since 1.20.0
|
|
965
|
+
*/
|
|
966
|
+
export function tagged<E, A>(): {
|
|
967
|
+
<const I extends C.IdentifierFactory<any>>(identifier: I): Sink.Tagged<C.IdentifierOf<I>, E, A>
|
|
968
|
+
<const I>(identifier: I): Sink.Tagged<C.IdentifierOf<I>, E, A>
|
|
969
|
+
} {
|
|
970
|
+
return <const I>(identifier: I) => new TaggedImpl(C.Tagged<I, Sink<never, E, A>>(identifier))
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
class TaggedImpl<I, E, A> implements Sink.Tagged<I, E, A> {
|
|
974
|
+
constructor(readonly tag: C.Tagged<I, Sink<never, E, A>>) {}
|
|
975
|
+
|
|
976
|
+
onSuccess(value: A): Effect.Effect<I, never, unknown> {
|
|
977
|
+
return this.tag.withEffect((sink) => sink.onSuccess(value))
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
onFailure(cause: Cause.Cause<E>): Effect.Effect<I, never, unknown> {
|
|
981
|
+
return this.tag.withEffect((sink) => sink.onFailure(cause))
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
make: <R>(sink: Sink<R, E, A>) => Layer.Layer<R, never, I> = <R>(sink: Sink<R, E, A>) =>
|
|
985
|
+
Layer.flatMap(Layer.context<R>(), (ctx) => this.tag.layer(provide(sink, ctx)))
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
/**
|
|
989
|
+
* @since 1.20.0
|
|
990
|
+
*/
|
|
991
|
+
export const fromTag: {
|
|
992
|
+
<S, R2, E2, B>(f: (s: S) => Sink<R2, E2, B>): <I>(tag: C.Tag<I, S>) => Sink<I | R2, E2, B>
|
|
993
|
+
<I, S, R2, E2, B>(tag: C.Tag<I, S>, f: (s: S) => Sink<R2, E2, B>): Sink<I | R2, E2, B>
|
|
994
|
+
} = dual(2, function fromTag<I, S, R2, E2, B>(
|
|
995
|
+
tag: C.Tag<I, S>,
|
|
996
|
+
f: (s: S) => Sink<R2, E2, B>
|
|
997
|
+
): Sink<I | R2, E2, B> {
|
|
998
|
+
return new FromTag(tag, f)
|
|
999
|
+
})
|
|
1000
|
+
|
|
1001
|
+
class FromTag<I, S, R2, E2, B> implements Sink<I | R2, E2, B> {
|
|
1002
|
+
readonly get: Effect.Effect<I, never, Sink<R2, E2, B>>
|
|
1003
|
+
|
|
1004
|
+
constructor(readonly tag: C.Tag<I, S>, readonly f: (s: S) => Sink<R2, E2, B>) {
|
|
1005
|
+
this.get = Effect.map(tag, f)
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
onSuccess(value: B): Effect.Effect<I | R2, never, unknown> {
|
|
1009
|
+
return Effect.flatMap(this.get, (sink) => sink.onSuccess(value))
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
onFailure(cause: Cause.Cause<E2>): Effect.Effect<I | R2, never, unknown> {
|
|
1013
|
+
return Effect.flatMap(this.get, (sink) => sink.onFailure(cause))
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
/**
|
|
1018
|
+
* @since 1.20.0
|
|
1019
|
+
*/
|
|
1020
|
+
export function ignoreInterrupt<R, E, A>(sink: Sink<R, E, A>): Sink<R, E, A> {
|
|
1021
|
+
return make(
|
|
1022
|
+
(cause) => Cause.isInterruptedOnly(cause) ? Effect.unit : sink.onFailure(cause),
|
|
1023
|
+
sink.onSuccess
|
|
1024
|
+
)
|
|
1025
|
+
}
|