@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/Guard.ts
CHANGED
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
* @since 1.18.0
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import type { Predicate } from "effect"
|
|
6
|
+
import * as Effect from "effect/Effect"
|
|
6
7
|
import { dual } from "effect/Function"
|
|
8
|
+
import * as Option from "effect/Option"
|
|
7
9
|
|
|
8
10
|
/**
|
|
9
11
|
* @since 1.18.0
|
|
@@ -157,3 +159,12 @@ export type AnyOutput<GS extends Readonly<Record<string, Guard<any, any, any, an
|
|
|
157
159
|
[K in keyof GS]: { readonly _tag: K; readonly value: Guard.Output<GS[K]> }
|
|
158
160
|
}[keyof GS]
|
|
159
161
|
] extends [infer R] ? R : never
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* @since 1.20.0
|
|
165
|
+
*/
|
|
166
|
+
export function liftPredicate<A, B extends A>(predicate: Predicate.Refinement<A, B>): Guard<A, never, never, B>
|
|
167
|
+
export function liftPredicate<A>(predicate: Predicate.Predicate<A>): Guard<A, never, never, A>
|
|
168
|
+
export function liftPredicate<A>(predicate: Predicate.Predicate<A>): Guard<A, never, never, A> {
|
|
169
|
+
return (a) => Effect.sync(() => (predicate(a) ? Option.some(a) : Option.none()))
|
|
170
|
+
}
|
package/src/Idle.ts
CHANGED
|
@@ -5,19 +5,22 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type * as Context from "@typed/context"
|
|
8
|
-
import { MutableHashMap, Option } from "effect"
|
|
9
8
|
import * as Effect from "effect/Effect"
|
|
10
|
-
import * as
|
|
9
|
+
import * as ExecutionStrategy from "effect/ExecutionStrategy"
|
|
10
|
+
import * as Exit from "effect/Exit"
|
|
11
|
+
import type * as Fiber from "effect/Fiber"
|
|
11
12
|
import { constant, constVoid } from "effect/Function"
|
|
12
13
|
import { globalValue } from "effect/GlobalValue"
|
|
13
|
-
import type { Hash } from "effect/Hash"
|
|
14
14
|
import * as Layer from "effect/Layer"
|
|
15
15
|
import type * as Queue from "effect/Queue"
|
|
16
16
|
import * as Scheduler from "effect/Scheduler"
|
|
17
17
|
import * as Scope from "effect/Scope"
|
|
18
|
-
import { dequeueIsActive } from "./
|
|
18
|
+
import { dequeueIsActive } from "./Fx.js"
|
|
19
|
+
import { withScope } from "./internal/helpers.js"
|
|
19
20
|
import { cancelIdleCallback, requestIdleCallback } from "./internal/requestIdleCallback.js"
|
|
20
21
|
|
|
22
|
+
// TODO: Why is this even in the Fx package?? Where should we put it?
|
|
23
|
+
|
|
21
24
|
/**
|
|
22
25
|
* The IdleScheduler is an implementation of Effect's Scheduler interface, which utilizes a priority queue
|
|
23
26
|
* to order tasks to be run when the event loop is idle through the usage of requestIdleCallback.
|
|
@@ -42,7 +45,7 @@ class IdleSchedulerImpl implements IdleScheduler {
|
|
|
42
45
|
this.#tasks.scheduleTask(task, priority)
|
|
43
46
|
|
|
44
47
|
// If we're not running yet, schedule the next run
|
|
45
|
-
if (
|
|
48
|
+
if (this.#running === false) {
|
|
46
49
|
this.#running = true
|
|
47
50
|
this.scheduleNextRun()
|
|
48
51
|
}
|
|
@@ -62,23 +65,30 @@ class IdleSchedulerImpl implements IdleScheduler {
|
|
|
62
65
|
}
|
|
63
66
|
|
|
64
67
|
private scheduleNextRun() {
|
|
65
|
-
this.#id = requestIdleCallback((deadline) => this.runTasks(deadline), this.options)
|
|
68
|
+
this.#id = requestIdleCallback((deadline) => this.runTasks(deadline), { timeout: 1000, ...this.options })
|
|
66
69
|
}
|
|
67
70
|
|
|
68
71
|
private runTasks(deadline: IdleDeadline) {
|
|
69
|
-
const buckets = this.#tasks.buckets
|
|
72
|
+
const buckets = this.#tasks.buckets.slice(0)
|
|
73
|
+
this.#tasks.buckets = []
|
|
70
74
|
const length = buckets.length
|
|
71
75
|
|
|
72
76
|
let i = 0
|
|
73
77
|
for (; shouldContinue(deadline) && i < length; ++i) {
|
|
74
|
-
buckets[i][1].
|
|
78
|
+
const tasks = buckets[i][1].slice()
|
|
79
|
+
tasks.forEach((f) => f())
|
|
75
80
|
}
|
|
76
81
|
|
|
77
82
|
// Remove all the buckets we were able to complete
|
|
78
83
|
buckets.splice(0, i)
|
|
79
84
|
|
|
80
|
-
// If there are
|
|
85
|
+
// If there are leftover tasks, requeue them
|
|
81
86
|
if (buckets.length > 0) {
|
|
87
|
+
buckets.forEach(([priority, tasks]) => tasks.forEach((f) => this.#tasks.scheduleTask(f, priority)))
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// If there are more tasks to run, schedule the next run
|
|
91
|
+
if (this.#tasks.buckets.length > 0) {
|
|
82
92
|
this.scheduleNextRun()
|
|
83
93
|
} else {
|
|
84
94
|
// Otherwise we're done for now
|
|
@@ -130,7 +140,7 @@ export const whenIdle = (options?: IdleRequestOptions): Effect.Effect<Scope.Scop
|
|
|
130
140
|
* @since 1.18.0
|
|
131
141
|
*/
|
|
132
142
|
export function shouldContinue(deadline: IdleDeadline): boolean {
|
|
133
|
-
return deadline.didTimeout
|
|
143
|
+
return deadline.didTimeout || deadline.timeRemaining() > 0
|
|
134
144
|
}
|
|
135
145
|
|
|
136
146
|
/**
|
|
@@ -200,85 +210,89 @@ export function dequeueWhileIdle<I, A, R2, E2, B>(
|
|
|
200
210
|
/**
|
|
201
211
|
* @since 1.18.0
|
|
202
212
|
*/
|
|
203
|
-
export interface IdleQueue<I
|
|
213
|
+
export interface IdleQueue<I> {
|
|
204
214
|
readonly add: <R>(
|
|
205
215
|
part: I,
|
|
206
216
|
task: Effect.Effect<R, never, unknown>
|
|
207
217
|
) => Effect.Effect<R | Scope.Scope, never, void>
|
|
218
|
+
|
|
219
|
+
readonly interrupt: Effect.Effect<never, never, void>
|
|
208
220
|
}
|
|
209
221
|
|
|
210
222
|
/**
|
|
211
223
|
* @since 1.18.0
|
|
212
224
|
*/
|
|
213
|
-
export const makeIdleQueue = <I
|
|
225
|
+
export const makeIdleQueue = <I>(
|
|
214
226
|
options?: IdleRequestOptions
|
|
215
227
|
): Effect.Effect<Scope.Scope, never, IdleQueue<I>> =>
|
|
216
|
-
|
|
228
|
+
withScope((scope) => Effect.sync(() => new IdleQueueImpl<I>(scope, options)), ExecutionStrategy.sequential)
|
|
217
229
|
|
|
218
|
-
class IdleQueueImpl<I
|
|
219
|
-
queue =
|
|
230
|
+
class IdleQueueImpl<I> implements IdleQueue<I> {
|
|
231
|
+
queue = new Map<I, Effect.Effect<never, never, unknown>>()
|
|
220
232
|
scheduled = false
|
|
221
233
|
|
|
222
|
-
|
|
234
|
+
readonly interrupt: Effect.Effect<never, never, void>
|
|
235
|
+
readonly scheduleNextRun: Effect.Effect<never, never, void>
|
|
236
|
+
|
|
237
|
+
constructor(readonly scope: Scope.CloseableScope, readonly options?: IdleRequestOptions) {
|
|
238
|
+
this.interrupt = Effect.fiberIdWith((id) => Scope.close(scope, Exit.interrupt(id)))
|
|
239
|
+
|
|
240
|
+
const run: Effect.Effect<Scope.Scope, never, void> = Effect.flatMap(
|
|
241
|
+
whenIdle(this.options),
|
|
242
|
+
(deadline) =>
|
|
243
|
+
Effect.gen(this, function*(_) {
|
|
244
|
+
const iterator = this.queue[Symbol.iterator]()
|
|
245
|
+
|
|
246
|
+
while (shouldContinue(deadline)) {
|
|
247
|
+
const result = iterator.next()
|
|
248
|
+
|
|
249
|
+
if (result.done) break
|
|
250
|
+
else {
|
|
251
|
+
const [part, task] = result.value
|
|
252
|
+
this.queue.delete(part)
|
|
253
|
+
yield* _(task)
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (this.queue.size > 0) {
|
|
258
|
+
yield* _(run)
|
|
259
|
+
} else {
|
|
260
|
+
this.scheduled = false
|
|
261
|
+
}
|
|
262
|
+
})
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
this.scheduleNextRun = Effect.provideService(
|
|
266
|
+
Effect.suspend(() => {
|
|
267
|
+
if (this.queue.size === 0) return Effect.unit
|
|
268
|
+
|
|
269
|
+
this.scheduled = true
|
|
270
|
+
|
|
271
|
+
return withScope(
|
|
272
|
+
(childScope) => Effect.provideService(run, Scope.Scope, childScope),
|
|
273
|
+
ExecutionStrategy.sequential
|
|
274
|
+
)
|
|
275
|
+
}),
|
|
276
|
+
Scope.Scope,
|
|
277
|
+
scope
|
|
278
|
+
)
|
|
279
|
+
}
|
|
223
280
|
|
|
224
281
|
add = <R>(part: I, task: Effect.Effect<R, never, unknown>) =>
|
|
225
282
|
Effect.contextWithEffect((ctx: Context.Context<R>) => {
|
|
226
283
|
const provided = Effect.provide(task, ctx)
|
|
227
|
-
|
|
284
|
+
this.queue.set(part, provided)
|
|
228
285
|
|
|
229
286
|
return Effect.zipRight(
|
|
230
287
|
Effect.addFinalizer(() =>
|
|
231
288
|
Effect.sync(() => {
|
|
232
|
-
const currentTask = MutableHashMap.get(this.queue, part)
|
|
233
|
-
|
|
234
289
|
// If the current task is still the same we'll delete it from the queue
|
|
235
|
-
if (
|
|
236
|
-
|
|
290
|
+
if (this.queue.get(part) === provided) {
|
|
291
|
+
this.queue.delete(part)
|
|
237
292
|
}
|
|
238
293
|
})
|
|
239
294
|
),
|
|
240
295
|
this.scheduleNextRun
|
|
241
296
|
)
|
|
242
297
|
})
|
|
243
|
-
|
|
244
|
-
scheduleNextRun = Effect.suspend(() => {
|
|
245
|
-
if (MutableHashMap.size(this.queue) === 0) return Effect.unit
|
|
246
|
-
|
|
247
|
-
this.scheduled = true
|
|
248
|
-
|
|
249
|
-
return Scope.addFinalizer(this.scope, Fiber.interrupt(Effect.runFork(this.run)))
|
|
250
|
-
})
|
|
251
|
-
|
|
252
|
-
run: Effect.Effect<never, never, void> = Effect.suspend(() =>
|
|
253
|
-
Effect.provideService(
|
|
254
|
-
Effect.flatMap(
|
|
255
|
-
whenIdle(this.options),
|
|
256
|
-
(deadline) =>
|
|
257
|
-
Effect.gen(this, function*(_) {
|
|
258
|
-
const iterator = this.queue[Symbol.iterator]()
|
|
259
|
-
|
|
260
|
-
while (shouldContinue(deadline)) {
|
|
261
|
-
const result = iterator.next()
|
|
262
|
-
|
|
263
|
-
if (result.done) break
|
|
264
|
-
else {
|
|
265
|
-
const [part, task] = result.value
|
|
266
|
-
MutableHashMap.remove(this.queue, part)
|
|
267
|
-
yield* _(task)
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
if (MutableHashMap.size(this.queue) > 0) {
|
|
272
|
-
return this.run
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
this.scheduled = false
|
|
276
|
-
|
|
277
|
-
return Effect.unit
|
|
278
|
-
})
|
|
279
|
-
),
|
|
280
|
-
Scope.Scope,
|
|
281
|
-
this.scope
|
|
282
|
-
)
|
|
283
|
-
)
|
|
284
298
|
}
|
package/src/Match.ts
CHANGED
|
@@ -2,20 +2,29 @@
|
|
|
2
2
|
* @since 1.18.0
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { Effect, Exit } from "effect"
|
|
6
5
|
import * as Cause from "effect/Cause"
|
|
7
6
|
import * as Chunk from "effect/Chunk"
|
|
7
|
+
import * as Effect from "effect/Effect"
|
|
8
|
+
import * as ExecutionStrategy from "effect/ExecutionStrategy"
|
|
9
|
+
import * as Exit from "effect/Exit"
|
|
10
|
+
import * as Fiber from "effect/Fiber"
|
|
8
11
|
import { identity } from "effect/Function"
|
|
12
|
+
import * as MutableRef from "effect/MutableRef"
|
|
9
13
|
import * as Option from "effect/Option"
|
|
10
14
|
import { isNonEmptyReadonlyArray, reduce } from "effect/ReadonlyArray"
|
|
15
|
+
import * as Scope from "effect/Scope"
|
|
11
16
|
import * as Fx from "./Fx.js"
|
|
12
17
|
import type { Guard } from "./Guard.js"
|
|
18
|
+
import { withScopedFork } from "./internal/helpers.js"
|
|
19
|
+
import { FxBase } from "./internal/protos.js"
|
|
13
20
|
import * as RefSubject from "./RefSubject.js"
|
|
21
|
+
import * as Sink from "./Sink.js"
|
|
22
|
+
import * as Subject from "./Subject.js"
|
|
14
23
|
|
|
15
24
|
/**
|
|
16
25
|
* @since 1.18.0
|
|
17
26
|
*/
|
|
18
|
-
export const MatcherTypeId: unique symbol = Symbol.for("
|
|
27
|
+
export const MatcherTypeId: unique symbol = Symbol.for("@typed/fx/Matcher")
|
|
19
28
|
/**
|
|
20
29
|
* @since 1.18.0
|
|
21
30
|
*/
|
|
@@ -29,23 +38,25 @@ export interface TypeMatcher<R, E, I, O> {
|
|
|
29
38
|
|
|
30
39
|
readonly [MatcherTypeId]: Matcher.Variance<R, E, I, O>
|
|
31
40
|
|
|
32
|
-
readonly when: <R2, E2, A, R3 = never, E3 = never, B = never>(
|
|
41
|
+
readonly when: <R2 = never, E2 = never, A = never, R3 = never, E3 = never, B = never>(
|
|
33
42
|
guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
|
|
34
|
-
onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.
|
|
43
|
+
onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.Fx<R3, E3, B>
|
|
35
44
|
) => TypeMatcher<R | R2 | R3, E | E2 | E3, I, O | B>
|
|
36
45
|
|
|
37
|
-
readonly to: <R2, E2, A, B>(
|
|
46
|
+
readonly to: <R2 = never, E2 = never, A = never, B = never>(
|
|
38
47
|
guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
|
|
39
48
|
onMatch: B
|
|
40
49
|
) => TypeMatcher<R | R2, E | E2, I, O | B>
|
|
41
50
|
|
|
42
|
-
readonly run: <R2 = never, E2 = never>(
|
|
51
|
+
readonly run: <R2 = never, E2 = never>(
|
|
52
|
+
input: Fx.Fx<R2, E2, I>
|
|
53
|
+
) => Fx.Fx<R | R2 | Scope.Scope, E | E2, Option.Option<O>>
|
|
43
54
|
}
|
|
44
55
|
|
|
45
56
|
/**
|
|
46
57
|
* @since 1.18.0
|
|
47
58
|
*/
|
|
48
|
-
export interface ValueMatcher<R, E, I, O> {
|
|
59
|
+
export interface ValueMatcher<R, E, I, O> extends Fx.Fx<R | Scope.Scope, E, Option.Option<O>> {
|
|
49
60
|
readonly _tag: "ValueMatcher"
|
|
50
61
|
|
|
51
62
|
readonly [MatcherTypeId]: Matcher.Variance<R, E, I, O>
|
|
@@ -54,7 +65,7 @@ export interface ValueMatcher<R, E, I, O> {
|
|
|
54
65
|
|
|
55
66
|
readonly when: <R2, E2, A, R3 = never, E3 = never, B = never>(
|
|
56
67
|
guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
|
|
57
|
-
onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.
|
|
68
|
+
onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.Fx<R3, E3, B>
|
|
58
69
|
) => ValueMatcher<R | R2 | R3, E | E2 | E3, I, O | B>
|
|
59
70
|
|
|
60
71
|
readonly to: <R2, E2, A, B>(
|
|
@@ -62,11 +73,9 @@ export interface ValueMatcher<R, E, I, O> {
|
|
|
62
73
|
onMatch: B
|
|
63
74
|
) => ValueMatcher<R | R2, E | E2, I, O | B>
|
|
64
75
|
|
|
65
|
-
readonly run: Fx.Fx<R, E, Option.Option<O>>
|
|
66
|
-
|
|
67
76
|
readonly getOrElse: <R2 = never, E2 = never, B = never>(
|
|
68
|
-
f: () => Fx.
|
|
69
|
-
) => Fx.Fx<R | R2, E | E2, O | B>
|
|
77
|
+
f: () => Fx.Fx<R2, E2, B>
|
|
78
|
+
) => Fx.Fx<R | R2 | Scope.Scope, E | E2, O | B>
|
|
70
79
|
}
|
|
71
80
|
|
|
72
81
|
/**
|
|
@@ -93,8 +102,8 @@ export const type = <I>(): TypeMatcher<never, never, I, never> =>
|
|
|
93
102
|
/**
|
|
94
103
|
* @since 1.18.0
|
|
95
104
|
*/
|
|
96
|
-
export const value = <R, E, I>(input: Fx.
|
|
97
|
-
new ValueMatcherImpl(
|
|
105
|
+
export const value = <R, E, I>(input: Fx.Fx<R, E, I>): ValueMatcher<R, E, I, never> =>
|
|
106
|
+
new ValueMatcherImpl(input, type<I>())
|
|
98
107
|
|
|
99
108
|
// Internals
|
|
100
109
|
|
|
@@ -108,7 +117,16 @@ const variance: Matcher.Variance<any, any, any, any> = {
|
|
|
108
117
|
class When<R, E, I, A, O> {
|
|
109
118
|
constructor(
|
|
110
119
|
readonly guard: (input: I) => Effect.Effect<R, E, Option.Option<A>>,
|
|
111
|
-
readonly onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.
|
|
120
|
+
readonly onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.Fx<R, E, O>
|
|
121
|
+
) {}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
class Matched<R, E, I, A, O> {
|
|
125
|
+
constructor(
|
|
126
|
+
readonly when: When<R, E, I, A, O>,
|
|
127
|
+
readonly ref: RefSubject.RefSubject<never, never, A>,
|
|
128
|
+
readonly fiber: Fiber.Fiber<never, unknown>,
|
|
129
|
+
readonly interrupt: Effect.Effect<never, never, void>
|
|
112
130
|
) {}
|
|
113
131
|
}
|
|
114
132
|
|
|
@@ -123,7 +141,7 @@ class TypeMatcherImpl<R, E, I, O> implements TypeMatcher<R, E, I, O> {
|
|
|
123
141
|
|
|
124
142
|
when<R2, E2, A, R3 = never, E3 = never, B = never>(
|
|
125
143
|
guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
|
|
126
|
-
onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.
|
|
144
|
+
onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.Fx<R3, E3, B>
|
|
127
145
|
): TypeMatcher<R | R2 | R3, E | E2 | E3, I, O | B> {
|
|
128
146
|
return new TypeMatcherImpl<R | R2 | R3, E | E2 | E3, I, O | B>(
|
|
129
147
|
Chunk.append(this.cases, new When<R2 | R3, E2 | E3, I, A, B>(getGuard(guard), onMatch))
|
|
@@ -134,112 +152,153 @@ class TypeMatcherImpl<R, E, I, O> implements TypeMatcher<R, E, I, O> {
|
|
|
134
152
|
guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
|
|
135
153
|
onMatch: B
|
|
136
154
|
): TypeMatcher<R | R2, E | E2, I, O | B> {
|
|
137
|
-
return this.when(guard, () =>
|
|
155
|
+
return this.when(guard, () => Fx.succeed(onMatch))
|
|
138
156
|
}
|
|
139
157
|
|
|
140
|
-
run<R2, E2>(input: Fx.
|
|
158
|
+
run<R2, E2>(input: Fx.Fx<R2, E2, I>): Fx.Fx<R | R2 | Scope.Scope, E | E2, Option.Option<O>> {
|
|
141
159
|
const { cases } = this
|
|
142
160
|
|
|
143
|
-
return Fx.
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
161
|
+
return Fx.make<R | R2 | Scope.Scope, E | E2, Option.Option<O>>((sink) =>
|
|
162
|
+
withScopedFork(
|
|
163
|
+
(fork, parentScope) => {
|
|
164
|
+
let previous: Matched<any, any, I, any, O>
|
|
165
|
+
|
|
166
|
+
const onMatch = <A>(
|
|
167
|
+
when: When<R | R2 | Scope.Scope, E | E2, I, A, O>,
|
|
168
|
+
value: A
|
|
169
|
+
) =>
|
|
170
|
+
Effect.gen(function*(_) {
|
|
171
|
+
if (previous?.when === when) {
|
|
172
|
+
yield* _(RefSubject.set(previous.ref, value))
|
|
173
|
+
} else {
|
|
174
|
+
// Interrupt any previous resources
|
|
175
|
+
if (previous !== undefined) {
|
|
176
|
+
yield* _(previous.interrupt)
|
|
177
|
+
}
|
|
155
178
|
|
|
156
|
-
|
|
157
|
-
|
|
179
|
+
// RefSubject to pass along to our matching function
|
|
180
|
+
const refSubject = yield* _(RefSubject.of(value))
|
|
181
|
+
|
|
182
|
+
// Track if the case is ended
|
|
183
|
+
const hasEnded = MutableRef.make(false)
|
|
184
|
+
// Used to signal when the case has ended
|
|
185
|
+
const endSignal = Subject.unsafeMake<never, void>(0)
|
|
186
|
+
|
|
187
|
+
// Run the case
|
|
188
|
+
const fiber = yield* _(
|
|
189
|
+
fork(
|
|
190
|
+
Fx.mergeFirst(when.onMatch(refSubject), Fx.tap(endSignal, () => MutableRef.set(hasEnded, true)))
|
|
191
|
+
.run(
|
|
192
|
+
Sink.make(
|
|
193
|
+
(cause) =>
|
|
194
|
+
MutableRef.get(hasEnded) || Cause.isInterruptedOnly(cause)
|
|
195
|
+
? Effect.unit
|
|
196
|
+
: sink.onFailure(cause),
|
|
197
|
+
(value) => MutableRef.get(hasEnded) ? Effect.unit : sink.onSuccess(Option.some(value))
|
|
198
|
+
)
|
|
199
|
+
)
|
|
200
|
+
)
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
previous = new Matched(
|
|
204
|
+
when,
|
|
205
|
+
refSubject,
|
|
206
|
+
fiber,
|
|
207
|
+
// Interrupt the case when the endSignal first to disallow emissions of values, but asynchonously
|
|
208
|
+
// interrupt the fiber without blocking the next match to take over.
|
|
209
|
+
Effect.all([endSignal.onSuccess(undefined), Fiber.interruptFork(fiber)], { discard: true })
|
|
210
|
+
)
|
|
211
|
+
}
|
|
212
|
+
}).pipe(Effect.provideService(Scope.Scope, parentScope))
|
|
158
213
|
|
|
159
|
-
|
|
214
|
+
function matchWhen<A>(input: I, when: When<R | R2 | Scope.Scope, E | E2, I, A, O>) {
|
|
215
|
+
return Effect.gen(function*(_) {
|
|
216
|
+
const matched = yield* _(when.guard(input))
|
|
160
217
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
Effect.gen(function*(_) {
|
|
164
|
-
// Allow failures to be accumulated, such that errors do not break the overall match
|
|
165
|
-
// and additional matchers can be attempted against first
|
|
166
|
-
const causes: Array<Cause.Cause<E>> = []
|
|
218
|
+
if (Option.isSome(matched)) {
|
|
219
|
+
yield* _(onMatch(when, matched.value))
|
|
167
220
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
221
|
+
return true
|
|
222
|
+
} else {
|
|
223
|
+
return false
|
|
224
|
+
}
|
|
225
|
+
})
|
|
226
|
+
}
|
|
171
227
|
|
|
172
|
-
|
|
173
|
-
|
|
228
|
+
function matchInput(input: I) {
|
|
229
|
+
return Effect.gen(function*(_) {
|
|
230
|
+
// Allow failures to be accumulated, such that errors do not break the overall match
|
|
231
|
+
// and additional matchers can be attempted against first
|
|
232
|
+
const causes: Array<Cause.Cause<E | E2>> = []
|
|
174
233
|
|
|
175
|
-
|
|
176
|
-
|
|
234
|
+
// If there's a previous match, attempt it first to avoid re-testing all cases in order
|
|
235
|
+
if (previous !== undefined) {
|
|
236
|
+
const matchedExit = yield* _(matchWhen(input, previous.when), Effect.exit)
|
|
177
237
|
|
|
178
|
-
|
|
238
|
+
if (Exit.isFailure(matchedExit)) {
|
|
239
|
+
causes.push(matchedExit.cause)
|
|
240
|
+
} else if (matchedExit.value) {
|
|
241
|
+
return
|
|
179
242
|
}
|
|
180
|
-
} else {
|
|
181
|
-
causes.push(matchedExit.cause)
|
|
182
243
|
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
for (const _case of cases) {
|
|
186
|
-
// Don't test this case twice
|
|
187
|
-
if (_case === previous) continue
|
|
188
|
-
|
|
189
|
-
const matchedExit = yield* _(_case.guard(input), Effect.exit)
|
|
190
244
|
|
|
191
|
-
|
|
192
|
-
|
|
245
|
+
for (const when of cases) {
|
|
246
|
+
// Don't test this case twice
|
|
247
|
+
if (when === previous?.when) continue
|
|
193
248
|
|
|
194
|
-
|
|
195
|
-
const refSubject = yield* _(getRefSubject(_case, matched.value))
|
|
196
|
-
previous = _case
|
|
249
|
+
const matchedExit = yield* _(matchWhen(input, when), Effect.exit)
|
|
197
250
|
|
|
198
|
-
|
|
251
|
+
if (Exit.isFailure(matchedExit)) {
|
|
252
|
+
causes.push(matchedExit.cause)
|
|
253
|
+
} else if (matchedExit.value) {
|
|
254
|
+
return
|
|
199
255
|
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
if (isNonEmptyReadonlyArray(causes)) {
|
|
259
|
+
const [first, ...rest] = causes
|
|
260
|
+
yield* _(sink.onFailure(reduce(rest, first, Cause.sequential)))
|
|
200
261
|
} else {
|
|
201
|
-
|
|
262
|
+
if (previous !== undefined) {
|
|
263
|
+
yield* _(previous.interrupt)
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
yield* _(sink.onSuccess(Option.none()))
|
|
202
267
|
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
})
|
|
213
|
-
),
|
|
214
|
-
// Avoid restarting based on the Case that was matched to keep a peristent
|
|
215
|
-
// workflow for matcher that has its input values change
|
|
216
|
-
Fx.skipRepeatsWith(Option.getEquivalence(([a], [b]) => a === b)),
|
|
217
|
-
Fx.switchMap(
|
|
218
|
-
Option.match({
|
|
219
|
-
onNone: () => Effect.succeedNone,
|
|
220
|
-
onSome: ([when, ref]) => {
|
|
221
|
-
return Fx.map(Fx.from(when.onMatch(ref)), Option.some)
|
|
222
|
-
}
|
|
223
|
-
})
|
|
224
|
-
)
|
|
268
|
+
})
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return Fx.skipRepeats(input).run(Sink.make(
|
|
272
|
+
sink.onFailure,
|
|
273
|
+
matchInput
|
|
274
|
+
))
|
|
275
|
+
},
|
|
276
|
+
ExecutionStrategy.sequential
|
|
225
277
|
)
|
|
226
|
-
|
|
278
|
+
)
|
|
227
279
|
}
|
|
228
280
|
}
|
|
229
281
|
|
|
230
|
-
class ValueMatcherImpl<R, E, I, O>
|
|
282
|
+
class ValueMatcherImpl<R, E, I, O> extends FxBase<R | Scope.Scope, E, Option.Option<O>>
|
|
283
|
+
implements ValueMatcher<R, E, I, O>
|
|
284
|
+
{
|
|
231
285
|
readonly _tag = "ValueMatcher"
|
|
232
286
|
readonly [MatcherTypeId]: ValueMatcher<R, E, I, O>[MatcherTypeId] = variance
|
|
233
287
|
|
|
234
288
|
constructor(readonly value: Fx.Fx<R, E, I>, readonly matcher: TypeMatcher<R, E, I, O>) {
|
|
289
|
+
super()
|
|
235
290
|
this.when = this.when.bind(this)
|
|
236
291
|
this.to = this.to.bind(this)
|
|
237
292
|
this.getOrElse = this.getOrElse.bind(this)
|
|
238
293
|
}
|
|
239
294
|
|
|
295
|
+
run<R2>(sink: Sink.Sink<R2, E, Option.Option<O>>) {
|
|
296
|
+
return this.matcher.run(this.value).run(sink)
|
|
297
|
+
}
|
|
298
|
+
|
|
240
299
|
when<R2, E2, A, R3 = never, E3 = never, B = never>(
|
|
241
300
|
guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
|
|
242
|
-
onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.
|
|
301
|
+
onMatch: (value: RefSubject.RefSubject<never, never, A>) => Fx.Fx<R3, E3, B>
|
|
243
302
|
): ValueMatcher<R | R2 | R3, E | E2 | E3, I, O | B> {
|
|
244
303
|
return new ValueMatcherImpl<R | R2 | R3, E | E2 | E3, I, O | B>(
|
|
245
304
|
this.value,
|
|
@@ -251,13 +310,10 @@ class ValueMatcherImpl<R, E, I, O> implements ValueMatcher<R, E, I, O> {
|
|
|
251
310
|
guard: Guard<I, R2, E2, A> | AsGuard<I, R2, E2, A>,
|
|
252
311
|
onMatch: B
|
|
253
312
|
): ValueMatcher<R | R2, E | E2, I, O | B> {
|
|
254
|
-
return this.when(guard, () =>
|
|
313
|
+
return this.when(guard, () => Fx.succeed(onMatch))
|
|
255
314
|
}
|
|
256
315
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
getOrElse: ValueMatcher<R, E, I, O>["getOrElse"] = (f) =>
|
|
260
|
-
Fx.suspend(() => Fx.getOrElse(this.matcher.run(this.value), f))
|
|
316
|
+
getOrElse: ValueMatcher<R, E, I, O>["getOrElse"] = (f) => Fx.getOrElse(this.matcher.run(this.value), f)
|
|
261
317
|
}
|
|
262
318
|
|
|
263
319
|
/**
|
package/src/Pull.ts
CHANGED
|
@@ -13,7 +13,7 @@ import * as Either from "effect/Either"
|
|
|
13
13
|
import { dual } from "effect/Function"
|
|
14
14
|
import * as Option from "effect/Option"
|
|
15
15
|
import type * as Schedule from "effect/Schedule"
|
|
16
|
-
import type {
|
|
16
|
+
import type { Sink } from "./Sink.js"
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* An Effect which can be used to pull values of a Stream.
|
|
@@ -24,7 +24,7 @@ export interface Pull<R, E, A> extends Effect.Effect<R, Option.Option<E>, Chunk.
|
|
|
24
24
|
function schedulePull<R, E, A, R2, R3>(
|
|
25
25
|
pull: Pull<R, E, A>,
|
|
26
26
|
f: (effect: Effect.Effect<R | R3, never, unknown>) => Effect.Effect<R2, never, unknown>,
|
|
27
|
-
sink:
|
|
27
|
+
sink: Sink<R3, E, A>
|
|
28
28
|
): Effect.Effect<R2, never, void> {
|
|
29
29
|
return Effect.asyncEffect((resume) =>
|
|
30
30
|
pull.pipe(
|
|
@@ -55,18 +55,18 @@ function schedulePull<R, E, A, R2, R3>(
|
|
|
55
55
|
export const schedule: {
|
|
56
56
|
<R2, R3, E, A>(
|
|
57
57
|
schedule: Schedule.Schedule<R2, unknown, unknown>,
|
|
58
|
-
sink:
|
|
58
|
+
sink: Sink<R3, E, A>
|
|
59
59
|
): <R>(pull: Pull<R, E, A>) => Effect.Effect<R | R2 | R3, never, unknown>
|
|
60
60
|
|
|
61
61
|
<R, E, A, R2, R3>(
|
|
62
62
|
pull: Pull<R, E, A>,
|
|
63
63
|
schedule: Schedule.Schedule<R2, unknown, unknown>,
|
|
64
|
-
sink:
|
|
64
|
+
sink: Sink<R3, E, A>
|
|
65
65
|
): Effect.Effect<R | R2 | R3, never, unknown>
|
|
66
66
|
} = dual(3, function schedule<R, E, A, R2, R3>(
|
|
67
67
|
pull: Pull<R, E, A>,
|
|
68
68
|
schedule: Schedule.Schedule<R2, unknown, unknown>,
|
|
69
|
-
sink:
|
|
69
|
+
sink: Sink<R3, E, A>
|
|
70
70
|
): Effect.Effect<R | R2 | R3, never, void> {
|
|
71
71
|
return schedulePull(pull, Effect.schedule(schedule), sink)
|
|
72
72
|
})
|
|
@@ -79,18 +79,18 @@ export const schedule: {
|
|
|
79
79
|
export const repeat: {
|
|
80
80
|
<R2, R3, E, A>(
|
|
81
81
|
schedule: Schedule.Schedule<R2, unknown, unknown>,
|
|
82
|
-
sink:
|
|
82
|
+
sink: Sink<R3, E, A>
|
|
83
83
|
): <R>(pull: Pull<R, E, A>) => Effect.Effect<R | R2 | R3, never, unknown>
|
|
84
84
|
|
|
85
85
|
<R, E, A, R2, R3>(
|
|
86
86
|
pull: Pull<R, E, A>,
|
|
87
87
|
schedule: Schedule.Schedule<R2, unknown, unknown>,
|
|
88
|
-
sink:
|
|
88
|
+
sink: Sink<R3, E, A>
|
|
89
89
|
): Effect.Effect<R | R2 | R3, never, unknown>
|
|
90
90
|
} = dual(3, function repeat<R, E, A, R2, R3>(
|
|
91
91
|
pull: Pull<R, E, A>,
|
|
92
92
|
schedule: Schedule.Schedule<R2, unknown, unknown>,
|
|
93
|
-
sink:
|
|
93
|
+
sink: Sink<R3, E, A>
|
|
94
94
|
): Effect.Effect<R | R2 | R3, never, void> {
|
|
95
95
|
return schedulePull(pull, Effect.repeat(schedule), sink)
|
|
96
96
|
})
|