use dioxus_core::context::Context; pub struct RecoilContext { _inner: T, } impl RecoilContext { /// Get the value of an atom. Returns a reference to the underlying data. pub fn get(&self) {} /// Replace an existing value with a new value /// /// This does not replace the value instantly, and all calls to "get" within the current scope will return pub fn set(&self) {} // Modify lets you modify the value in place. However, because there's no previous value around to compare // the new one with, we are unable to memoize the change. As such, all downsteam users of this Atom will // be updated, causing all subsrcibed components to re-render. // // This is fine for most values, but might not be performant when dealing with collections. For collections, // use the "Family" variants as these will stay memoized for inserts, removals, and modifications. // // Note - like "set" this won't propogate instantly. Once all "gets" are dropped, only then will we run the pub fn modify(&self) {} } pub fn use_callback<'a, G>(c: &Context<'a>, f: impl Fn() -> G) -> &'a RecoilContext { todo!() } pub fn use_atom(c: &Context, t: &'static Atom) -> O { todo!() } pub fn use_batom(c: &Context, t: impl Readable) -> O { todo!() } pub trait Readable {} impl Readable for &'static Atom {} impl Readable for &'static AtomFamily {} pub fn use_atom_family<'a, K: PartialEq, V: PartialEq>( c: &Context<'a>, t: &'static AtomFamily, g: K, ) -> &'a V { todo!() } pub use atoms::{atom, Atom}; pub use atoms::{atom_family, AtomFamily}; mod atoms { use super::*; pub struct AtomBuilder { pub key: String, pub manual_init: Option T>>, _never: std::marker::PhantomData, } impl AtomBuilder { pub fn new() -> Self { Self { key: uuid::Uuid::new_v4().to_string(), manual_init: None, _never: std::marker::PhantomData {}, } } pub fn init T + 'static>(&mut self, f: A) { self.manual_init = Some(Box::new(f)); } pub fn set_key(&mut self, _key: &'static str) {} } pub struct atom(pub fn(&mut AtomBuilder) -> T); pub type Atom = atom; pub struct AtomFamilyBuilder { _never: std::marker::PhantomData<(K, V)>, } pub struct atom_family(pub fn(&mut AtomFamilyBuilder)); pub type AtomFamily = atom_family; } pub use selectors::selector; mod selectors { pub struct SelectorBuilder { _p: std::marker::PhantomData, } impl SelectorBuilder { pub fn getter(self, f: impl Fn(()) -> O) -> SelectorBuilder { todo!() // std::rc::Rc::pin(value) // todo!() } } pub struct selector(pub fn(SelectorBuilder) -> SelectorBuilder); }