use supply::prelude::*;
use ty_tag::tag;
struct Demo {
value: u8,
}
impl A for Demo {
fn do_a(&self) -> u8 {
self.value
}
}
impl B for Demo {
fn do_b(&mut self, value: u8) {
self.value = value;
}
}
impl<'r> Provider<'r> for Demo {
type Lifetimes = l!['r];
fn provide(&'r self, want: &mut dyn Want<Self::Lifetimes>) {
want.provide_tag::<&dyn A>(self);
}
fn provide_mut(&'r mut self, want: &mut dyn Want<Self::Lifetimes>) {
let Some(this) = want.provide_with::<&dyn A, _, _>(self, |this| this) else {
return;
};
want.provide_tag::<&mut dyn B>(this);
}
}
#[test]
fn example() {
let mut demo = Demo { value: 0 };
let p: &mut dyn for<'r> ProviderDyn<'r> = &mut demo;
assert_eq!(p.request::<&dyn A>().unwrap().do_a(), 0);
p.request_mut::<&mut dyn B>().unwrap().do_b(5);
assert_eq!(p.request::<&dyn A>().unwrap().do_a(), 5);
}
trait A {
fn do_a(&self) -> u8;
}
#[tag]
type DynA<'u> = dyn A + 'u;
trait B {
fn do_b(&mut self, value: u8);
}
#[tag]
type DynB<'u> = dyn B + 'u;