98 lines
3.0 KiB
TypeScript
98 lines
3.0 KiB
TypeScript
import { assert, describe, it } from "@effect/vitest"
|
|
import * as Effect from "effect/Effect"
|
|
import * as Exit from "effect/Exit"
|
|
import * as RcRef from "effect/RcRef"
|
|
import * as Scope from "effect/Scope"
|
|
|
|
describe("RcRef", () => {
|
|
it.effect("deallocation", () =>
|
|
Effect.gen(function*() {
|
|
let acquired = 0
|
|
let released = 0
|
|
const refScope = yield* Scope.make()
|
|
const ref = yield* RcRef.make({
|
|
acquire: Effect.acquireRelease(
|
|
Effect.sync(() => {
|
|
acquired++
|
|
return "foo"
|
|
}),
|
|
() =>
|
|
Effect.sync(() => {
|
|
released++
|
|
})
|
|
)
|
|
}).pipe(
|
|
Scope.provide(refScope)
|
|
)
|
|
|
|
assert.strictEqual(acquired, 0)
|
|
assert.strictEqual(yield* Effect.scoped(RcRef.get(ref)), "foo")
|
|
assert.strictEqual(acquired, 1)
|
|
assert.strictEqual(released, 1)
|
|
|
|
const scopeA = yield* Scope.make()
|
|
const scopeB = yield* Scope.make()
|
|
yield* RcRef.get(ref).pipe(Scope.provide(scopeA))
|
|
yield* RcRef.get(ref).pipe(Scope.provide(scopeB))
|
|
assert.strictEqual(acquired, 2)
|
|
assert.strictEqual(released, 1)
|
|
yield* Scope.close(scopeB, Exit.void)
|
|
assert.strictEqual(acquired, 2)
|
|
assert.strictEqual(released, 1)
|
|
yield* Scope.close(scopeA, Exit.void)
|
|
assert.strictEqual(acquired, 2)
|
|
assert.strictEqual(released, 2)
|
|
|
|
const scopeC = yield* Scope.make()
|
|
yield* RcRef.get(ref).pipe(Scope.provide(scopeC))
|
|
assert.strictEqual(acquired, 3)
|
|
assert.strictEqual(released, 2)
|
|
|
|
yield* Scope.close(refScope, Exit.void)
|
|
assert.strictEqual(acquired, 3)
|
|
assert.strictEqual(released, 3)
|
|
|
|
const exit = yield* RcRef.get(ref).pipe(Effect.scoped, Effect.exit)
|
|
assert.isTrue(Exit.hasInterrupts(exit))
|
|
}))
|
|
|
|
// it.scoped("idleTimeToLive", () =>
|
|
// Effect.gen(function*() {
|
|
// let acquired = 0
|
|
// let released = 0
|
|
// const ref = yield* RcRef.make({
|
|
// acquire: Effect.acquireRelease(
|
|
// Effect.sync(() => {
|
|
// acquired++
|
|
// return "foo"
|
|
// }),
|
|
// () =>
|
|
// Effect.sync(() => {
|
|
// released++
|
|
// })
|
|
// ),
|
|
// idleTimeToLive: 1000
|
|
// })
|
|
//
|
|
// assert.strictEqual(acquired, 0)
|
|
// assert.strictEqual(yield* Effect.scoped(RcRef.get(ref)), "foo")
|
|
// assert.strictEqual(acquired, 1)
|
|
// assert.strictEqual(released, 0)
|
|
//
|
|
// yield* TestClock.adjust(1000)
|
|
// assert.strictEqual(released, 1)
|
|
//
|
|
// assert.strictEqual(yield* Effect.scoped(RcRef.get(ref)), "foo")
|
|
// assert.strictEqual(acquired, 2)
|
|
// assert.strictEqual(released, 1)
|
|
//
|
|
// yield* TestClock.adjust(500)
|
|
// assert.strictEqual(yield* Effect.scoped(RcRef.get(ref)), "foo")
|
|
// assert.strictEqual(acquired, 2)
|
|
// assert.strictEqual(released, 1)
|
|
//
|
|
// yield* TestClock.adjust(1000)
|
|
// assert.strictEqual(released, 2)
|
|
// }))
|
|
})
|