1import * as Context from "effect/Context";
2import * as Deferred from "effect/Deferred";
3import * as Effect from "effect/Effect";
4import * as Layer from "effect/Layer";
5import * as Ref from "effect/Ref";
6
7export class DesktopShutdown extends Context.Service<
8 DesktopShutdown,
9 {
10 readonly request: Effect.Effect<void>;
11 readonly awaitRequest: Effect.Effect<void>;
12 readonly markComplete: Effect.Effect<void>;
13 readonly awaitComplete: Effect.Effect<void>;
14 readonly isComplete: Effect.Effect<boolean>;
15 }
16>()("@t3tools/desktop/app/DesktopShutdown") {}
17
18const make = Effect.gen(function* () {
19 const requested = yield* Deferred.make<void>();
20 const completed = yield* Deferred.make<void>();
21 const completedRef = yield* Ref.make(false);
22
23 return DesktopShutdown.of({
24 request: Deferred.succeed(requested, undefined).pipe(Effect.asVoid),
25 awaitRequest: Deferred.await(requested),
26 markComplete: Ref.set(completedRef, true).pipe(
27 Effect.andThen(Deferred.succeed(completed, undefined)),
28 Effect.asVoid,
29 ),
30 awaitComplete: Deferred.await(completed),
31 isComplete: Ref.get(completedRef),
32 });
33});
34
35export const layer = Layer.effect(DesktopShutdown, make);