use std::marker::PhantomData;

fn main() {}

trait Props<'parent> {}

struct SomeProps<'p> {
    text: &'p str,
}

impl<'p> Props<'p> for SomeProps<'p> {}

struct OutputNode<'a> {
    _p: PhantomData<&'a ()>,
}

// combine reference to self (borrowed from self) and referenfce to parent (borrowed from parent)
// borrow chain looks like 'p + 's -> 'p + 's -> 'p + 's
// always adding new lifetimes from self into the mix
// what does a "self" lifetime mean?
// a "god" gives us our data
// the god's lifetime is tied to Context, and the borrowed props object
// for the sake of simplicity, we just clobber lifetimes.
// user functions are just lies and we abuse lifetimes.
// everything is managed at runtime because that's how we make something ergonomc
// lifetime management in dioxus is just cheating around the rules
// our kind god manages lifetimes for us so we don't have to, thanks god
fn something<'s>(_props: &'s SomeProps<'s>) -> OutputNode<'s> {
    todo!()
}

// type BC<'p, P: Props<'p>> = for<'a, 'b, 'c> fn(&'a P<'b>) -> OutputNode<'c>;
