use core::marker::PhantomData;
use crate::traits::{FieldGetter, HasField};
pub trait MapField<Tag>: HasField<Tag> {
fn map_field<T>(
&self,
_tag: PhantomData<Tag>,
mapper: impl for<'a> FnOnce(&'a Self::Value) -> &'a T,
) -> &T;
}
impl<Context, Tag> MapField<Tag> for Context
where
Context: HasField<Tag>,
Tag: 'static,
{
fn map_field<T>(
&self,
tag: PhantomData<Tag>,
mapper: impl for<'a> FnOnce(&'a Self::Value) -> &'a T,
) -> &T {
mapper(self.get_field(tag))
}
}
pub trait FieldMapper<Context, Tag>: FieldGetter<Context, Tag> {
fn map_field<T>(
context: &Context,
_tag: PhantomData<Tag>,
mapper: impl for<'a> FnOnce(&'a Self::Value) -> &'a T,
) -> &T;
}
impl<Getter, Context, Tag> FieldMapper<Context, Tag> for Getter
where
Getter: FieldGetter<Context, Tag> + 'static,
Tag: 'static,
{
fn map_field<T>(
context: &Context,
tag: PhantomData<Tag>,
mapper: impl for<'a> FnOnce(&'a Self::Value) -> &'a T,
) -> &T {
mapper(Getter::get_field(context, tag))
}
}