// long-running process here
const doStuff = (input: string) => Promise.resolve()
export const think = (input: string) =>
Effect.gen(function* () {
const fiberRef = yield* FiberSingleton
const maybeFiber = yield* fiberRef.get
if (Option.isSome(maybeFiber)) {
yield* Fiber.interrupt(maybeFiber.value)
}
const fiber: Fiber.Fiber<void, UnknownException> = yield* Effect.fork(
Effect.tryPromise(() => doStuff(input)).pipe(
Effect.andThen(() => Ref.set(fiberRef, Option.none())),
),
)
yield* Ref.set(fiberRef, Option.some(fiber))
})
export class FiberSingleton extends Context.Tag('FiberSingleton')<
FiberSingleton,
Ref.Ref<Option.Option<Fiber.Fiber<void, UnknownException>>>
>() {
static Live = Layer.effect(
FiberSingleton,
Ref.make<Option.Option<Fiber.Fiber<void, UnknownException>>>(Option.none()),
)
}
// long-running process here
const doStuff = (input: string) => Promise.resolve()
export const think = (input: string) =>
Effect.gen(function* () {
const fiberRef = yield* FiberSingleton
const maybeFiber = yield* fiberRef.get
if (Option.isSome(maybeFiber)) {
yield* Fiber.interrupt(maybeFiber.value)
}
const fiber: Fiber.Fiber<void, UnknownException> = yield* Effect.fork(
Effect.tryPromise(() => doStuff(input)).pipe(
Effect.andThen(() => Ref.set(fiberRef, Option.none())),
),
)
yield* Ref.set(fiberRef, Option.some(fiber))
})
export class FiberSingleton extends Context.Tag('FiberSingleton')<
FiberSingleton,
Ref.Ref<Option.Option<Fiber.Fiber<void, UnknownException>>>
>() {
static Live = Layer.effect(
FiberSingleton,
Ref.make<Option.Option<Fiber.Fiber<void, UnknownException>>>(Option.none()),
)
}