Skip to content

Commit 9db8b26

Browse files
fix: add Scope.Scope support to AtomRuntime.subscriptionRef and subscribable (#380)
Co-authored-by: Tim Smart <[email protected]>
1 parent 84fd4f7 commit 9db8b26

File tree

4 files changed

+49
-8
lines changed

4 files changed

+49
-8
lines changed

.changeset/clever-turkeys-walk.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@effect-atom/atom": patch
3+
---
4+
5+
add Scope support to Atom.subscriptionRef types

docs/atom/Atom.ts.md

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,18 +1024,26 @@ export interface AtomRuntime<R, ER = never> extends Atom<Result.Result<Runtime.R
10241024

10251025
readonly subscriptionRef: <A, E>(
10261026
create:
1027-
| Effect.Effect<SubscriptionRef.SubscriptionRef<A>, E, R | AtomRegistry | Reactivity.Reactivity>
1027+
| Effect.Effect<SubscriptionRef.SubscriptionRef<A>, E, Scope.Scope | R | AtomRegistry | Reactivity.Reactivity>
10281028
| ((
10291029
get: Context
1030-
) => Effect.Effect<SubscriptionRef.SubscriptionRef<A>, E, R | AtomRegistry | Reactivity.Reactivity>)
1030+
) => Effect.Effect<
1031+
SubscriptionRef.SubscriptionRef<A>,
1032+
E,
1033+
Scope.Scope | R | AtomRegistry | Reactivity.Reactivity
1034+
>)
10311035
) => Writable<Result.Result<A, E>, A>
10321036

10331037
readonly subscribable: <A, E, E1 = never>(
10341038
create:
1035-
| Effect.Effect<Subscribable.Subscribable<A, E, R>, E1, R | AtomRegistry | Reactivity.Reactivity>
1039+
| Effect.Effect<Subscribable.Subscribable<A, E, R>, E1, Scope.Scope | R | AtomRegistry | Reactivity.Reactivity>
10361040
| ((
10371041
get: Context
1038-
) => Effect.Effect<Subscribable.Subscribable<A, E, R>, E1, R | AtomRegistry | Reactivity.Reactivity>)
1042+
) => Effect.Effect<
1043+
Subscribable.Subscribable<A, E, R>,
1044+
E1,
1045+
Scope.Scope | R | AtomRegistry | Reactivity.Reactivity
1046+
>)
10391047
) => Atom<Result.Result<A, E | E1>>
10401048
}
10411049
```

packages/atom/src/Atom.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -622,18 +622,22 @@ export interface AtomRuntime<R, ER = never> extends Atom<Result.Result<Runtime.R
622622

623623
readonly subscriptionRef: <A, E>(
624624
create:
625-
| Effect.Effect<SubscriptionRef.SubscriptionRef<A>, E, R | AtomRegistry | Reactivity.Reactivity>
625+
| Effect.Effect<SubscriptionRef.SubscriptionRef<A>, E, Scope.Scope | R | AtomRegistry | Reactivity.Reactivity>
626626
| ((
627627
get: Context
628-
) => Effect.Effect<SubscriptionRef.SubscriptionRef<A>, E, R | AtomRegistry | Reactivity.Reactivity>)
628+
) => Effect.Effect<SubscriptionRef.SubscriptionRef<A>, E, Scope.Scope | R | AtomRegistry | Reactivity.Reactivity>)
629629
) => Writable<Result.Result<A, E>, A>
630630

631631
readonly subscribable: <A, E, E1 = never>(
632632
create:
633-
| Effect.Effect<Subscribable.Subscribable<A, E, R>, E1, R | AtomRegistry | Reactivity.Reactivity>
633+
| Effect.Effect<Subscribable.Subscribable<A, E, R>, E1, Scope.Scope | R | AtomRegistry | Reactivity.Reactivity>
634634
| ((
635635
get: Context
636-
) => Effect.Effect<Subscribable.Subscribable<A, E, R>, E1, R | AtomRegistry | Reactivity.Reactivity>)
636+
) => Effect.Effect<
637+
Subscribable.Subscribable<A, E, R>,
638+
E1,
639+
Scope.Scope | R | AtomRegistry | Reactivity.Reactivity
640+
>)
637641
) => Atom<Result.Result<A, E | E1>>
638642
}
639643

packages/atom/test/Atom.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,30 @@ describe("Atom", () => {
979979
unmount()
980980
})
981981

982+
it("SubscriptionRef/runtime/scoped", async () => {
983+
let finalized = false
984+
const atom = counterRuntime.subscriptionRef(
985+
Effect.gen(function*() {
986+
yield* Effect.addFinalizer(() =>
987+
Effect.sync(() => {
988+
finalized = true
989+
})
990+
)
991+
return yield* SubscriptionRef.make(0)
992+
})
993+
)
994+
const r = Registry.make()
995+
const unmount = r.mount(atom)
996+
assert.deepStrictEqual(r.get(atom), Result.success(0, { waiting: true }))
997+
r.set(atom, 1)
998+
await new Promise((resolve) => resolve(null))
999+
assert.deepStrictEqual(r.get(atom), Result.success(1, { waiting: true }))
1000+
assert.strictEqual(finalized, false)
1001+
unmount()
1002+
await new Promise((resolve) => resolve(null))
1003+
assert.strictEqual(finalized, true)
1004+
})
1005+
9821006
it("setLazy(true)", async () => {
9831007
const count = Atom.make(0).pipe(Atom.keepAlive)
9841008
let rebuilds = 0

0 commit comments

Comments
 (0)