// // Copyright 2025 DXOS.org // import { Atom } from '@effect-atom/atom'; import { type MulticastObservable } from '@dxos/async'; const observableFamily = Atom.family((observable: MulticastObservable) => { return Atom.make((get) => { const subscription = observable.subscribe((value) => get.setSelf(value)); get.addFinalizer(() => subscription.unsubscribe()); return observable.get(); }); }); /** * Creates an Atom.Atom from a MulticastObservable * Will return the same atom instance for the same observable. */ export const fromObservable = (observable: MulticastObservable): Atom.Atom => { return observableFamily(observable) as Atom.Atom; };