use core::{
borrow::{
Borrow,
BorrowMut,
},
ops::{
Deref,
DerefMut,
},
};
pub trait Pipe: Sized {
#[inline(always)]
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where R: Sized {
func(self)
}
}
pub trait PipeRef {
#[inline(always)]
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a + Sized {
func(self)
}
#[inline(always)]
fn pipe_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a + Sized {
func(self)
}
}
pub trait PipeBorrow {
#[inline(always)]
fn pipe_borrow<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where
Self: Borrow<T>,
T: 'a,
R: 'a + Sized,
{
func(Borrow::<T>::borrow(self))
}
#[inline(always)]
fn pipe_borrow_mut<'a, T, R>(
&'a mut self,
func: impl FnOnce(&'a mut T) -> R,
) -> R
where
Self: BorrowMut<T>,
T: 'a,
R: 'a + Sized,
{
func(BorrowMut::<T>::borrow_mut(self))
}
}
pub trait PipeAsRef {
#[inline(always)]
fn pipe_as_ref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where
Self: AsRef<T>,
T: 'a,
R: 'a + Sized,
{
func(AsRef::<T>::as_ref(self))
}
#[inline(always)]
fn pipe_as_mut<'a, T, R>(
&'a mut self,
func: impl FnOnce(&'a mut T) -> R,
) -> R
where
Self: AsMut<T>,
T: 'a,
R: 'a + Sized,
{
func(AsMut::<T>::as_mut(self))
}
}
pub trait PipeDeref {
#[inline(always)]
fn pipe_deref<'a, R>(
&'a self,
func: impl FnOnce(&'a <Self as Deref>::Target) -> R,
) -> R
where
Self: Deref,
R: 'a + Sized,
{
func(Deref::deref(self))
}
#[inline(always)]
fn pipe_deref_mut<'a, R>(
&'a mut self,
func: impl FnOnce(&'a mut <Self as Deref>::Target) -> R,
) -> R
where
Self: DerefMut,
R: 'a + Sized,
{
func(DerefMut::deref_mut(self))
}
}
impl<T: Sized> Pipe for T {
}
impl<T> PipeRef for T {
}
impl<T> PipeBorrow for T {
}
impl<T> PipeAsRef for T {
}
impl<T> PipeDeref for T {
}