1import type { EnvironmentId, OrchestrationV2ShellSnapshot } from "@t3tools/contracts";
2import * as Option from "effect/Option";
3import { AsyncResult, Atom } from "effect/reactivity";
4
5import type { EnvironmentShellState } from "./shell.ts";
6
7export function createEnvironmentSnapshotAtom<E>(
8 shellStateAtom: (
9 environmentId: EnvironmentId,
10 ) => Atom.Atom<AsyncResult.AsyncResult<EnvironmentShellState, E>>,
11) {
12 return Atom.family((environmentId: EnvironmentId) =>
13 Atom.make((get): OrchestrationV2ShellSnapshot | null =>
14 Option.match(AsyncResult.value(get(shellStateAtom(environmentId))), {
15 onNone: () => null,
16 onSome: (state) => Option.getOrNull(state.snapshot),
17 }),
18 ).pipe(Atom.withLabel(`environment-snapshot:${environmentId}`)),
19 );
20}