@typed/fx 1.13.0 → 1.15.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/dist/Computed.d.ts +42 -0
- package/dist/Computed.d.ts.map +1 -0
- package/dist/Computed.js +39 -0
- package/dist/Computed.js.map +1 -0
- package/dist/Filtered.d.ts +34 -0
- package/dist/Filtered.d.ts.map +1 -0
- package/dist/Filtered.js +40 -0
- package/dist/Filtered.js.map +1 -0
- package/dist/Fx.d.ts +2 -3
- package/dist/Fx.d.ts.map +1 -1
- package/dist/Fx.js +11 -26
- package/dist/Fx.js.map +1 -1
- package/dist/RefArray.d.ts +116 -0
- package/dist/RefArray.d.ts.map +1 -0
- package/dist/RefArray.js +67 -0
- package/dist/RefArray.js.map +1 -0
- package/dist/RefSubject.d.ts +23 -20
- package/dist/RefSubject.d.ts.map +1 -1
- package/dist/RefSubject.js +352 -247
- package/dist/RefSubject.js.map +1 -1
- package/dist/RefTransform.d.ts +51 -0
- package/dist/RefTransform.d.ts.map +1 -0
- package/dist/RefTransform.js +69 -0
- package/dist/RefTransform.js.map +1 -0
- package/dist/Subject.d.ts.map +1 -1
- package/dist/Subject.js +2 -3
- package/dist/Subject.js.map +1 -1
- package/dist/catchAllCause.d.ts +6 -0
- package/dist/catchAllCause.d.ts.map +1 -1
- package/dist/catchAllCause.js +21 -2
- package/dist/catchAllCause.js.map +1 -1
- package/dist/cjs/Computed.d.ts +42 -0
- package/dist/cjs/Computed.d.ts.map +1 -0
- package/dist/cjs/Computed.js +66 -0
- package/dist/cjs/Computed.js.map +1 -0
- package/dist/cjs/Filtered.d.ts +34 -0
- package/dist/cjs/Filtered.d.ts.map +1 -0
- package/dist/cjs/Filtered.js +67 -0
- package/dist/cjs/Filtered.js.map +1 -0
- package/dist/cjs/Fx.d.ts +2 -3
- package/dist/cjs/Fx.d.ts.map +1 -1
- package/dist/cjs/Fx.js +13 -28
- package/dist/cjs/Fx.js.map +1 -1
- package/dist/cjs/RefArray.d.ts +116 -0
- package/dist/cjs/RefArray.d.ts.map +1 -0
- package/dist/cjs/RefArray.js +97 -0
- package/dist/cjs/RefArray.js.map +1 -0
- package/dist/cjs/RefSubject.d.ts +23 -20
- package/dist/cjs/RefSubject.d.ts.map +1 -1
- package/dist/cjs/RefSubject.js +358 -249
- package/dist/cjs/RefSubject.js.map +1 -1
- package/dist/cjs/RefTransform.d.ts +51 -0
- package/dist/cjs/RefTransform.d.ts.map +1 -0
- package/dist/cjs/RefTransform.js +96 -0
- package/dist/cjs/RefTransform.js.map +1 -0
- package/dist/cjs/Subject.d.ts.map +1 -1
- package/dist/cjs/Subject.js +2 -3
- package/dist/cjs/Subject.js.map +1 -1
- package/dist/cjs/catchAllCause.d.ts +6 -0
- package/dist/cjs/catchAllCause.d.ts.map +1 -1
- package/dist/cjs/catchAllCause.js +23 -2
- package/dist/cjs/catchAllCause.js.map +1 -1
- package/dist/cjs/combineAll.d.ts.map +1 -1
- package/dist/cjs/combineAll.js +4 -4
- package/dist/cjs/combineAll.js.map +1 -1
- package/dist/cjs/combineAllDiscard.d.ts.map +1 -1
- package/dist/cjs/combineAllDiscard.js +4 -4
- package/dist/cjs/combineAllDiscard.js.map +1 -1
- package/dist/cjs/data-first.d.ts +10 -0
- package/dist/cjs/data-first.d.ts.map +1 -1
- package/dist/cjs/data-first.js +10 -0
- package/dist/cjs/data-first.js.map +1 -1
- package/dist/cjs/empty.js +1 -1
- package/dist/cjs/empty.js.map +1 -1
- package/dist/cjs/exhaustMapCause.js +1 -1
- package/dist/cjs/exhaustMapCause.js.map +1 -1
- package/dist/cjs/exhaustMapLatestCause.js +1 -1
- package/dist/cjs/exhaustMapLatestCause.js.map +1 -1
- package/dist/cjs/failCause.d.ts +1 -0
- package/dist/cjs/failCause.d.ts.map +1 -1
- package/dist/cjs/failCause.js +5 -1
- package/dist/cjs/failCause.js.map +1 -1
- package/dist/cjs/filter.d.ts.map +1 -1
- package/dist/cjs/filter.js +1 -1
- package/dist/cjs/filter.js.map +1 -1
- package/dist/cjs/filterMap.d.ts.map +1 -1
- package/dist/cjs/filterMap.js +1 -1
- package/dist/cjs/filterMap.js.map +1 -1
- package/dist/cjs/fromArray.js +1 -1
- package/dist/cjs/fromArray.js.map +1 -1
- package/dist/cjs/fromDequeue.d.ts +5 -0
- package/dist/cjs/fromDequeue.d.ts.map +1 -0
- package/dist/cjs/fromDequeue.js +49 -0
- package/dist/cjs/fromDequeue.js.map +1 -0
- package/dist/cjs/fromEffect.d.ts.map +1 -1
- package/dist/cjs/fromEffect.js +9 -1
- package/dist/cjs/fromEffect.js.map +1 -1
- package/dist/cjs/fromEmitter.d.ts.map +1 -1
- package/dist/cjs/fromEmitter.js +4 -5
- package/dist/cjs/fromEmitter.js.map +1 -1
- package/dist/cjs/fromFxEffect.d.ts.map +1 -1
- package/dist/cjs/fromFxEffect.js +1 -1
- package/dist/cjs/fromFxEffect.js.map +1 -1
- package/dist/cjs/fromHub.d.ts +5 -0
- package/dist/cjs/fromHub.d.ts.map +1 -0
- package/dist/cjs/fromHub.js +34 -0
- package/dist/cjs/fromHub.js.map +1 -0
- package/dist/cjs/fromIterable.js +1 -1
- package/dist/cjs/fromIterable.js.map +1 -1
- package/dist/cjs/fromStream.d.ts +4 -0
- package/dist/cjs/fromStream.d.ts.map +1 -0
- package/dist/cjs/fromStream.js +34 -0
- package/dist/cjs/fromStream.js.map +1 -0
- package/dist/cjs/helpers.d.ts +3 -2
- package/dist/cjs/helpers.d.ts.map +1 -1
- package/dist/cjs/helpers.js +28 -69
- package/dist/cjs/helpers.js.map +1 -1
- package/dist/cjs/hold.d.ts +2 -4
- package/dist/cjs/hold.d.ts.map +1 -1
- package/dist/cjs/hold.js +0 -4
- package/dist/cjs/hold.js.map +1 -1
- package/dist/cjs/index.d.ts +36 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +185 -119
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/keyed.d.ts.map +1 -1
- package/dist/cjs/keyed.js +23 -12
- package/dist/cjs/keyed.js.map +1 -1
- package/dist/cjs/mergeAll.d.ts.map +1 -1
- package/dist/cjs/mergeAll.js +1 -1
- package/dist/cjs/mergeAll.js.map +1 -1
- package/dist/cjs/mergeBufferConcurrently.d.ts +8 -0
- package/dist/cjs/mergeBufferConcurrently.d.ts.map +1 -0
- package/dist/cjs/mergeBufferConcurrently.js +95 -0
- package/dist/cjs/mergeBufferConcurrently.js.map +1 -0
- package/dist/cjs/mergeConcurrently.d.ts +3 -0
- package/dist/cjs/mergeConcurrently.d.ts.map +1 -0
- package/dist/cjs/mergeConcurrently.js +69 -0
- package/dist/cjs/mergeConcurrently.js.map +1 -0
- package/dist/cjs/multicast.d.ts +5 -5
- package/dist/cjs/multicast.d.ts.map +1 -1
- package/dist/cjs/multicast.js +14 -14
- package/dist/cjs/multicast.js.map +1 -1
- package/dist/cjs/never.js +1 -1
- package/dist/cjs/never.js.map +1 -1
- package/dist/cjs/observe.d.ts +3 -0
- package/dist/cjs/observe.d.ts.map +1 -1
- package/dist/cjs/observe.js +12 -7
- package/dist/cjs/observe.js.map +1 -1
- package/dist/cjs/onExit.d.ts +5 -0
- package/dist/cjs/onExit.d.ts.map +1 -0
- package/dist/cjs/onExit.js +33 -0
- package/dist/cjs/onExit.js.map +1 -0
- package/dist/cjs/orElse.d.ts +4 -0
- package/dist/cjs/orElse.d.ts.map +1 -0
- package/dist/cjs/orElse.js +34 -0
- package/dist/cjs/orElse.js.map +1 -0
- package/dist/cjs/promise.js +4 -4
- package/dist/cjs/promise.js.map +1 -1
- package/dist/cjs/provide.d.ts.map +1 -1
- package/dist/cjs/provide.js +6 -3
- package/dist/cjs/provide.js.map +1 -1
- package/dist/cjs/skipRepeats.d.ts +1 -1
- package/dist/cjs/skipRepeats.d.ts.map +1 -1
- package/dist/cjs/skipRepeats.js +7 -6
- package/dist/cjs/skipRepeats.js.map +1 -1
- package/dist/cjs/skipWhile.js +1 -1
- package/dist/cjs/skipWhile.js.map +1 -1
- package/dist/cjs/slice.js +3 -3
- package/dist/cjs/slice.js.map +1 -1
- package/dist/cjs/struct.d.ts +5 -0
- package/dist/cjs/struct.d.ts.map +1 -0
- package/dist/cjs/struct.js +10 -0
- package/dist/cjs/struct.js.map +1 -0
- package/dist/cjs/switchMapCause.d.ts +1 -0
- package/dist/cjs/switchMapCause.d.ts.map +1 -1
- package/dist/cjs/switchMapCause.js +13 -2
- package/dist/cjs/switchMapCause.js.map +1 -1
- package/dist/cjs/switchMatch.js +1 -1
- package/dist/cjs/switchMatch.js.map +1 -1
- package/dist/cjs/takeWhile.js +1 -1
- package/dist/cjs/takeWhile.js.map +1 -1
- package/dist/cjs/tap.d.ts.map +1 -1
- package/dist/cjs/tap.js +1 -1
- package/dist/cjs/tap.js.map +1 -1
- package/dist/cjs/tapCause.d.ts.map +1 -1
- package/dist/cjs/tapCause.js +5 -2
- package/dist/cjs/tapCause.js.map +1 -1
- package/dist/cjs/test-utils.js +2 -2
- package/dist/cjs/test-utils.js.map +1 -1
- package/dist/cjs/toArray.d.ts.map +1 -1
- package/dist/cjs/toArray.js +2 -3
- package/dist/cjs/toArray.js.map +1 -1
- package/dist/cjs/toEnqueue.d.ts +6 -0
- package/dist/cjs/toEnqueue.d.ts.map +1 -0
- package/dist/cjs/toEnqueue.js +9 -0
- package/dist/cjs/toEnqueue.js.map +1 -0
- package/dist/cjs/toStream.d.ts +4 -0
- package/dist/cjs/toStream.d.ts.map +1 -0
- package/dist/cjs/toStream.js +35 -0
- package/dist/cjs/toStream.js.map +1 -0
- package/dist/combineAll.d.ts.map +1 -1
- package/dist/combineAll.js +4 -4
- package/dist/combineAll.js.map +1 -1
- package/dist/combineAllDiscard.d.ts.map +1 -1
- package/dist/combineAllDiscard.js +4 -4
- package/dist/combineAllDiscard.js.map +1 -1
- package/dist/data-first.d.ts +10 -0
- package/dist/data-first.d.ts.map +1 -1
- package/dist/data-first.js +10 -0
- package/dist/data-first.js.map +1 -1
- package/dist/empty.js +1 -1
- package/dist/empty.js.map +1 -1
- package/dist/exhaustMapCause.js +1 -1
- package/dist/exhaustMapCause.js.map +1 -1
- package/dist/exhaustMapLatestCause.js +1 -1
- package/dist/exhaustMapLatestCause.js.map +1 -1
- package/dist/failCause.d.ts +1 -0
- package/dist/failCause.d.ts.map +1 -1
- package/dist/failCause.js +3 -0
- package/dist/failCause.js.map +1 -1
- package/dist/filter.d.ts.map +1 -1
- package/dist/filter.js +1 -1
- package/dist/filter.js.map +1 -1
- package/dist/filterMap.d.ts.map +1 -1
- package/dist/filterMap.js +1 -1
- package/dist/filterMap.js.map +1 -1
- package/dist/fromArray.js +1 -1
- package/dist/fromArray.js.map +1 -1
- package/dist/fromDequeue.d.ts +5 -0
- package/dist/fromDequeue.d.ts.map +1 -0
- package/dist/fromDequeue.js +21 -0
- package/dist/fromDequeue.js.map +1 -0
- package/dist/fromEffect.d.ts.map +1 -1
- package/dist/fromEffect.js +10 -2
- package/dist/fromEffect.js.map +1 -1
- package/dist/fromEmitter.d.ts.map +1 -1
- package/dist/fromEmitter.js +4 -5
- package/dist/fromEmitter.js.map +1 -1
- package/dist/fromFxEffect.d.ts.map +1 -1
- package/dist/fromFxEffect.js +1 -1
- package/dist/fromFxEffect.js.map +1 -1
- package/dist/fromHub.d.ts +5 -0
- package/dist/fromHub.d.ts.map +1 -0
- package/dist/fromHub.js +7 -0
- package/dist/fromHub.js.map +1 -0
- package/dist/fromIterable.js +1 -1
- package/dist/fromIterable.js.map +1 -1
- package/dist/fromStream.d.ts +4 -0
- package/dist/fromStream.d.ts.map +1 -0
- package/dist/fromStream.js +7 -0
- package/dist/fromStream.js.map +1 -0
- package/dist/helpers.d.ts +3 -2
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +28 -69
- package/dist/helpers.js.map +1 -1
- package/dist/hold.d.ts +2 -4
- package/dist/hold.d.ts.map +1 -1
- package/dist/hold.js +0 -4
- package/dist/hold.js.map +1 -1
- package/dist/index.d.ts +36 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +132 -116
- package/dist/index.js.map +1 -1
- package/dist/keyed.d.ts.map +1 -1
- package/dist/keyed.js +24 -13
- package/dist/keyed.js.map +1 -1
- package/dist/mergeAll.d.ts.map +1 -1
- package/dist/mergeAll.js +1 -1
- package/dist/mergeAll.js.map +1 -1
- package/dist/mergeBufferConcurrently.d.ts +8 -0
- package/dist/mergeBufferConcurrently.d.ts.map +1 -0
- package/dist/mergeBufferConcurrently.js +68 -0
- package/dist/mergeBufferConcurrently.js.map +1 -0
- package/dist/mergeConcurrently.d.ts +3 -0
- package/dist/mergeConcurrently.d.ts.map +1 -0
- package/dist/mergeConcurrently.js +42 -0
- package/dist/mergeConcurrently.js.map +1 -0
- package/dist/multicast.d.ts +5 -5
- package/dist/multicast.d.ts.map +1 -1
- package/dist/multicast.js +15 -15
- package/dist/multicast.js.map +1 -1
- package/dist/never.js +1 -1
- package/dist/never.js.map +1 -1
- package/dist/observe.d.ts +3 -0
- package/dist/observe.d.ts.map +1 -1
- package/dist/observe.js +9 -6
- package/dist/observe.js.map +1 -1
- package/dist/onExit.d.ts +5 -0
- package/dist/onExit.d.ts.map +1 -0
- package/dist/onExit.js +6 -0
- package/dist/onExit.js.map +1 -0
- package/dist/orElse.d.ts +4 -0
- package/dist/orElse.d.ts.map +1 -0
- package/dist/orElse.js +7 -0
- package/dist/orElse.js.map +1 -0
- package/dist/promise.js +4 -4
- package/dist/promise.js.map +1 -1
- package/dist/provide.d.ts.map +1 -1
- package/dist/provide.js +6 -3
- package/dist/provide.js.map +1 -1
- package/dist/skipRepeats.d.ts +1 -1
- package/dist/skipRepeats.d.ts.map +1 -1
- package/dist/skipRepeats.js +4 -6
- package/dist/skipRepeats.js.map +1 -1
- package/dist/skipWhile.js +1 -1
- package/dist/skipWhile.js.map +1 -1
- package/dist/slice.js +3 -3
- package/dist/slice.js.map +1 -1
- package/dist/struct.d.ts +5 -0
- package/dist/struct.d.ts.map +1 -0
- package/dist/struct.js +6 -0
- package/dist/struct.js.map +1 -0
- package/dist/switchMapCause.d.ts +1 -0
- package/dist/switchMapCause.d.ts.map +1 -1
- package/dist/switchMapCause.js +11 -1
- package/dist/switchMapCause.js.map +1 -1
- package/dist/switchMatch.js +1 -1
- package/dist/switchMatch.js.map +1 -1
- package/dist/takeWhile.js +1 -1
- package/dist/takeWhile.js.map +1 -1
- package/dist/tap.d.ts.map +1 -1
- package/dist/tap.js +1 -1
- package/dist/tap.js.map +1 -1
- package/dist/tapCause.d.ts.map +1 -1
- package/dist/tapCause.js +5 -2
- package/dist/tapCause.js.map +1 -1
- package/dist/test-utils.js +2 -2
- package/dist/test-utils.js.map +1 -1
- package/dist/toArray.d.ts.map +1 -1
- package/dist/toArray.js +2 -3
- package/dist/toArray.js.map +1 -1
- package/dist/toEnqueue.d.ts +6 -0
- package/dist/toEnqueue.d.ts.map +1 -0
- package/dist/toEnqueue.js +5 -0
- package/dist/toEnqueue.js.map +1 -0
- package/dist/toStream.d.ts +4 -0
- package/dist/toStream.d.ts.map +1 -0
- package/dist/toStream.js +8 -0
- package/dist/toStream.js.map +1 -0
- package/dist/tsconfig.cjs.build.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/src/Computed.ts +114 -0
- package/src/Filtered.ts +112 -0
- package/src/Fx.ts +17 -42
- package/src/RefArray.ts +226 -0
- package/src/RefSubject.test.ts +67 -6
- package/src/RefSubject.ts +601 -581
- package/src/RefTransform.ts +134 -0
- package/src/Subject.ts +4 -13
- package/src/catchAllCause.ts +43 -2
- package/src/combineAll.ts +16 -13
- package/src/combineAllDiscard.ts +16 -13
- package/src/data-first.ts +10 -0
- package/src/empty.ts +1 -1
- package/src/exhaustMapCause.ts +1 -1
- package/src/exhaustMapLatestCause.ts +1 -1
- package/src/failCause.ts +4 -0
- package/src/filter.ts +1 -3
- package/src/filterMap.ts +8 -1
- package/src/fromArray.ts +1 -1
- package/src/fromDequeue.ts +39 -0
- package/src/fromEffect.ts +12 -2
- package/src/fromEmitter.ts +4 -10
- package/src/fromFxEffect.ts +3 -1
- package/src/fromHub.ts +10 -0
- package/src/fromIterable.ts +1 -1
- package/src/helpers.ts +73 -106
- package/src/hold.ts +1 -7
- package/src/index.ts +573 -607
- package/src/keyed.ts +45 -28
- package/src/mergeAll.ts +8 -5
- package/src/mergeBufferConcurrently.test.ts +37 -0
- package/src/mergeBufferConcurrently.ts +105 -0
- package/src/mergeConcurrently.test.ts +20 -0
- package/src/mergeConcurrently.ts +57 -0
- package/src/multicast.ts +30 -22
- package/src/never.ts +1 -1
- package/src/observe.ts +16 -7
- package/src/onExit.ts +13 -0
- package/src/orElse.ts +16 -0
- package/src/promise.ts +4 -4
- package/src/provide.ts +9 -7
- package/src/skipRepeats.ts +5 -7
- package/src/skipWhile.ts +1 -1
- package/src/slice.ts +3 -3
- package/src/struct.ts +18 -0
- package/src/switchMapCause.ts +17 -1
- package/src/switchMatch.ts +1 -1
- package/src/takeWhile.ts +1 -1
- package/src/tap.ts +5 -1
- package/src/tapCause.ts +8 -6
- package/src/test-utils.ts +2 -2
- package/src/toArray.ts +5 -4
- package/src/toEnqueue.ts +13 -0
- package/tsconfig.build.json +2 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/vite.config.js +3 -0
package/src/RefSubject.ts
CHANGED
|
@@ -1,34 +1,47 @@
|
|
|
1
1
|
import * as Context from '@effect/data/Context'
|
|
2
|
-
import type { Trace } from '@effect/data/Debug'
|
|
3
|
-
import { methodWithTrace } from '@effect/data/Debug'
|
|
4
|
-
import { equals } from '@effect/data/Equal'
|
|
5
2
|
import * as Equal from '@effect/data/Equal'
|
|
6
3
|
import { identity, pipe } from '@effect/data/Function'
|
|
7
4
|
import * as Hash from '@effect/data/Hash'
|
|
8
5
|
import * as MutableRef from '@effect/data/MutableRef'
|
|
9
6
|
import * as Option from '@effect/data/Option'
|
|
10
|
-
import
|
|
11
|
-
import * as Equivalence from '@effect/data/
|
|
7
|
+
import { Pipeable, pipeArguments } from '@effect/data/Pipeable'
|
|
8
|
+
import * as Equivalence from '@effect/data/Equivalence'
|
|
9
|
+
import * as Deferred from '@effect/io/Deferred'
|
|
12
10
|
import * as Effect from '@effect/io/Effect'
|
|
13
11
|
import * as Fiber from '@effect/io/Fiber'
|
|
14
|
-
|
|
15
|
-
import
|
|
16
|
-
|
|
12
|
+
import * as Scope from '@effect/io/Scope'
|
|
13
|
+
import fastDeepEqual from 'fast-deep-equal'
|
|
14
|
+
|
|
15
|
+
import { Computed, ComputedImpl, ComputedTypeId } from './Computed.js'
|
|
16
|
+
import { FilteredImpl } from './Filtered.js'
|
|
17
|
+
import { Fx, FxTypeId, Sink, isFx } from './Fx.js'
|
|
18
|
+
import { RefTransform, RefTransformImpl } from './RefTransform.js'
|
|
19
|
+
import { Subject } from './Subject.js'
|
|
17
20
|
import { combineAll } from './combineAll.js'
|
|
18
21
|
import { HoldFx } from './hold.js'
|
|
19
|
-
import { map } from './map.js'
|
|
20
|
-
import { multicast } from './multicast.js'
|
|
21
22
|
import { never } from './never.js'
|
|
22
|
-
import {
|
|
23
|
+
import { drain } from './observe.js'
|
|
24
|
+
import { struct } from './struct.js'
|
|
25
|
+
import { switchMatchCauseEffect } from './switchMatch.js'
|
|
26
|
+
|
|
27
|
+
const unboundedConcurrency = { concurrency: 'unbounded' } as const
|
|
28
|
+
|
|
29
|
+
const refVariance = {
|
|
30
|
+
_R: identity,
|
|
31
|
+
_E: identity,
|
|
32
|
+
_A: identity,
|
|
33
|
+
}
|
|
23
34
|
|
|
24
|
-
export const RefSubjectTypeId = Symbol.for('
|
|
35
|
+
export const RefSubjectTypeId = Symbol.for('@typed/fx/RefSubject')
|
|
25
36
|
export type RefSubjectTypeId = typeof RefSubjectTypeId
|
|
26
37
|
|
|
27
|
-
export interface RefSubject<in out E, in out A>
|
|
38
|
+
export interface RefSubject<in out E, in out A>
|
|
39
|
+
extends Subject<E, A>,
|
|
40
|
+
Computed<never, E, A>,
|
|
41
|
+
Pipeable {
|
|
28
42
|
readonly [RefSubjectTypeId]: RefSubjectTypeId
|
|
29
43
|
|
|
30
44
|
readonly eq: Equivalence.Equivalence<A>
|
|
31
|
-
readonly get: Effect.Effect<never, E, A>
|
|
32
45
|
|
|
33
46
|
readonly modifyEffect: <R2, E2, B>(
|
|
34
47
|
f: (a: A) => Effect.Effect<R2, E2, readonly [B, A]>,
|
|
@@ -42,57 +55,75 @@ export interface RefSubject<in out E, in out A> extends Subject<E, A>, Effect.Ef
|
|
|
42
55
|
|
|
43
56
|
readonly update: (f: (a: A) => A) => Effect.Effect<never, E, A>
|
|
44
57
|
|
|
45
|
-
readonly set: (a: A) => Effect.Effect<never,
|
|
58
|
+
readonly set: (a: A) => Effect.Effect<never, never, A>
|
|
46
59
|
|
|
47
60
|
readonly delete: Effect.Effect<never, E, Option.Option<A>>
|
|
48
61
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
62
|
+
/**
|
|
63
|
+
* The current version of the RefSubject, starting with 0, 1 when initialized,
|
|
64
|
+
* and incremented each time the value is updated.
|
|
65
|
+
*/
|
|
66
|
+
readonly version: () => number
|
|
52
67
|
}
|
|
53
68
|
|
|
54
|
-
|
|
55
|
-
readonly get: Effect.Effect<R, E, A>
|
|
56
|
-
|
|
57
|
-
readonly mapEffect: <R2, E2, B>(
|
|
58
|
-
f: (a: A) => Effect.Effect<R2, E2, B>,
|
|
59
|
-
) => Computed<R | R2, E | E2, B>
|
|
60
|
-
|
|
61
|
-
readonly map: <B>(f: (a: A) => B) => Computed<R, E, B>
|
|
62
|
-
}
|
|
69
|
+
type Lock = <R2, E2, B>(effect: Effect.Effect<R2, E2, B>) => Effect.Effect<R2, E2, B>
|
|
63
70
|
|
|
64
71
|
export function makeRef<R, E, A>(
|
|
65
72
|
effect: Effect.Effect<R, E, A>,
|
|
66
|
-
eq
|
|
67
|
-
): Effect.Effect<R, never, RefSubject<E, A>> {
|
|
68
|
-
return Effect.
|
|
69
|
-
(
|
|
73
|
+
eq?: Equivalence.Equivalence<A>,
|
|
74
|
+
): Effect.Effect<R | Scope.Scope, never, RefSubject<E, A>> {
|
|
75
|
+
return Effect.contextWithEffect((context) =>
|
|
76
|
+
Effect.suspend(() => {
|
|
77
|
+
const ref = RefSubject.unsafeMake(
|
|
78
|
+
Effect.provideContext(effect, context),
|
|
79
|
+
Context.get(context, Scope.Scope),
|
|
80
|
+
eq,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
return Effect.as(
|
|
84
|
+
Effect.addFinalizer(() => ref.end()),
|
|
85
|
+
ref,
|
|
86
|
+
)
|
|
87
|
+
}),
|
|
70
88
|
)
|
|
71
89
|
}
|
|
72
90
|
|
|
73
91
|
export namespace RefSubject {
|
|
74
92
|
export type Any = RefSubject<any, any> | RefSubject<never, any>
|
|
75
93
|
|
|
76
|
-
export function
|
|
77
|
-
|
|
94
|
+
export function unsafeMake<E, A>(
|
|
95
|
+
initial: Effect.Effect<never, E, A>,
|
|
96
|
+
scope: Scope.Scope,
|
|
97
|
+
eq: Equivalence.Equivalence<A> = fastDeepEqual,
|
|
98
|
+
): RefSubject<E, A> {
|
|
99
|
+
return makeRefFromPrimitive(unsafeMakeRefPrimitive(initial, scope, eq))
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function tuple<const Refs extends readonly Any[]>(
|
|
103
|
+
...refs: Refs
|
|
78
104
|
): RefSubject<
|
|
79
|
-
Fx.ErrorsOf<
|
|
105
|
+
Fx.ErrorsOf<Refs[number]>,
|
|
80
106
|
{
|
|
81
|
-
readonly [K in keyof
|
|
107
|
+
readonly [K in keyof Refs]: Fx.OutputOf<Refs[K]>
|
|
82
108
|
}
|
|
83
109
|
> {
|
|
84
|
-
return
|
|
110
|
+
return makeRefFromPrimitive<
|
|
111
|
+
Fx.ErrorsOf<Refs[number]>,
|
|
112
|
+
{
|
|
113
|
+
readonly [K in keyof Refs]: Fx.OutputOf<Refs[K]>
|
|
114
|
+
}
|
|
115
|
+
>(tupleRefPrimitive<Refs>(refs))
|
|
85
116
|
}
|
|
86
117
|
|
|
87
|
-
export function struct<
|
|
88
|
-
|
|
118
|
+
export function struct<const Refs extends Readonly<Record<string, Any>>>(
|
|
119
|
+
refs: Refs,
|
|
89
120
|
): RefSubject<
|
|
90
|
-
Fx.ErrorsOf<
|
|
121
|
+
Fx.ErrorsOf<Refs[string]>,
|
|
91
122
|
{
|
|
92
|
-
readonly [K in keyof
|
|
123
|
+
readonly [K in keyof Refs]: Fx.OutputOf<Refs[K]>
|
|
93
124
|
}
|
|
94
125
|
> {
|
|
95
|
-
return
|
|
126
|
+
return makeRefFromPrimitive(structRefPrimitive<Refs>(refs))
|
|
96
127
|
}
|
|
97
128
|
|
|
98
129
|
export function all<S extends ReadonlyArray<Any>>(
|
|
@@ -104,7 +135,16 @@ export namespace RefSubject {
|
|
|
104
135
|
}
|
|
105
136
|
>
|
|
106
137
|
|
|
107
|
-
export function all<S extends
|
|
138
|
+
export function all<S extends ReadonlyArray<Any>>(
|
|
139
|
+
...subjects: S
|
|
140
|
+
): RefSubject<
|
|
141
|
+
Fx.ErrorsOf<S[number]>,
|
|
142
|
+
{
|
|
143
|
+
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
144
|
+
}
|
|
145
|
+
>
|
|
146
|
+
|
|
147
|
+
export function all<S extends Readonly<Record<string, Any>>>(
|
|
108
148
|
subjects: S,
|
|
109
149
|
): RefSubject<
|
|
110
150
|
Fx.ErrorsOf<S[string]>,
|
|
@@ -113,643 +153,623 @@ export namespace RefSubject {
|
|
|
113
153
|
}
|
|
114
154
|
>
|
|
115
155
|
|
|
116
|
-
export function all(subjects: any): any {
|
|
117
|
-
|
|
118
|
-
|
|
156
|
+
export function all(...subjects: any): any {
|
|
157
|
+
/// MUST be a tuple if more than one argument
|
|
158
|
+
if (subjects.length > 1) {
|
|
159
|
+
return tuple(...subjects)
|
|
160
|
+
}
|
|
119
161
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
162
|
+
// Otherwise a single param is either a tuple or a struct
|
|
163
|
+
const singleParam = subjects[0]
|
|
164
|
+
|
|
165
|
+
if (Array.isArray(singleParam)) {
|
|
166
|
+
return tuple(...singleParam)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return struct(singleParam)
|
|
125
170
|
}
|
|
126
171
|
}
|
|
127
172
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
_E: identity,
|
|
131
|
-
_A: identity,
|
|
173
|
+
export function isRefSubject<E, A>(u: unknown): u is RefSubject<E, A> {
|
|
174
|
+
return isFx<never, E, A>(u) && RefSubjectTypeId in u
|
|
132
175
|
}
|
|
133
176
|
|
|
134
|
-
|
|
135
|
-
readonly _tag = 'Commit'
|
|
136
|
-
public i2: any = undefined
|
|
137
|
-
public trace: Trace = undefined;
|
|
138
|
-
|
|
139
|
-
readonly [Effect.EffectTypeId] = refSubjectVariant;
|
|
140
|
-
readonly [RefSubjectTypeId]: RefSubjectTypeId = RefSubjectTypeId
|
|
141
|
-
|
|
142
|
-
readonly lock = Effect.unsafeMakeSemaphore(1).withPermits(1)
|
|
143
|
-
readonly initializeFiber: MutableRef.MutableRef<Option.Option<Fiber.RuntimeFiber<E, A>>> =
|
|
144
|
-
MutableRef.make(Option.none())
|
|
177
|
+
// Internals for RefSubject
|
|
145
178
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
super(never<E, A>())
|
|
179
|
+
function makeGetFromContext<E, A>(ctx: RefSubjectContext<E, A>): RefSubject<E, A>['get'] {
|
|
180
|
+
return Effect.suspend(() => {
|
|
181
|
+
const current = MutableRef.get(ctx.currentRef)
|
|
150
182
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
183
|
+
if (Option.isSome(current)) {
|
|
184
|
+
return Effect.succeed(current.value)
|
|
185
|
+
}
|
|
154
186
|
|
|
155
|
-
|
|
156
|
-
return Effect.suspend(() => {
|
|
157
|
-
const current = MutableRef.get(this.current)
|
|
187
|
+
const fiber = MutableRef.get(ctx.initializingFiberRef)
|
|
158
188
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
Effect.catchAllCause(sink.error),
|
|
163
|
-
Effect.flatMap(() => super.run(sink)),
|
|
164
|
-
)
|
|
165
|
-
}
|
|
189
|
+
if (Option.isSome(fiber)) {
|
|
190
|
+
return Fiber.join(fiber.value)
|
|
191
|
+
}
|
|
166
192
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
193
|
+
return Effect.tap(ctx.lock(initializeFromContext(ctx)), (a) => ctx.hold.event(a))
|
|
194
|
+
})
|
|
195
|
+
}
|
|
170
196
|
|
|
171
|
-
|
|
172
|
-
|
|
197
|
+
function initializeFromContext<E, A>(ctx: RefSubjectContext<E, A>): Effect.Effect<never, E, A> {
|
|
198
|
+
return Effect.uninterruptibleMask((restore) =>
|
|
199
|
+
Effect.flatMap(Effect.forkIn(restore(ctx.initial), ctx.scope), (fiber) => {
|
|
200
|
+
MutableRef.set(ctx.initializingFiberRef, Option.some(fiber))
|
|
201
|
+
|
|
202
|
+
return Effect.tap(Fiber.join(fiber), (a) =>
|
|
203
|
+
Effect.sync(() => {
|
|
204
|
+
MutableRef.increment(ctx.version)
|
|
205
|
+
MutableRef.set(ctx.currentRef, Option.some(a))
|
|
206
|
+
MutableRef.set(ctx.initializingFiberRef, Option.none())
|
|
207
|
+
}),
|
|
208
|
+
)
|
|
209
|
+
}),
|
|
173
210
|
)
|
|
211
|
+
}
|
|
174
212
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
)
|
|
213
|
+
function makeRefMethods<E, A>(
|
|
214
|
+
primitive: RefPrimitive<E, A>,
|
|
215
|
+
): Pick<RefSubject<E, A>, 'modify' | 'updateEffect' | 'update'> {
|
|
216
|
+
const modify = makeModify<E, A>(primitive.modifyEffect)
|
|
217
|
+
const updateEffect = makeUpdateEffect<E, A>(primitive.modifyEffect)
|
|
218
|
+
const update = makeUpdate<E, A>(updateEffect)
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
modify,
|
|
222
|
+
updateEffect,
|
|
223
|
+
update,
|
|
224
|
+
} as const
|
|
225
|
+
}
|
|
181
226
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
227
|
+
function makeModifyEffectFromContext<E, A>(
|
|
228
|
+
get: RefSubject<E, A>['get'],
|
|
229
|
+
ctx: RefSubjectContext<E, A>,
|
|
230
|
+
): RefSubject<E, A>['modifyEffect'] {
|
|
231
|
+
return (f) =>
|
|
232
|
+
Effect.flatMap(get, (a1) =>
|
|
233
|
+
ctx.lock(
|
|
234
|
+
Effect.flatMap(f(a1), ([b, a2]) =>
|
|
235
|
+
Effect.suspend(() => {
|
|
236
|
+
MutableRef.set(ctx.currentRef, Option.some(a2))
|
|
185
237
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
return Fiber.interrupt(fiber.value)
|
|
190
|
-
}
|
|
238
|
+
if (ctx.eq(a1, a2)) {
|
|
239
|
+
return Effect.succeed(b)
|
|
240
|
+
}
|
|
191
241
|
|
|
192
|
-
|
|
193
|
-
}
|
|
242
|
+
MutableRef.increment(ctx.version)
|
|
194
243
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
Option.match(
|
|
199
|
-
() =>
|
|
200
|
-
pipe(
|
|
201
|
-
MutableRef.get(this.initializeFiber),
|
|
202
|
-
Option.match(
|
|
203
|
-
() =>
|
|
204
|
-
this.lock(
|
|
205
|
-
Effect.uninterruptibleMask((restore) =>
|
|
206
|
-
pipe(
|
|
207
|
-
Effect.forkDaemon(restore(this.i0)),
|
|
208
|
-
Effect.tap((fiber) =>
|
|
209
|
-
Effect.sync(() => MutableRef.set(this.initializeFiber, Option.some(fiber))),
|
|
210
|
-
),
|
|
211
|
-
Effect.flatMap(Fiber.join),
|
|
212
|
-
Effect.tap((a) =>
|
|
213
|
-
Effect.suspend(() => {
|
|
214
|
-
MutableRef.set(this.current, Option.some(a))
|
|
215
|
-
MutableRef.set(this.initializeFiber, Option.none())
|
|
216
|
-
|
|
217
|
-
return super.event(a)
|
|
218
|
-
}),
|
|
219
|
-
),
|
|
220
|
-
),
|
|
221
|
-
),
|
|
222
|
-
),
|
|
223
|
-
Fiber.join,
|
|
224
|
-
),
|
|
225
|
-
),
|
|
226
|
-
Effect.succeed,
|
|
244
|
+
return Effect.as(ctx.hold.event(a2), b)
|
|
245
|
+
}),
|
|
246
|
+
),
|
|
227
247
|
),
|
|
228
|
-
)
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
modifyEffect<R2, E2, B>(f: (a: A) => Effect.Effect<R2, E2, readonly [B, A]>) {
|
|
232
|
-
return methodWithTrace(
|
|
233
|
-
(trace) =>
|
|
234
|
-
<R2, E2, B>(f: (a: A) => Effect.Effect<R2, E2, readonly [B, A]>) =>
|
|
235
|
-
Effect.flatMap(this.get, (a1) =>
|
|
236
|
-
this.lock(
|
|
237
|
-
Effect.flatMap(f(a1), ([b, a2]) =>
|
|
238
|
-
Effect.suspend(() => {
|
|
239
|
-
MutableRef.set(this.current, Option.some(a2))
|
|
240
|
-
|
|
241
|
-
if (this.i1(a1, a2)) {
|
|
242
|
-
return Effect.succeed(b)
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
return Effect.as(super.event(a2), b)
|
|
246
|
-
}),
|
|
247
|
-
),
|
|
248
|
-
),
|
|
249
|
-
).traced(trace),
|
|
250
|
-
)(f)
|
|
251
|
-
}
|
|
248
|
+
)
|
|
249
|
+
}
|
|
252
250
|
|
|
253
|
-
|
|
254
|
-
|
|
251
|
+
function makeModify<E, A>(
|
|
252
|
+
modifyEffect: RefSubject<E, A>['modifyEffect'],
|
|
253
|
+
): RefSubject<E, A>['modify'] {
|
|
254
|
+
return (f) => modifyEffect((a) => Effect.sync(() => f(a)))
|
|
255
|
+
}
|
|
255
256
|
|
|
256
|
-
|
|
257
|
-
|
|
257
|
+
function makeUpdateEffect<E, A>(
|
|
258
|
+
modifyEffect: RefSubject<E, A>['modifyEffect'],
|
|
259
|
+
): RefSubject<E, A>['updateEffect'] {
|
|
260
|
+
return (f) => modifyEffect((a) => Effect.map(f(a), (a) => [a, a]))
|
|
261
|
+
}
|
|
258
262
|
|
|
259
|
-
|
|
260
|
-
|
|
263
|
+
function makeUpdate<E, A>(
|
|
264
|
+
updateEffect: RefSubject<E, A>['updateEffect'],
|
|
265
|
+
): RefSubject<E, A>['update'] {
|
|
266
|
+
return (f) => updateEffect((a) => Effect.sync(() => f(a)))
|
|
267
|
+
}
|
|
261
268
|
|
|
262
|
-
|
|
269
|
+
function makeSetFromContext<E, A>(ctx: RefSubjectContext<E, A>): RefSubject<E, A>['set'] {
|
|
270
|
+
return (a: A) =>
|
|
271
|
+
Effect.suspend(() => {
|
|
272
|
+
const fiber = MutableRef.get(ctx.initializingFiberRef)
|
|
273
|
+
|
|
274
|
+
return pipe(
|
|
275
|
+
fiber,
|
|
276
|
+
Option.match({ onNone: () => Effect.unit, onSome: Fiber.await }),
|
|
277
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
278
|
+
Effect.flatMap((_: unknown) => {
|
|
279
|
+
const current = MutableRef.get(ctx.currentRef)
|
|
280
|
+
|
|
281
|
+
MutableRef.set(ctx.currentRef, Option.some(a))
|
|
282
|
+
|
|
283
|
+
// Only emit if the value has changed
|
|
284
|
+
if (Option.isNone(current) || (Option.isSome(current) && !ctx.eq(current.value, a))) {
|
|
285
|
+
// Increment the version
|
|
286
|
+
MutableRef.increment(ctx.version)
|
|
287
|
+
return Effect.as(ctx.hold.event(a), a)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return Effect.succeed(a)
|
|
291
|
+
}),
|
|
292
|
+
)
|
|
293
|
+
})
|
|
294
|
+
}
|
|
263
295
|
|
|
264
|
-
|
|
265
|
-
|
|
296
|
+
function makeDeleteFromContext<E, A>(ctx: RefSubjectContext<E, A>): RefSubject<E, A>['delete'] {
|
|
297
|
+
return Effect.sync(() => {
|
|
298
|
+
const current = MutableRef.get(ctx.currentRef)
|
|
266
299
|
|
|
267
300
|
if (Option.isSome(current)) {
|
|
268
|
-
MutableRef.set(
|
|
301
|
+
MutableRef.set(ctx.version, 0)
|
|
302
|
+
MutableRef.set(ctx.currentRef, Option.none())
|
|
269
303
|
}
|
|
270
304
|
|
|
271
|
-
return
|
|
305
|
+
return current
|
|
272
306
|
})
|
|
307
|
+
}
|
|
273
308
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
readonly map: RefSubject<E, A>['map'] = (f) => this.mapEffect((a) => Effect.sync(() => f(a)));
|
|
309
|
+
function makeEndFromContext<E, A>(ctx: RefSubjectContext<E, A>): RefSubject<E, A>['end'] {
|
|
310
|
+
return () =>
|
|
311
|
+
Effect.suspend(() => {
|
|
312
|
+
MutableRef.set(ctx.version, 0)
|
|
279
313
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
314
|
+
const fibers = [
|
|
315
|
+
ctx.hold.fiber || Fiber.unit,
|
|
316
|
+
Option.getOrElse(MutableRef.get(ctx.initializingFiberRef), () => Fiber.unit),
|
|
317
|
+
]
|
|
283
318
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
319
|
+
return Fiber.interruptAll(fibers)
|
|
320
|
+
})
|
|
321
|
+
}
|
|
287
322
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
323
|
+
function makeFiltered<E, A>(
|
|
324
|
+
f: () => RefSubject<E, A>,
|
|
325
|
+
): Pick<
|
|
326
|
+
RefSubject<E, A>,
|
|
327
|
+
'filterMapEffect' | 'filterMap' | 'filterEffect' | 'filter' | 'filterNotEffect' | 'filterNot'
|
|
328
|
+
> {
|
|
329
|
+
const get = makeMemoizedGet(f)
|
|
294
330
|
|
|
295
|
-
|
|
331
|
+
function filterMapEffect<R2, E2, B>(f: (a: A) => Effect.Effect<R2, E2, Option.Option<B>>) {
|
|
332
|
+
return new FilteredImpl(get(), f)
|
|
296
333
|
}
|
|
297
334
|
|
|
298
|
-
|
|
299
|
-
return
|
|
335
|
+
function filterMap<B>(f: (a: A) => Option.Option<B>) {
|
|
336
|
+
return filterMapEffect((a) => Effect.sync(() => f(a)))
|
|
300
337
|
}
|
|
301
|
-
}
|
|
302
338
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
never,
|
|
306
|
-
Fx.ErrorsOf<S[number]>,
|
|
307
|
-
{
|
|
308
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
309
|
-
}
|
|
310
|
-
>
|
|
311
|
-
implements
|
|
312
|
-
RefSubject<
|
|
313
|
-
Fx.ErrorsOf<S[number]>,
|
|
314
|
-
{
|
|
315
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
316
|
-
}
|
|
317
|
-
>
|
|
318
|
-
{
|
|
319
|
-
readonly _tag = 'Commit'
|
|
320
|
-
public trace: Trace = undefined;
|
|
321
|
-
|
|
322
|
-
readonly [Effect.EffectTypeId] = refSubjectVariant;
|
|
323
|
-
readonly [RefSubjectTypeId]: RefSubjectTypeId = RefSubjectTypeId
|
|
324
|
-
|
|
325
|
-
readonly i1: Equivalence.Equivalence<{ readonly [K in keyof S]: Fx.OutputOf<S[K]> }>
|
|
326
|
-
public i2: any = undefined
|
|
327
|
-
|
|
328
|
-
readonly lock = Effect.unsafeMakeSemaphore(1).withPermits(1)
|
|
329
|
-
|
|
330
|
-
readonly eq: Equivalence.Equivalence<{ readonly [K in keyof S]: Fx.OutputOf<S[K]> }>
|
|
331
|
-
|
|
332
|
-
constructor(readonly i0: S) {
|
|
333
|
-
super(combineAll(...i0) as any)
|
|
334
|
-
|
|
335
|
-
this.i1 = this.eq = Equivalence.tuple(...i0.map((s) => s.eq)) as Equivalence.Equivalence<{
|
|
336
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
337
|
-
}>
|
|
339
|
+
function filterEffect<R2, E2>(f: (a: A) => Effect.Effect<R2, E2, boolean>) {
|
|
340
|
+
return filterMapEffect((a) => Effect.map(f(a), (b) => (b ? Option.some(a) : Option.none())))
|
|
338
341
|
}
|
|
339
342
|
|
|
340
|
-
|
|
341
|
-
return Effect.
|
|
343
|
+
function filter(f: (a: A) => boolean) {
|
|
344
|
+
return filterEffect((a) => Effect.sync(() => f(a)))
|
|
342
345
|
}
|
|
343
346
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
348
|
-
}
|
|
349
|
-
>['get'] = Effect.suspend(
|
|
350
|
-
() =>
|
|
351
|
-
Effect.allPar(this.i0.map((s) => s.get)) as Effect.Effect<
|
|
352
|
-
never,
|
|
353
|
-
Fx.ErrorsOf<S[number]>,
|
|
354
|
-
{
|
|
355
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
356
|
-
}
|
|
357
|
-
>,
|
|
358
|
-
)
|
|
359
|
-
|
|
360
|
-
modifyEffect<R2, E2, B>(
|
|
361
|
-
f: (a: {
|
|
362
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
363
|
-
}) => Effect.Effect<R2, E2, readonly [B, { readonly [K in keyof S]: Fx.OutputOf<S[K]> }]>,
|
|
364
|
-
) {
|
|
365
|
-
const { current, i0 } = this
|
|
347
|
+
function filterNotEffect<R2, E2>(f: (a: A) => Effect.Effect<R2, E2, boolean>) {
|
|
348
|
+
return filterEffect((a) => Effect.map(f(a), (b) => !b))
|
|
349
|
+
}
|
|
366
350
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
this.lock(
|
|
371
|
-
Effect.gen(function* ($) {
|
|
372
|
-
const [b, a2] = yield* $(f(a))
|
|
351
|
+
function filterNot(f: (a: A) => boolean) {
|
|
352
|
+
return filterNotEffect((a) => Effect.sync(() => f(a)))
|
|
353
|
+
}
|
|
373
354
|
|
|
374
|
-
|
|
355
|
+
return {
|
|
356
|
+
filterMapEffect,
|
|
357
|
+
filterMap,
|
|
358
|
+
filterEffect,
|
|
359
|
+
filter,
|
|
360
|
+
filterNotEffect,
|
|
361
|
+
filterNot,
|
|
362
|
+
} as const
|
|
363
|
+
}
|
|
375
364
|
|
|
376
|
-
|
|
365
|
+
function makeComputedMethods<E, A>(
|
|
366
|
+
f: () => RefSubject<E, A>,
|
|
367
|
+
): Pick<RefSubject<E, A>, 'mapEffect' | 'map'> {
|
|
368
|
+
const get = makeMemoizedGet(f)
|
|
377
369
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
),
|
|
381
|
-
),
|
|
382
|
-
)
|
|
370
|
+
function mapEffect<R2, E2, B>(f: (a: A) => Effect.Effect<R2, E2, B>): Computed<R2, E | E2, B> {
|
|
371
|
+
return new ComputedImpl(get(), f)
|
|
383
372
|
}
|
|
384
373
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
389
|
-
}
|
|
390
|
-
>['modify'] = (f) => this.modifyEffect((a) => Effect.sync(() => f(a)))
|
|
391
|
-
|
|
392
|
-
readonly updateEffect: RefSubject<
|
|
393
|
-
Fx.ErrorsOf<S[number]>,
|
|
394
|
-
{
|
|
395
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
396
|
-
}
|
|
397
|
-
>['updateEffect'] = (f) => this.modifyEffect((a) => Effect.map(f(a), (a) => [a, a]))
|
|
398
|
-
|
|
399
|
-
readonly update: RefSubject<
|
|
400
|
-
Fx.ErrorsOf<S[number]>,
|
|
401
|
-
{
|
|
402
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
403
|
-
}
|
|
404
|
-
>['update'] = (f) => this.updateEffect((a) => Effect.sync(() => f(a)))
|
|
374
|
+
function map<B>(f: (a: A) => B): Computed<never, E, B> {
|
|
375
|
+
return mapEffect((a) => Effect.sync(() => f(a)))
|
|
376
|
+
}
|
|
405
377
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
>['set'] = (a) => this.update(() => a)
|
|
378
|
+
return {
|
|
379
|
+
mapEffect,
|
|
380
|
+
map,
|
|
381
|
+
} as const
|
|
382
|
+
}
|
|
412
383
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
}
|
|
418
|
-
>['delete'] = Effect.suspend(() => {
|
|
419
|
-
const current = MutableRef.get(this.current)
|
|
384
|
+
function makeTransformMethods<E, A>(
|
|
385
|
+
f: () => RefSubject<E, A>,
|
|
386
|
+
): Pick<RefSubject<E, A>, 'transformBoth' | 'transform' | 'transformGet'> {
|
|
387
|
+
const get = makeMemoizedGet(f)
|
|
420
388
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
389
|
+
function transformBoth<R3, E3, C, R4, E4, D>(
|
|
390
|
+
f: (fx: Fx<never, E, A>) => Fx<R3, E3, C>,
|
|
391
|
+
g: (effect: Effect.Effect<never, E, A>) => Effect.Effect<R4, E4, D>,
|
|
392
|
+
): RefTransform<R3, E3, C, R4, E4, D> {
|
|
393
|
+
return new RefTransformImpl(get(), f, g)
|
|
394
|
+
}
|
|
424
395
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
})
|
|
396
|
+
function transform<R3, E3, C>(
|
|
397
|
+
f: (fx: Fx<never, E, A>) => Fx<R3, E3, C>,
|
|
398
|
+
): RefTransform<R3, E3, C, never, E, A> {
|
|
399
|
+
return transformBoth(f, identity)
|
|
400
|
+
}
|
|
431
401
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
>['mapEffect'] = <R2, E2, B>(
|
|
438
|
-
f: (a: {
|
|
439
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
440
|
-
}) => Effect.Effect<R2, E2, B>,
|
|
441
|
-
) =>
|
|
442
|
-
new ComputedImpl<
|
|
443
|
-
never,
|
|
444
|
-
Fx.ErrorsOf<S[number]>,
|
|
445
|
-
{
|
|
446
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
447
|
-
},
|
|
448
|
-
R2,
|
|
449
|
-
E2,
|
|
450
|
-
B
|
|
451
|
-
>(this, f)
|
|
402
|
+
function transformGet<R3, E3, C>(
|
|
403
|
+
f: (effect: Effect.Effect<never, E, A>) => Effect.Effect<R3, E3, C>,
|
|
404
|
+
): RefTransform<never, E, A, R3, E3, C> {
|
|
405
|
+
return transformBoth(identity, f)
|
|
406
|
+
}
|
|
452
407
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
408
|
+
return {
|
|
409
|
+
transformBoth,
|
|
410
|
+
transform,
|
|
411
|
+
transformGet,
|
|
412
|
+
} as const
|
|
413
|
+
}
|
|
459
414
|
|
|
415
|
+
const placeholders = {
|
|
416
|
+
_tag: 'Commit',
|
|
417
|
+
[Effect.EffectTypeId]: refVariance,
|
|
418
|
+
i0: undefined,
|
|
419
|
+
i1: undefined,
|
|
420
|
+
i2: undefined,
|
|
460
421
|
[Equal.symbol](that: unknown) {
|
|
461
422
|
return this === that
|
|
462
|
-
}
|
|
463
|
-
|
|
423
|
+
},
|
|
464
424
|
[Hash.symbol]() {
|
|
465
425
|
return Hash.random(this)
|
|
466
|
-
}
|
|
426
|
+
},
|
|
427
|
+
pipe() {
|
|
428
|
+
// eslint-disable-next-line prefer-rest-params
|
|
429
|
+
return pipeArguments(this, arguments)
|
|
430
|
+
},
|
|
431
|
+
}
|
|
467
432
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
433
|
+
function makeEffectMethods<E, A>(
|
|
434
|
+
get: RefSubject<E, A>['get'],
|
|
435
|
+
): Pick<RefSubject<E, A>, Extract<keyof Effect.Effect<never, E, A>, keyof RefSubject<E, A>>> {
|
|
436
|
+
return Object.assign(
|
|
471
437
|
{
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
}
|
|
438
|
+
commit() {
|
|
439
|
+
return get
|
|
440
|
+
},
|
|
441
|
+
} as const,
|
|
442
|
+
placeholders,
|
|
443
|
+
) as any
|
|
444
|
+
}
|
|
480
445
|
|
|
481
|
-
|
|
482
|
-
|
|
446
|
+
function makeMemoizedGet<A>(f: () => A) {
|
|
447
|
+
let memoized: Option.Option<A> = Option.none()
|
|
483
448
|
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
{
|
|
488
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
449
|
+
return () => {
|
|
450
|
+
if (Option.isNone(memoized)) {
|
|
451
|
+
memoized = Option.some(f())
|
|
489
452
|
}
|
|
490
|
-
|
|
491
|
-
return
|
|
453
|
+
|
|
454
|
+
return (memoized as Option.Some<A>).value
|
|
492
455
|
}
|
|
493
456
|
}
|
|
494
457
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
>
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
Fx.ErrorsOf<S[number]>,
|
|
506
|
-
{
|
|
507
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
508
|
-
}
|
|
509
|
-
>
|
|
510
|
-
{
|
|
511
|
-
readonly _tag = 'Commit'
|
|
512
|
-
public trace: Trace = undefined;
|
|
513
|
-
|
|
514
|
-
readonly [Effect.EffectTypeId] = refSubjectVariant;
|
|
515
|
-
readonly [RefSubjectTypeId]: RefSubjectTypeId = RefSubjectTypeId
|
|
458
|
+
type RefSubjectContext<E, A> = {
|
|
459
|
+
initial: Effect.Effect<never, E, A>
|
|
460
|
+
currentRef: MutableRef.MutableRef<Option.Option<A>>
|
|
461
|
+
initializingFiberRef: MutableRef.MutableRef<Option.Option<Fiber.RuntimeFiber<E, A>>>
|
|
462
|
+
lock: Lock
|
|
463
|
+
scope: Scope.Scope
|
|
464
|
+
eq: Equivalence.Equivalence<A>
|
|
465
|
+
hold: HoldFx<never, E, A>
|
|
466
|
+
version: MutableRef.MutableRef<number>
|
|
467
|
+
}
|
|
516
468
|
|
|
517
|
-
|
|
518
|
-
|
|
469
|
+
function makeRefSubjectContext<E, A>(
|
|
470
|
+
initial: Effect.Effect<never, E, A>,
|
|
471
|
+
scope: Scope.Scope,
|
|
472
|
+
eq: Equivalence.Equivalence<A>,
|
|
473
|
+
) {
|
|
474
|
+
const hold = new HoldFx(never<E, A>())
|
|
475
|
+
const ctx: RefSubjectContext<E, A> = {
|
|
476
|
+
initial,
|
|
477
|
+
currentRef: hold.current,
|
|
478
|
+
initializingFiberRef: MutableRef.make(Option.none()),
|
|
479
|
+
lock: Effect.unsafeMakeSemaphore(1).withPermits(1),
|
|
480
|
+
scope,
|
|
481
|
+
eq,
|
|
482
|
+
hold,
|
|
483
|
+
version: MutableRef.make(0),
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
return ctx
|
|
487
|
+
}
|
|
519
488
|
|
|
520
|
-
|
|
489
|
+
function unsafeMakeRefPrimitive<E, A>(
|
|
490
|
+
initial: Effect.Effect<never, E, A>,
|
|
491
|
+
scope: Scope.Scope,
|
|
492
|
+
eq: Equivalence.Equivalence<A>,
|
|
493
|
+
): RefPrimitive<E, A> {
|
|
494
|
+
const ctx = makeRefSubjectContext(initial, scope, eq)
|
|
495
|
+
const get = makeGetFromContext(ctx)
|
|
496
|
+
const set = makeSetFromContext(ctx)
|
|
521
497
|
|
|
522
|
-
|
|
498
|
+
function run<R2>(sink: Sink<R2, E, A>) {
|
|
499
|
+
return Effect.suspend(() => {
|
|
500
|
+
const current = MutableRef.get(ctx.hold.current)
|
|
523
501
|
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
502
|
+
if (Option.isNone(current)) {
|
|
503
|
+
return pipe(
|
|
504
|
+
primitive.get,
|
|
505
|
+
Effect.catchAllCause(sink.error),
|
|
506
|
+
Effect.flatMap(() => ctx.hold.run(sink)),
|
|
507
|
+
)
|
|
508
|
+
}
|
|
531
509
|
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
}>
|
|
510
|
+
return ctx.hold.run(sink)
|
|
511
|
+
})
|
|
535
512
|
}
|
|
536
513
|
|
|
537
|
-
|
|
538
|
-
|
|
514
|
+
const primitive: RefPrimitive<E, A> = {
|
|
515
|
+
delete: makeDeleteFromContext(ctx),
|
|
516
|
+
end: makeEndFromContext(ctx),
|
|
517
|
+
eq,
|
|
518
|
+
error: (cause) => ctx.hold.error(cause),
|
|
519
|
+
event: set,
|
|
520
|
+
get,
|
|
521
|
+
modifyEffect: makeModifyEffectFromContext(get, ctx),
|
|
522
|
+
run,
|
|
523
|
+
set,
|
|
524
|
+
version: ctx.version,
|
|
539
525
|
}
|
|
540
526
|
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
{
|
|
544
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
545
|
-
}
|
|
546
|
-
>['get'] = Effect.suspend(
|
|
547
|
-
() =>
|
|
548
|
-
Effect.allPar(RR.map(this.i0, (s) => s.get)) as Effect.Effect<
|
|
549
|
-
never,
|
|
550
|
-
Fx.ErrorsOf<S[number]>,
|
|
551
|
-
{
|
|
552
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
553
|
-
}
|
|
554
|
-
>,
|
|
555
|
-
)
|
|
556
|
-
|
|
557
|
-
modifyEffect<R2, E2, B>(
|
|
558
|
-
f: (a: {
|
|
559
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
560
|
-
}) => Effect.Effect<R2, E2, readonly [B, { readonly [K in keyof S]: Fx.OutputOf<S[K]> }]>,
|
|
561
|
-
) {
|
|
562
|
-
const { current, i0: subjects } = this
|
|
563
|
-
|
|
564
|
-
return pipe(
|
|
565
|
-
this.get,
|
|
566
|
-
Effect.flatMap((a) =>
|
|
567
|
-
this.lock(
|
|
568
|
-
Effect.gen(function* ($) {
|
|
569
|
-
const [b, a2] = yield* $(f(a))
|
|
527
|
+
return primitive
|
|
528
|
+
}
|
|
570
529
|
|
|
571
|
-
|
|
530
|
+
function makeRefFromPrimitive<E, A>(primitive: RefPrimitive<E, A>): RefSubject<E, A> {
|
|
531
|
+
const ref: RefSubject<E, A> = {
|
|
532
|
+
[FxTypeId]: refVariance,
|
|
533
|
+
[RefSubjectTypeId]: RefSubjectTypeId,
|
|
534
|
+
[ComputedTypeId]: ComputedTypeId,
|
|
535
|
+
...primitive,
|
|
536
|
+
...makeRefMethods(primitive),
|
|
537
|
+
...makeEffectMethods(primitive.get),
|
|
538
|
+
...makeFiltered(() => ref),
|
|
539
|
+
...makeComputedMethods(() => ref),
|
|
540
|
+
...makeTransformMethods(() => ref),
|
|
541
|
+
version() {
|
|
542
|
+
return MutableRef.get(primitive.version)
|
|
543
|
+
},
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
return ref
|
|
547
|
+
}
|
|
572
548
|
|
|
573
|
-
|
|
549
|
+
// Base Ref which provides all functionality that can otherwise be derived
|
|
550
|
+
// using makeRefFromPrimitive
|
|
551
|
+
interface RefPrimitive<E, A> {
|
|
552
|
+
// Fx
|
|
553
|
+
run: RefSubject<E, A>['run']
|
|
554
|
+
|
|
555
|
+
// Subject
|
|
556
|
+
event: RefSubject<E, A>['event']
|
|
557
|
+
error: RefSubject<E, A>['error']
|
|
558
|
+
end: RefSubject<E, A>['end']
|
|
559
|
+
|
|
560
|
+
// Ref
|
|
561
|
+
eq: RefSubject<E, A>['eq']
|
|
562
|
+
get: RefSubject<E, A>['get']
|
|
563
|
+
modifyEffect: RefSubject<E, A>['modifyEffect']
|
|
564
|
+
set: RefSubject<E, A>['set']
|
|
565
|
+
delete: RefSubject<E, A>['delete']
|
|
566
|
+
|
|
567
|
+
// Primitive
|
|
568
|
+
version: MutableRef.MutableRef<number>
|
|
569
|
+
}
|
|
574
570
|
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
571
|
+
// Internals for RefSubject.tuple
|
|
572
|
+
|
|
573
|
+
function tupleRefPrimitive<const Refs extends ReadonlyArray<RefSubject.Any>>(
|
|
574
|
+
refs: Refs,
|
|
575
|
+
): RefPrimitive<Fx.ErrorsOf<Refs[number]>, { readonly [K in keyof Refs]: Fx.OutputOf<Refs[K]> }> {
|
|
576
|
+
type _E = Fx.ErrorsOf<Refs[number]>
|
|
577
|
+
type _A = { readonly [K in keyof Refs]: Fx.OutputOf<Refs[K]> }
|
|
578
|
+
|
|
579
|
+
const hold = new HoldFx(combineAll(...refs) as any as Fx<never, _E, _A>)
|
|
580
|
+
const eq = Equivalence.tuple(...refs.map((ref) => ref.eq))
|
|
581
|
+
const get = Effect.all(
|
|
582
|
+
refs.map((ref) => ref.get),
|
|
583
|
+
unboundedConcurrency,
|
|
584
|
+
) as Effect.Effect<never, _E, _A>
|
|
585
|
+
|
|
586
|
+
const primitive: RefPrimitive<_E, _A> = {
|
|
587
|
+
delete: Effect.map(
|
|
588
|
+
Effect.all(
|
|
589
|
+
refs.map((ref) => ref.delete),
|
|
590
|
+
{ concurrency: 'unbounded' },
|
|
578
591
|
),
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
607
|
-
}
|
|
608
|
-
>['set'] = (a) => this.update(() => a)
|
|
609
|
-
|
|
610
|
-
readonly delete: RefSubject<
|
|
611
|
-
Fx.ErrorsOf<S[number]>,
|
|
612
|
-
{
|
|
613
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
614
|
-
}
|
|
615
|
-
>['delete'] = Effect.suspend(() => {
|
|
616
|
-
const current = MutableRef.get(this.current)
|
|
617
|
-
|
|
618
|
-
if (Option.isSome(current)) {
|
|
619
|
-
MutableRef.set(this.current, Option.none())
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
return Effect.succeed<
|
|
623
|
-
Option.Option<{
|
|
624
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
625
|
-
}>
|
|
626
|
-
>(current)
|
|
627
|
-
})
|
|
628
|
-
|
|
629
|
-
readonly mapEffect: RefSubject<
|
|
630
|
-
Fx.ErrorsOf<S[number]>,
|
|
631
|
-
{
|
|
632
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
633
|
-
}
|
|
634
|
-
>['mapEffect'] = <R2, E2, B>(
|
|
635
|
-
f: (a: {
|
|
636
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
637
|
-
}) => Effect.Effect<R2, E2, B>,
|
|
638
|
-
) =>
|
|
639
|
-
new ComputedImpl<
|
|
640
|
-
never,
|
|
641
|
-
Fx.ErrorsOf<S[number]>,
|
|
642
|
-
{
|
|
643
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
644
|
-
},
|
|
645
|
-
R2,
|
|
646
|
-
E2,
|
|
647
|
-
B
|
|
648
|
-
>(this, f)
|
|
649
|
-
|
|
650
|
-
readonly map: RefSubject<
|
|
651
|
-
Fx.ErrorsOf<S[number]>,
|
|
652
|
-
{
|
|
653
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
654
|
-
}
|
|
655
|
-
>['map'] = (f) => this.mapEffect((a) => Effect.sync(() => f(a)));
|
|
656
|
-
|
|
657
|
-
[Equal.symbol](that: unknown) {
|
|
658
|
-
return this === that
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
[Hash.symbol]() {
|
|
662
|
-
return Hash.random(this)
|
|
663
|
-
}
|
|
592
|
+
(values) => Option.all(values),
|
|
593
|
+
) as Effect.Effect<never, _E, Option.Option<_A>>,
|
|
594
|
+
end: () =>
|
|
595
|
+
Effect.all(
|
|
596
|
+
refs.map((ref) => ref.end()),
|
|
597
|
+
unboundedConcurrency,
|
|
598
|
+
),
|
|
599
|
+
eq,
|
|
600
|
+
error: (error) => hold.error(error),
|
|
601
|
+
event: (value) =>
|
|
602
|
+
Effect.all(
|
|
603
|
+
value.map((v, i) => refs[i].event(v)),
|
|
604
|
+
unboundedConcurrency,
|
|
605
|
+
),
|
|
606
|
+
get,
|
|
607
|
+
modifyEffect: makeModifyEffectTuple(refs, get, eq),
|
|
608
|
+
run: (sink) => hold.run(sink),
|
|
609
|
+
set: (value) =>
|
|
610
|
+
Effect.all(
|
|
611
|
+
value.map((v, i) => refs[i].set(v)),
|
|
612
|
+
unboundedConcurrency,
|
|
613
|
+
) as Effect.Effect<never, never, _A>,
|
|
614
|
+
version: MutableRef.make(0),
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
return primitive
|
|
618
|
+
}
|
|
664
619
|
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
620
|
+
function makeModifyEffectTuple<
|
|
621
|
+
const Refs extends ReadonlyArray<RefSubject.Any>,
|
|
622
|
+
E,
|
|
623
|
+
A extends readonly any[],
|
|
624
|
+
>(
|
|
625
|
+
refs: Refs,
|
|
626
|
+
get: Effect.Effect<never, E, A>,
|
|
627
|
+
eq: Equivalence.Equivalence<A>,
|
|
628
|
+
): RefSubject<E, A>['modifyEffect'] {
|
|
629
|
+
return <R2, E2, B>(f: (a: A) => Effect.Effect<R2, E2, readonly [B, A]>) => {
|
|
630
|
+
return Effect.gen(function* ($) {
|
|
631
|
+
const current = yield* $(get)
|
|
632
|
+
const [b, a] = yield* $(f(current))
|
|
633
|
+
|
|
634
|
+
if (eq(a, current)) {
|
|
635
|
+
return b
|
|
636
|
+
}
|
|
677
637
|
|
|
678
|
-
|
|
679
|
-
|
|
638
|
+
yield* $(
|
|
639
|
+
Effect.all(
|
|
640
|
+
refs.map((ref, i) => ref.set(a[i])),
|
|
641
|
+
unboundedConcurrency,
|
|
642
|
+
),
|
|
643
|
+
)
|
|
680
644
|
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
Fx.ErrorsOf<S[number]>,
|
|
684
|
-
{
|
|
685
|
-
readonly [K in keyof S]: Fx.OutputOf<S[K]>
|
|
686
|
-
}
|
|
687
|
-
> {
|
|
688
|
-
return this.get.traced(this.trace)
|
|
645
|
+
return b
|
|
646
|
+
})
|
|
689
647
|
}
|
|
690
648
|
}
|
|
691
649
|
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
650
|
+
function structRefPrimitive<const Refs extends Readonly<Record<string, RefSubject.Any>>>(
|
|
651
|
+
refs: Refs,
|
|
652
|
+
): RefPrimitive<Fx.ErrorsOf<Refs[string]>, { readonly [K in keyof Refs]: Fx.OutputOf<Refs[K]> }> {
|
|
653
|
+
type _E = Fx.ErrorsOf<Refs[string]>
|
|
654
|
+
type _A = { readonly [K in keyof Refs]: Fx.OutputOf<Refs[K]> }
|
|
655
|
+
|
|
656
|
+
const hold = new HoldFx(struct(refs)) as HoldFx<never, _E, _A>
|
|
657
|
+
const eq = Equivalence.struct(mapRecord(refs, (ref) => ref.eq))
|
|
658
|
+
const get = Effect.all(
|
|
659
|
+
mapRecord(refs, (ref) => ref.get),
|
|
660
|
+
unboundedConcurrency,
|
|
661
|
+
) as Effect.Effect<never, _E, _A>
|
|
662
|
+
|
|
663
|
+
const primitive: RefPrimitive<_E, _A> = {
|
|
664
|
+
delete: Effect.map(
|
|
665
|
+
Effect.all(
|
|
666
|
+
mapRecord(refs, (ref) => ref.delete),
|
|
667
|
+
unboundedConcurrency,
|
|
668
|
+
),
|
|
669
|
+
(values) => Option.all(values),
|
|
670
|
+
) as Effect.Effect<never, _E, Option.Option<_A>>,
|
|
671
|
+
end: () =>
|
|
672
|
+
Effect.all(
|
|
673
|
+
mapRecord(refs, (ref) => ref.end()),
|
|
674
|
+
unboundedConcurrency,
|
|
675
|
+
),
|
|
676
|
+
eq,
|
|
677
|
+
error: (error) => hold.error(error),
|
|
678
|
+
event: (value) =>
|
|
679
|
+
Effect.all(
|
|
680
|
+
mapRecord(value, (v, i) => refs[i].event(v)),
|
|
681
|
+
unboundedConcurrency,
|
|
682
|
+
),
|
|
683
|
+
get,
|
|
684
|
+
modifyEffect: makeModifyEffectStruct(refs, get, eq),
|
|
685
|
+
run: (sink) => hold.run(sink),
|
|
686
|
+
set: (value) =>
|
|
687
|
+
Effect.all(
|
|
688
|
+
mapRecord(value, (v, i) => refs[i].set(v)),
|
|
689
|
+
unboundedConcurrency,
|
|
690
|
+
) as Effect.Effect<never, never, _A>,
|
|
691
|
+
version: MutableRef.make(0),
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
return primitive
|
|
695
|
+
}
|
|
701
696
|
|
|
702
|
-
|
|
703
|
-
|
|
697
|
+
function makeModifyEffectStruct<
|
|
698
|
+
const Refs extends Readonly<Record<string, RefSubject.Any>>,
|
|
699
|
+
E,
|
|
700
|
+
A extends Readonly<Record<string, any>>,
|
|
701
|
+
>(
|
|
702
|
+
refs: Refs,
|
|
703
|
+
get: Effect.Effect<never, E, A>,
|
|
704
|
+
eq: Equivalence.Equivalence<A>,
|
|
705
|
+
): RefSubject<E, A>['modifyEffect'] {
|
|
706
|
+
return <R2, E2, B>(f: (a: A) => Effect.Effect<R2, E2, readonly [B, A]>) => {
|
|
707
|
+
return Effect.gen(function* ($) {
|
|
708
|
+
const current = yield* $(get)
|
|
709
|
+
const [b, a] = yield* $(f(current))
|
|
710
|
+
|
|
711
|
+
if (eq(a, current)) {
|
|
712
|
+
return b
|
|
713
|
+
}
|
|
704
714
|
|
|
705
|
-
|
|
715
|
+
yield* $(
|
|
716
|
+
Effect.all(
|
|
717
|
+
mapRecord(refs, (ref, i) => ref.set(a[i])),
|
|
718
|
+
unboundedConcurrency,
|
|
719
|
+
),
|
|
720
|
+
)
|
|
706
721
|
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
this.i2 = multicast(switchMapEffect(this.i0, this.i1))
|
|
722
|
+
return b
|
|
723
|
+
})
|
|
710
724
|
}
|
|
725
|
+
}
|
|
711
726
|
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
727
|
+
function mapRecord<K extends string, A, B>(
|
|
728
|
+
record: Readonly<Record<K, A>>,
|
|
729
|
+
f: (a: A, k: K) => B,
|
|
730
|
+
): { readonly [_ in K]: B } {
|
|
731
|
+
const result: Record<K, B> = {} as any
|
|
715
732
|
|
|
716
|
-
|
|
717
|
-
|
|
733
|
+
for (const k in record) {
|
|
734
|
+
result[k] = f(record[k], k)
|
|
718
735
|
}
|
|
719
736
|
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
readonly mapEffect: Computed<R | R2, E | E2, B>['mapEffect'] = <R3, E3, C>(
|
|
723
|
-
f: (b: B) => Effect.Effect<R3, E3, C>,
|
|
724
|
-
): Computed<R | R2 | R3, E | E2 | E3, C> =>
|
|
725
|
-
new ComputedImpl(this.i0, (a) => Effect.flatMap(this.i1(a), f))
|
|
726
|
-
|
|
727
|
-
readonly map: Computed<R | R2, E | E2, B>['map'] = <C>(f: (b: B) => C) =>
|
|
728
|
-
this.mapEffect((a) => Effect.sync(() => f(a)));
|
|
737
|
+
return result
|
|
738
|
+
}
|
|
729
739
|
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
740
|
+
export function asRef<R, E, A>(fx: Fx<R, E, A>) {
|
|
741
|
+
return Effect.flatMap(Deferred.make<E, A>(), (deferred) =>
|
|
742
|
+
Effect.flatMap(makeRef(Deferred.await(deferred)), (ref) => {
|
|
743
|
+
const onValue = (value: A) =>
|
|
744
|
+
Effect.flatMap(Deferred.succeed(deferred, value), (closed) =>
|
|
745
|
+
closed ? Effect.unit : ref.set(value),
|
|
746
|
+
)
|
|
733
747
|
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
748
|
+
return Effect.as(
|
|
749
|
+
Effect.forkScoped(
|
|
750
|
+
Effect.catchAllCause(drain(switchMatchCauseEffect(fx, ref.error, onValue)), ref.error),
|
|
751
|
+
),
|
|
752
|
+
ref,
|
|
753
|
+
)
|
|
754
|
+
}),
|
|
755
|
+
)
|
|
737
756
|
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
traced.trace = trace
|
|
742
|
-
return traced
|
|
743
|
-
}
|
|
757
|
+
return Effect.gen(function* ($) {
|
|
758
|
+
const deferred = yield* $(Deferred.make<E, A>())
|
|
759
|
+
const ref = yield* $(makeRef(Deferred.await(deferred)))
|
|
744
760
|
|
|
745
|
-
|
|
746
|
-
|
|
761
|
+
const onValue = (value: A) =>
|
|
762
|
+
Effect.flatMap(Deferred.succeed(deferred, value), (closed) =>
|
|
763
|
+
closed ? Effect.unit : ref.set(value),
|
|
764
|
+
)
|
|
747
765
|
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
766
|
+
yield* $(
|
|
767
|
+
switchMatchCauseEffect(fx, ref.error, onValue),
|
|
768
|
+
drain,
|
|
769
|
+
Effect.catchAllCause(ref.error),
|
|
770
|
+
Effect.forkScoped,
|
|
771
|
+
)
|
|
752
772
|
|
|
753
|
-
|
|
754
|
-
|
|
773
|
+
return ref
|
|
774
|
+
})
|
|
755
775
|
}
|