1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use rearch::{CData, SideEffect, SideEffectRegistrar};

pub fn state<T: Clone + Send + 'static>(
    initial: T,
) -> impl for<'a> SideEffect<Api<'a> = (T, impl CData + Fn(T))> {
    move |register: SideEffectRegistrar| {
        let (state, set_state) = register.register(super::state(initial));
        (state.clone(), set_state)
    }
}

pub fn lazy_state<T, F>(init: F) -> impl for<'a> SideEffect<Api<'a> = (T, impl CData + Fn(T))>
where
    T: Clone + Send + 'static,
    F: FnOnce() -> T + Send + 'static,
{
    move |register: SideEffectRegistrar| {
        let (state, set_state) = register.register(super::lazy_state(init));
        (state.clone(), set_state)
    }
}

pub fn value<T: Clone + Send + 'static>(value: T) -> impl for<'a> SideEffect<Api<'a> = T> {
    move |register: SideEffectRegistrar| register.register(super::value(value)).clone()
}

pub fn lazy_value<T, F>(init: F) -> impl for<'a> SideEffect<Api<'a> = T>
where
    T: Clone + Send + 'static,
    F: FnOnce() -> T + Send + 'static,
{
    move |register: SideEffectRegistrar| register.register(super::lazy_value(init)).clone()
}