use std::ops::Deref;
use std::ops::DerefMut;
pub trait Over: Sized {
fn over<F, Ret>(self, f: F) -> Ret
where
F: FnOnce(Self) -> Ret,
{
f(self)
}
}
impl<T> Over for T {}
pub trait OverRef {
fn over_ref<F, Ret>(&self, f: F) -> Ret
where
F: FnOnce(&Self) -> Ret,
{
f(self)
}
}
impl<T> OverRef for T {}
pub trait OverMut {
fn over_mut<F, Ret>(&mut self, f: F) -> Ret
where
F: FnOnce(&mut Self) -> Ret,
{
f(self)
}
}
impl<T> OverMut for T {}
pub trait OverDeref: Deref {
fn over_deref<F, Ret>(&self, f: F) -> Ret
where
F: FnOnce(&<Self as Deref>::Target) -> Ret;
}
impl<T> OverDeref for T
where
T: Deref,
{
fn over_deref<F, Ret>(&self, f: F) -> Ret
where
F: FnOnce(&Self::Target) -> Ret,
{
f(Deref::deref(self))
}
}
pub trait OverDerefMut: DerefMut {
fn over_deref_mut<F, Ret>(&mut self, f: F) -> Ret
where
F: FnOnce(&mut Self::Target) -> Ret;
}
impl<T, DerefTarget> OverDerefMut for T
where
T: DerefMut,
T: Deref<Target = DerefTarget>,
{
fn over_deref_mut<F, Ret>(&mut self, f: F) -> Ret
where
F: FnOnce(&mut DerefTarget) -> Ret,
{
f(DerefMut::deref_mut(self))
}
}