1import { assert, describe, it } from "@effect/vitest"
2import * as Duration from "effect/Duration"
3import * as Effect from "effect/Effect"
4import { identity, pipe } from "effect/Function"
5import * as Ref from "effect/Ref"
6import * as Resource from "effect/Resource"
7import * as Schedule from "effect/Schedule"
8import * as TestClock from "effect/testing/TestClock"
9
10describe("Resource", () => {
11 it.effect("isResource", () =>
12 Effect.gen(function*() {
13 const resource = yield* Resource.manual(Effect.succeed(0))
14 assert.isTrue(Resource.isResource(resource))
15 assert.isFalse(Resource.isResource(new Set([0])))
16 }))
17
18 it.effect("manual refresh updates the cached value", () =>
19 Effect.gen(function*() {
20 const ref = yield* Ref.make(0)
21 const resource = yield* Resource.manual(Ref.get(ref))
22 const result1 = yield* Resource.get(resource)
23 const result2 = yield* pipe(
24 Ref.set(ref, 1),
25 Effect.andThen(Resource.refresh(resource)),
26 Effect.andThen(Resource.get(resource))
27 )
28 assert.strictEqual(result1, 0)
29 assert.strictEqual(result2, 1)
30 }))
31
32 it.effect("manual refresh releases the previous scoped acquisition", () =>
33 Effect.gen(function*() {
34 const ref = yield* Ref.make(0)
35 const resource = yield* Resource.auto(Ref.get(ref), Schedule.spaced(Duration.millis(4)))
36 const result1 = yield* Resource.get(resource)
37 const result2 = yield* pipe(
38 Ref.set(ref, 1),
39 Effect.andThen(TestClock.adjust(Duration.millis(5))),
40 Effect.andThen(Resource.get(resource))
41 )
42 assert.strictEqual(result1, 0)
43 assert.strictEqual(result2, 1)
44 }))
45
46 it.effect("failed refresh doesn't affect cached value", () =>
47 Effect.gen(function*() {
48 const ref = yield* Ref.make<Effect.Effect<number, string>>(Effect.succeed(0))
49 const resource = yield* Resource.auto(Effect.flatMap(Ref.get(ref), identity), Schedule.spaced(Duration.millis(4)))
50 const result1 = yield* Resource.get(resource)
51 const result2 = yield* pipe(
52 Ref.set(ref, Effect.fail("Uh oh!")),
53 Effect.andThen(TestClock.adjust(Duration.millis(5))),
54 Effect.andThen(Resource.get(resource))
55 )
56 assert.strictEqual(result1, 0)
57 assert.strictEqual(result2, 0)
58 }))
59})