pub trait DepType: Debug {
    type Id: DepObjId;
    type DepObjKey: ?Sized;
}
Expand description

A dependency type. Use the dep_type macro to create a type implementing this trait.

Examples

use components_arena::{Arena, Component, NewtypeComponentId, Id};
use dep_obj::{DetachedDepObjId, dep_type, impl_dep_obj};
use dep_obj::binding::{Bindings, Binding, Binding1};
use dyn_context::{State, StateExt};
use macro_attr_2018::macro_attr;

dep_type! {
    #[derive(Debug)]
    pub struct MyDepType = MyDepTypeId[MyDepType] {
        prop_1: bool = false,
        prop_2: i32 = 10,
    }
}

macro_attr! {
    #[derive(Component!, Debug)]
    struct MyDepTypePrivateData {
        dep_data: MyDepType,
    }
}

macro_attr! {
    #[derive(NewtypeComponentId!, Debug, Copy, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
    pub struct MyDepTypeId(Id<MyDepTypePrivateData>);
}

impl DetachedDepObjId for MyDepTypeId { }

#[derive(State)]
#[state(part)]
pub struct MyApp {
    #[state(part)]
    bindings: Bindings,
    my_dep_types: Arena<MyDepTypePrivateData>,
    res: Binding<i32>,
}

impl MyDepTypeId {
    pub fn new(state: &mut dyn State) -> MyDepTypeId {
        let app: &mut MyApp = state.get_mut();
        app.my_dep_types.insert(|id| (MyDepTypePrivateData {
            dep_data: MyDepType::new_priv()
        }, MyDepTypeId(id)))
    }

    pub fn drop_my_dep_type(self, state: &mut dyn State) {
        self.drop_bindings_priv(state);
        let app: &mut MyApp = state.get_mut();
        app.my_dep_types.remove(self.0);
    }
}

impl_dep_obj!(MyDepTypeId {
    fn<MyDepType>() -> (MyDepType) { MyApp { .my_dep_types } | .dep_data }
});

fn main() {
    let mut bindings = Bindings::new();
    let res = Binding1::new(&mut bindings, (), |(), x| Some(x));
    let app = &mut MyApp {
        bindings,
        my_dep_types: Arena::new(),
        res: res.into(),
    };
    let id = MyDepTypeId::new(app);
    res.set_source_1(app, &mut MyDepType::PROP_2.value_source(id));
    assert_eq!(app.res.get_value(app), Some(10));
    MyDepType::PROP_2.set(app, id, 5).immediate();
    assert_eq!(app.res.get_value(app), Some(5));
    id.drop_my_dep_type(app);
    res.drop_self(app);
}

Required Associated Types

Implementors