| 1 | import type { EnvironmentId, OrchestrationV2ShellSnapshot } from "@t3tools/contracts"; |
| 2 | import * as Option from "effect/Option"; |
| 3 | import { AsyncResult, Atom } from "effect/reactivity"; |
| 4 | |
| 5 | import type { EnvironmentShellState } from "./shell.ts"; |
| 6 | |
| 7 | export 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 | } |