import { Effect, SubscriptionRef, Stream, Fiber } from "effect"
import { NodeRuntime } from "@effect/platform-node"
const testInterruption = Effect.acquireRelease(
Effect.gen(function* () {
yield* Effect.log("[Test] Starting test...")
// Create a SubscriptionRef with a Set
const dataRef = yield* SubscriptionRef.make(new Set<string>())
// Fork a fiber that listens to changes and logs them
const listenerFiber = yield* Effect.fork(
dataRef.changes.pipe(
Stream.mapEffect(() =>
Effect.void
),
Stream.runDrain
)
)
yield* Effect.log("[Test] Listener fiber started")
return { listenerFiber }
}),
({ listenerFiber }) =>
Effect.gen(function* () {
yield* Effect.log("[Test] Starting cleanup - interrupting listener fiber...")
yield* Fiber.interrupt(listenerFiber)
yield* Effect.log("[Test] Listener fiber interrupted successfully")
})
).pipe(
Effect.map(() => void 0)
)
const program = Effect.gen(function* () {
yield* Effect.log("[Main] Starting program")
yield* testInterruption
yield* Effect.log("[Main] Program complete")
})
NodeRuntime.runMain(program.pipe(Effect.scoped))
import { Effect, SubscriptionRef, Stream, Fiber } from "effect"
import { NodeRuntime } from "@effect/platform-node"
const testInterruption = Effect.acquireRelease(
Effect.gen(function* () {
yield* Effect.log("[Test] Starting test...")
// Create a SubscriptionRef with a Set
const dataRef = yield* SubscriptionRef.make(new Set<string>())
// Fork a fiber that listens to changes and logs them
const listenerFiber = yield* Effect.fork(
dataRef.changes.pipe(
Stream.mapEffect(() =>
Effect.void
),
Stream.runDrain
)
)
yield* Effect.log("[Test] Listener fiber started")
return { listenerFiber }
}),
({ listenerFiber }) =>
Effect.gen(function* () {
yield* Effect.log("[Test] Starting cleanup - interrupting listener fiber...")
yield* Fiber.interrupt(listenerFiber)
yield* Effect.log("[Test] Listener fiber interrupted successfully")
})
).pipe(
Effect.map(() => void 0)
)
const program = Effect.gen(function* () {
yield* Effect.log("[Main] Starting program")
yield* testInterruption
yield* Effect.log("[Main] Program complete")
})
NodeRuntime.runMain(program.pipe(Effect.scoped))