@typed/fx 1.13.0 → 1.14.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/Filtered.ts
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { pipe } from '@effect/data/Function'
|
|
2
|
+
import * as Option from '@effect/data/Option'
|
|
3
|
+
import * as Cause from '@effect/io/Cause'
|
|
4
|
+
import * as Effect from '@effect/io/Effect'
|
|
5
|
+
|
|
6
|
+
import { RefTransform, RefTransformImpl, RefTransformInput } from './RefTransform.js'
|
|
7
|
+
import { compact } from './filterMap.js'
|
|
8
|
+
import { switchMapEffect } from './switchMap.js'
|
|
9
|
+
|
|
10
|
+
export const FilteredTypeId = Symbol.for('@typed/fx/Filtered')
|
|
11
|
+
export type FilteredTypeId = typeof FilteredTypeId
|
|
12
|
+
|
|
13
|
+
export interface Filtered<R, E, A>
|
|
14
|
+
extends RefTransform<R, E, A, R, E | Cause.NoSuchElementException, A> {
|
|
15
|
+
readonly [FilteredTypeId]: FilteredTypeId
|
|
16
|
+
|
|
17
|
+
filterMapEffect<R2, E2, B>(
|
|
18
|
+
f: (a: A) => Effect.Effect<R2, E2, Option.Option<B>>,
|
|
19
|
+
): Filtered<R | R2, E | E2, B>
|
|
20
|
+
|
|
21
|
+
filterMap<R2, E2, B>(f: (a: A) => Option.Option<B>): Filtered<R | R2, E | E2, B>
|
|
22
|
+
|
|
23
|
+
filter<R2, E2>(f: (a: A) => boolean): Filtered<R | R2, E | E2, A>
|
|
24
|
+
|
|
25
|
+
filterEffect<R2, E2>(f: (a: A) => Effect.Effect<R2, E2, boolean>): Filtered<R | R2, E | E2, A>
|
|
26
|
+
|
|
27
|
+
filterNot<R2, E2>(f: (a: A) => boolean): Filtered<R | R2, E | E2, A>
|
|
28
|
+
|
|
29
|
+
filterNotEffect<R2, E2>(f: (a: A) => Effect.Effect<R2, E2, boolean>): Filtered<R | R2, E | E2, A>
|
|
30
|
+
|
|
31
|
+
mapEffect<R2, E2, B>(f: (a: A) => Effect.Effect<R2, E2, B>): Filtered<R | R2, E | E2, B>
|
|
32
|
+
|
|
33
|
+
map<B>(f: (a: A) => B): Filtered<R, E, B>
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @internal
|
|
37
|
+
*/
|
|
38
|
+
version(): number
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export class FilteredImpl<R, E, A, R2, E2, R3, E3, C>
|
|
42
|
+
extends RefTransformImpl<
|
|
43
|
+
R,
|
|
44
|
+
E,
|
|
45
|
+
A,
|
|
46
|
+
R2,
|
|
47
|
+
E2,
|
|
48
|
+
A,
|
|
49
|
+
R | R2 | R3,
|
|
50
|
+
E | E2 | E3,
|
|
51
|
+
C,
|
|
52
|
+
R | R2 | R3,
|
|
53
|
+
E | E2 | E3 | Cause.NoSuchElementException,
|
|
54
|
+
C
|
|
55
|
+
>
|
|
56
|
+
implements Filtered<R | R2 | R3, E | E2 | E3, C>
|
|
57
|
+
{
|
|
58
|
+
readonly [FilteredTypeId]: FilteredTypeId = FilteredTypeId
|
|
59
|
+
|
|
60
|
+
constructor(
|
|
61
|
+
input: RefTransformInput<R, E, A, R2, E2, A>,
|
|
62
|
+
f: (a: A) => Effect.Effect<R3, E3, Option.Option<C>>,
|
|
63
|
+
) {
|
|
64
|
+
super(
|
|
65
|
+
input,
|
|
66
|
+
(fx) => compact(switchMapEffect(fx, f)),
|
|
67
|
+
(eff) => Effect.flatten(Effect.flatMap(eff, f)),
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
filterMapEffect<R4, E4, D>(
|
|
72
|
+
f: (a: C) => Effect.Effect<R4, E4, Option.Option<D>>,
|
|
73
|
+
): Filtered<R | R2 | R3 | R4, E | E2 | E3 | E4, D> {
|
|
74
|
+
return new FilteredImpl(this, f) as Filtered<R | R2 | R3 | R4, E | E2 | E3 | E4, D>
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
filterMap<D>(f: (a: C) => Option.Option<D>) {
|
|
78
|
+
return this.filterMapEffect((a) => Effect.sync(() => f(a)))
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
filterEffect<R4, E4>(
|
|
82
|
+
f: (a: C) => Effect.Effect<R4, E4, boolean>,
|
|
83
|
+
): Filtered<R | R2 | R3 | R4, E | E2 | E3 | E4, C> {
|
|
84
|
+
return this.filterMapEffect((a) =>
|
|
85
|
+
Effect.map(f(a), (b) => (b ? Option.some<C>(a) : Option.none<C>())),
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
filter(f: (a: C) => boolean) {
|
|
90
|
+
return this.filterEffect((a) => Effect.sync(() => f(a)))
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
filterNotEffect<R4, E4>(
|
|
94
|
+
f: (a: C) => Effect.Effect<R4, E4, boolean>,
|
|
95
|
+
): Filtered<R | R2 | R3 | R4, E | E2 | E3 | E4, C> {
|
|
96
|
+
return this.filterEffect((a) => Effect.map(f(a), (b) => !b))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
filterNot(f: (a: C) => boolean) {
|
|
100
|
+
return this.filterNotEffect((a) => Effect.sync(() => f(a)))
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
mapEffect<R4, E4, D>(
|
|
104
|
+
f: (a: C) => Effect.Effect<R4, E4, D>,
|
|
105
|
+
): Filtered<R | R2 | R3 | R4, E | E2 | E3 | E4, D> {
|
|
106
|
+
return this.filterMapEffect((a) => pipe(a, f, Effect.map(Option.some)))
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
map<D>(f: (a: C) => D) {
|
|
110
|
+
return this.mapEffect((a) => Effect.sync(() => f(a)))
|
|
111
|
+
}
|
|
112
|
+
}
|
package/src/Fx.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import type { Trace } from '@effect/data/Debug'
|
|
2
|
-
import { methodWithTrace } from '@effect/data/Debug'
|
|
3
1
|
import { identity } from '@effect/data/Function'
|
|
4
2
|
import type { Cause } from '@effect/io/Cause'
|
|
5
3
|
import type { Effect } from '@effect/io/Effect'
|
|
@@ -16,28 +14,24 @@ export interface Fx<out R, out E, out A> {
|
|
|
16
14
|
}
|
|
17
15
|
|
|
18
16
|
readonly run: <R2>(sink: Sink<R2, E, A>) => Effect<R | R2, never, void>
|
|
17
|
+
}
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
const fxVariance = {
|
|
20
|
+
_R: identity,
|
|
21
|
+
_E: identity,
|
|
22
|
+
_A: identity,
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
export const make: <R, E, A>(
|
|
24
26
|
run: <R2>(sink: Sink<R2, E, A>) => Effect<R | R2, never, void>,
|
|
25
|
-
) => Fx<R, E, A> =
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
_R: identity,
|
|
31
|
-
_E: identity,
|
|
32
|
-
_A: identity,
|
|
33
|
-
},
|
|
34
|
-
run: methodWithTrace((inner) => (sink) => run(sink).traced(inner).traced(trace)),
|
|
35
|
-
addTrace: (inner) => Traced(Traced(fx, inner), trace),
|
|
36
|
-
}
|
|
27
|
+
) => Fx<R, E, A> = function Fx<R, E, A>(run: Fx<R, E, A>['run']): Fx<R, E, A> {
|
|
28
|
+
const fx: Fx<R, E, A> = {
|
|
29
|
+
[FxTypeId]: fxVariance,
|
|
30
|
+
run,
|
|
31
|
+
}
|
|
37
32
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
)
|
|
33
|
+
return fx
|
|
34
|
+
}
|
|
41
35
|
|
|
42
36
|
export function Fx<R, E, A>(
|
|
43
37
|
run: <R2>(sink: Sink<R2, E, A>) => Effect<R | R2, never, void>,
|
|
@@ -45,29 +39,10 @@ export function Fx<R, E, A>(
|
|
|
45
39
|
return make(run)
|
|
46
40
|
}
|
|
47
41
|
|
|
48
|
-
export function Traced<R, E, A>(fx: Fx<R, E, A>, trace: Trace): Fx<R, E, A> {
|
|
49
|
-
const traced: Fx<R, E, A> = {
|
|
50
|
-
[FxTypeId]: {
|
|
51
|
-
_R: identity,
|
|
52
|
-
_E: identity,
|
|
53
|
-
_A: identity,
|
|
54
|
-
},
|
|
55
|
-
run: (sink) =>
|
|
56
|
-
fx
|
|
57
|
-
.run(
|
|
58
|
-
Sink(
|
|
59
|
-
(a: A) => sink.event(a).traced(trace),
|
|
60
|
-
(cause: Cause<E>) => sink.error(cause).traced(trace),
|
|
61
|
-
),
|
|
62
|
-
)
|
|
63
|
-
.traced(trace),
|
|
64
|
-
addTrace: (trace) => Traced(traced, trace),
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return traced
|
|
68
|
-
}
|
|
69
|
-
|
|
70
42
|
export namespace Fx {
|
|
43
|
+
export type Any = Fx<any, any, any>
|
|
44
|
+
export type TupleAny = ReadonlyArray<Any>
|
|
45
|
+
|
|
71
46
|
export type Cancel = Runtime.Cancel<never, void>
|
|
72
47
|
|
|
73
48
|
export type ResourcesOf<T> = [T] extends [never]
|
|
@@ -99,8 +74,8 @@ export function Sink<A, R, E, R2>(
|
|
|
99
74
|
error: (e: Cause<E>) => Effect<R2, never, void>,
|
|
100
75
|
): Sink<R | R2, E, A> {
|
|
101
76
|
return {
|
|
102
|
-
event
|
|
103
|
-
error
|
|
77
|
+
event,
|
|
78
|
+
error,
|
|
104
79
|
}
|
|
105
80
|
}
|
|
106
81
|
|
package/src/RefArray.ts
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { pipe } from '@effect/data/Function'
|
|
2
|
+
import * as Option from '@effect/data/Option'
|
|
3
|
+
import * as Order from '@effect/data/Order'
|
|
4
|
+
import * as ReadonlyArray from '@effect/data/ReadonlyArray'
|
|
5
|
+
import * as Equivalence from '@effect/data/Equivalence'
|
|
6
|
+
import * as Effect from '@effect/io/Effect'
|
|
7
|
+
import * as Scope from '@effect/io/Scope'
|
|
8
|
+
import fastDeepEqual from 'fast-deep-equal/es6'
|
|
9
|
+
|
|
10
|
+
import { Computed } from './Computed.js'
|
|
11
|
+
import { RefSubject, makeRef } from './RefSubject.js'
|
|
12
|
+
|
|
13
|
+
export interface RefArray<E, A> extends RefSubject<E, readonly A[]> {
|
|
14
|
+
/**
|
|
15
|
+
* Append values to the end of the array contained within the RefSubject
|
|
16
|
+
*/
|
|
17
|
+
readonly append: (...as: readonly A[]) => Effect.Effect<never, E, readonly A[]>
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Returns true if the array contains the given value.
|
|
21
|
+
*/
|
|
22
|
+
readonly contains: (a: A) => Effect.Effect<never, E, boolean>
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Drops the first `n` values from the array contained within the RefSubject
|
|
26
|
+
*/
|
|
27
|
+
readonly drop: (n: number) => Effect.Effect<never, E, readonly A[]>
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Drops the last `n` values from the array contained within the RefSubject
|
|
31
|
+
*/
|
|
32
|
+
readonly dropRight: (n: number) => Effect.Effect<never, E, readonly A[]>
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Drops values from the array contained within the RefSubject as long as the predicate returns true
|
|
36
|
+
*/
|
|
37
|
+
readonly dropWhile: (predicate: (a: A) => boolean) => Effect.Effect<never, E, readonly A[]>
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Filter the values contained within the RefSubject.
|
|
41
|
+
*/
|
|
42
|
+
readonly filterValues: (
|
|
43
|
+
predicate: (a: A, index: number) => boolean,
|
|
44
|
+
) => Effect.Effect<never, E, readonly A[]>
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Retrieve the value at a given index from the array contained within the RefSubject.
|
|
48
|
+
*/
|
|
49
|
+
readonly getIndex: (index: number) => Effect.Effect<never, E, Option.Option<A>>
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Creates a computed value which will group the values contained within the RefSubject by the given function.
|
|
53
|
+
*/
|
|
54
|
+
readonly groupBy: (f: (a: A) => string) => Computed<never, E, Record<string, readonly A[]>>
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Insert a value at the given index into the array contained within the RefSubject.
|
|
58
|
+
*/
|
|
59
|
+
readonly insertAt: (index: number, a: A) => Effect.Effect<never, E, readonly A[]>
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* A Computed value which will be true if the array contained within the RefSubject is empty.
|
|
63
|
+
*/
|
|
64
|
+
readonly isEmpty: Computed<never, E, boolean>
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* A Computed value which will be true if the array contained within the RefSubject is not empty.
|
|
68
|
+
*/
|
|
69
|
+
readonly isNonEmpty: Computed<never, E, boolean>
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* A Computed value which will be true if the array contained within the RefSubject is not empty.
|
|
73
|
+
*/
|
|
74
|
+
readonly length: Computed<never, E, number>
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Map the values of the array contained within the RefSubject into a Computed value which will
|
|
78
|
+
* always be kept up-to-date.
|
|
79
|
+
*/
|
|
80
|
+
readonly mapValues: <B>(f: (a: A, index: number) => B) => Computed<never, E, readonly B[]>
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Modify the value at a given index in the array contained within the RefSubject.
|
|
84
|
+
*/
|
|
85
|
+
readonly modifyAt: (index: number, f: (a: A) => A) => Effect.Effect<never, E, readonly A[]>
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Split the array contained within the RefSubject into two arrays, one which contains the values
|
|
89
|
+
* which satisfy the predicate and one which contains the values which do not.
|
|
90
|
+
*/
|
|
91
|
+
readonly partition: (
|
|
92
|
+
predicate: (a: A, index: number) => boolean,
|
|
93
|
+
) => Computed<never, E, readonly [readonly A[], readonly A[]]>
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Prepend values to the beginning of the array contained within the RefSubject
|
|
97
|
+
*/
|
|
98
|
+
readonly prepend: (...as: readonly A[]) => Effect.Effect<never, E, readonly A[]>
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Reduce the values contained within the RefSubject into a single value returning a Computed
|
|
102
|
+
* which will always be kept up-to-date.
|
|
103
|
+
*/
|
|
104
|
+
readonly reduce: <B>(b: B, f: (b: B, a: A, index: number) => B) => Computed<never, E, B>
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Reduce the values, from last index to first, contained within the RefSubject into a single value returning a Computed
|
|
108
|
+
* which will always be kept up-to-date.
|
|
109
|
+
*/
|
|
110
|
+
readonly reduceRight: <B>(b: B, f: (b: B, a: A, index: number) => B) => Computed<never, E, B>
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Replace the value at a given index in the array contained within the RefSubject.
|
|
114
|
+
*/
|
|
115
|
+
readonly replaceAt: (index: number, a: A) => Effect.Effect<never, E, readonly A[]>
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Rotate the values in the array contained within the RefSubject by the given number of places.
|
|
119
|
+
* Very helpful for carousel-like functionality.
|
|
120
|
+
*/
|
|
121
|
+
readonly rotate: (n: number) => Effect.Effect<never, E, readonly A[]>
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Sort the values in the array contained within the RefSubject by the given ordering.
|
|
125
|
+
*/
|
|
126
|
+
readonly sortBy: (...orders: Order.Order<A>[]) => Effect.Effect<never, E, readonly A[]>
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Take the first `n` values from the array contained within the RefSubject
|
|
130
|
+
*/
|
|
131
|
+
readonly take: (n: number) => Effect.Effect<never, E, readonly A[]>
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Take the last `n` values from the array contained within the RefSubject
|
|
135
|
+
*/
|
|
136
|
+
readonly takeRight: (n: number) => Effect.Effect<never, E, readonly A[]>
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Take values from the array contained within the RefSubject as long as the predicate returns true
|
|
140
|
+
*/
|
|
141
|
+
readonly takeWhile: (predicate: (a: A) => boolean) => Effect.Effect<never, E, readonly A[]>
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Removes any duplicates held within the array contained within the RefSubject.
|
|
145
|
+
*/
|
|
146
|
+
readonly dedupe: Effect.Effect<never, E, readonly A[]>
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function makeRefArray<R, E, A>(
|
|
150
|
+
initial: Effect.Effect<R, E, readonly A[]>,
|
|
151
|
+
eq: Equivalence.Equivalence<A> = fastDeepEqual,
|
|
152
|
+
): Effect.Effect<R | Scope.Scope, never, RefArray<E, A>> {
|
|
153
|
+
return Effect.gen(function* ($) {
|
|
154
|
+
const arrayEq = Equivalence.array(eq)
|
|
155
|
+
const ref = yield* $(makeRef(initial, arrayEq))
|
|
156
|
+
const isEmpty = ref.map(ReadonlyArray.isEmptyReadonlyArray)
|
|
157
|
+
const isNonEmpty = ref.map(ReadonlyArray.isNonEmptyReadonlyArray)
|
|
158
|
+
const length = ref.map(ReadonlyArray.length)
|
|
159
|
+
const getIndex = (index: number) => ref.map(ReadonlyArray.get(index))
|
|
160
|
+
const prepend = (...as: readonly A[]) => ref.update(ReadonlyArray.prependAll(as))
|
|
161
|
+
const append = (...as: readonly A[]) => ref.update(ReadonlyArray.appendAll(as))
|
|
162
|
+
const insertAt = (index: number, a: A) =>
|
|
163
|
+
ref.update((as) =>
|
|
164
|
+
pipe(
|
|
165
|
+
as,
|
|
166
|
+
ReadonlyArray.insertAt(index, a),
|
|
167
|
+
Option.getOrElse(() => as),
|
|
168
|
+
),
|
|
169
|
+
)
|
|
170
|
+
const replaceAt = (index: number, a: A) =>
|
|
171
|
+
ref.update((as) => pipe(as, ReadonlyArray.replace(index, a)))
|
|
172
|
+
const modifyAt = (index: number, f: (a: A) => A) => ref.update(ReadonlyArray.modify(index, f))
|
|
173
|
+
const take = (n: number) => ref.update(ReadonlyArray.take(n))
|
|
174
|
+
const takeRight = (n: number) => ref.update(ReadonlyArray.takeRight(n))
|
|
175
|
+
const drop = (n: number) => ref.update(ReadonlyArray.drop(n))
|
|
176
|
+
const dropRight = (n: number) => ref.update(ReadonlyArray.dropRight(n))
|
|
177
|
+
const takeWhile = (predicate: (a: A) => boolean) =>
|
|
178
|
+
ref.update(ReadonlyArray.takeWhile(predicate))
|
|
179
|
+
const dropWhile = (predicate: (a: A) => boolean) =>
|
|
180
|
+
ref.update(ReadonlyArray.dropWhile(predicate))
|
|
181
|
+
const sortBy = (...orders: Order.Order<A>[]) => ref.update(ReadonlyArray.sortBy<A>(...orders))
|
|
182
|
+
const rotate = (n: number) => ref.update(ReadonlyArray.rotate(n))
|
|
183
|
+
const contains_ = ReadonlyArray.containsWith(eq)
|
|
184
|
+
const contains = (a: A) => ref.map<boolean>(contains_(a))
|
|
185
|
+
const dedupe = ref.update(ReadonlyArray.dedupeWith(eq))
|
|
186
|
+
const groupBy = (f: (a: A) => string) => ref.map(ReadonlyArray.groupBy(f))
|
|
187
|
+
const filterValues = (predicate: (a: A, index: number) => boolean) =>
|
|
188
|
+
ref.update(ReadonlyArray.filter(predicate))
|
|
189
|
+
const partition = (predicate: (a: A, index: number) => boolean) =>
|
|
190
|
+
ref.map(ReadonlyArray.partition(predicate))
|
|
191
|
+
|
|
192
|
+
const mapValues = <B>(f: (a: A, index: number) => B) => ref.map(ReadonlyArray.map(f))
|
|
193
|
+
const reduce = <B>(b: B, f: (b: B, a: A, index: number) => B) =>
|
|
194
|
+
ref.map(ReadonlyArray.reduce(b, f))
|
|
195
|
+
const reduceRight = <B>(b: B, f: (b: B, a: A, index: number) => B) =>
|
|
196
|
+
ref.map(ReadonlyArray.reduceRight(b, f))
|
|
197
|
+
|
|
198
|
+
return Object.assign(ref, {
|
|
199
|
+
append,
|
|
200
|
+
contains,
|
|
201
|
+
drop,
|
|
202
|
+
dropRight,
|
|
203
|
+
dropWhile,
|
|
204
|
+
filterValues,
|
|
205
|
+
getIndex,
|
|
206
|
+
groupBy,
|
|
207
|
+
insertAt,
|
|
208
|
+
isEmpty,
|
|
209
|
+
isNonEmpty,
|
|
210
|
+
length,
|
|
211
|
+
mapValues,
|
|
212
|
+
modifyAt,
|
|
213
|
+
partition,
|
|
214
|
+
prepend,
|
|
215
|
+
reduce,
|
|
216
|
+
reduceRight,
|
|
217
|
+
replaceAt,
|
|
218
|
+
rotate,
|
|
219
|
+
sortBy,
|
|
220
|
+
take,
|
|
221
|
+
takeRight,
|
|
222
|
+
takeWhile,
|
|
223
|
+
dedupe,
|
|
224
|
+
})
|
|
225
|
+
})
|
|
226
|
+
}
|
package/src/RefSubject.test.ts
CHANGED
|
@@ -20,7 +20,7 @@ describe('RefSubject', () => {
|
|
|
20
20
|
deepStrictEqual(value, 1)
|
|
21
21
|
})
|
|
22
22
|
|
|
23
|
-
await Effect.runPromise(test)
|
|
23
|
+
await Effect.runPromise(Effect.scoped(test))
|
|
24
24
|
})
|
|
25
25
|
})
|
|
26
26
|
|
|
@@ -33,7 +33,7 @@ describe('RefSubject', () => {
|
|
|
33
33
|
deepStrictEqual(yield* $(ref.get), 2)
|
|
34
34
|
})
|
|
35
35
|
|
|
36
|
-
await Effect.runPromise(test)
|
|
36
|
+
await Effect.runPromise(Effect.scoped(test))
|
|
37
37
|
})
|
|
38
38
|
})
|
|
39
39
|
|
|
@@ -46,7 +46,7 @@ describe('RefSubject', () => {
|
|
|
46
46
|
deepStrictEqual(yield* $(ref.get), 2)
|
|
47
47
|
})
|
|
48
48
|
|
|
49
|
-
await Effect.runPromise(test)
|
|
49
|
+
await Effect.runPromise(Effect.scoped(test))
|
|
50
50
|
})
|
|
51
51
|
})
|
|
52
52
|
|
|
@@ -59,7 +59,7 @@ describe('RefSubject', () => {
|
|
|
59
59
|
deepStrictEqual(yield* $(ref.get), 2)
|
|
60
60
|
})
|
|
61
61
|
|
|
62
|
-
await Effect.runPromise(test)
|
|
62
|
+
await Effect.runPromise(Effect.scoped(test))
|
|
63
63
|
})
|
|
64
64
|
})
|
|
65
65
|
|
|
@@ -78,7 +78,7 @@ describe('RefSubject', () => {
|
|
|
78
78
|
deepStrictEqual(yield* $(ref.delete), Option.some(1))
|
|
79
79
|
})
|
|
80
80
|
|
|
81
|
-
await Effect.runPromise(test)
|
|
81
|
+
await Effect.runPromise(Effect.scoped(test))
|
|
82
82
|
})
|
|
83
83
|
})
|
|
84
84
|
|
|
@@ -146,6 +146,67 @@ describe('RefSubject', () => {
|
|
|
146
146
|
|
|
147
147
|
await Effect.runPromise(test)
|
|
148
148
|
})
|
|
149
|
+
|
|
150
|
+
it('does not recompute value when underlying ref has not changed', async () => {
|
|
151
|
+
const test = Effect.scoped(
|
|
152
|
+
Effect.gen(function* ($) {
|
|
153
|
+
let calls = 0
|
|
154
|
+
const ref = yield* $(makeRef(Effect.succeed(1)))
|
|
155
|
+
const addOne = ref.map((x) => {
|
|
156
|
+
calls++
|
|
157
|
+
return x + 1
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
deepStrictEqual(yield* $(addOne), 2)
|
|
161
|
+
deepStrictEqual(yield* $(addOne), 2)
|
|
162
|
+
deepStrictEqual(yield* $(addOne), 2)
|
|
163
|
+
deepStrictEqual(calls, 1)
|
|
164
|
+
|
|
165
|
+
yield* $(ref.update((x) => x + 1))
|
|
166
|
+
|
|
167
|
+
deepStrictEqual(yield* $(addOne), 3)
|
|
168
|
+
deepStrictEqual(yield* $(addOne), 3)
|
|
169
|
+
deepStrictEqual(yield* $(addOne), 3)
|
|
170
|
+
deepStrictEqual(calls, 2)
|
|
171
|
+
}),
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
await Effect.runPromise(test)
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
it('does not recompute value when underlying ref has not changed with multiple layers', async () => {
|
|
178
|
+
const test = Effect.scoped(
|
|
179
|
+
Effect.gen(function* ($) {
|
|
180
|
+
let addOneCalls = 0
|
|
181
|
+
let multiplyTwoCalls = 0
|
|
182
|
+
const ref = yield* $(makeRef(Effect.succeed(1)))
|
|
183
|
+
const addOne = ref.map((x) => {
|
|
184
|
+
addOneCalls++
|
|
185
|
+
return x + 1
|
|
186
|
+
})
|
|
187
|
+
const multiplyTwo = addOne.map((a) => {
|
|
188
|
+
multiplyTwoCalls++
|
|
189
|
+
return a * 2
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
deepStrictEqual(yield* $(multiplyTwo), 4)
|
|
193
|
+
deepStrictEqual(yield* $(multiplyTwo), 4)
|
|
194
|
+
deepStrictEqual(yield* $(multiplyTwo), 4)
|
|
195
|
+
deepStrictEqual(addOneCalls, 1)
|
|
196
|
+
deepStrictEqual(multiplyTwoCalls, 1)
|
|
197
|
+
|
|
198
|
+
yield* $(ref.update((x) => x + 1))
|
|
199
|
+
|
|
200
|
+
deepStrictEqual(yield* $(multiplyTwo), 6)
|
|
201
|
+
deepStrictEqual(yield* $(multiplyTwo), 6)
|
|
202
|
+
deepStrictEqual(yield* $(multiplyTwo), 6)
|
|
203
|
+
deepStrictEqual(addOneCalls, 2)
|
|
204
|
+
deepStrictEqual(multiplyTwoCalls, 2)
|
|
205
|
+
}),
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
await Effect.runPromise(test)
|
|
209
|
+
})
|
|
149
210
|
})
|
|
150
211
|
})
|
|
151
212
|
|
|
@@ -350,7 +411,7 @@ describe('RefSubject', () => {
|
|
|
350
411
|
deepStrictEqual(yield* $(c.get), 4)
|
|
351
412
|
})
|
|
352
413
|
|
|
353
|
-
await Effect.runPromise(test)
|
|
414
|
+
await Effect.runPromise(Effect.scoped(test))
|
|
354
415
|
})
|
|
355
416
|
})
|
|
356
417
|
})
|