use core::{
borrow::{
Borrow,
BorrowMut,
},
ops::{
Deref,
DerefMut,
},
};
pub trait Pipe: Sized {
#[inline(always)]
fn pipe<F, R>(self, func: F) -> R
where F: FnOnce(Self) -> R, R: Sized {
func(self)
}
#[inline(always)]
fn p<F, R>(self, func: F) -> R
where F: FnOnce(Self) -> R, R: Sized {
Pipe::pipe(self, func)
}
}
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)
}
#[inline(always)]
fn pr<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a + Sized {
PipeRef::pipe_ref(self, func)
}
#[inline(always)]
fn pm<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a + Sized {
PipeRef::pipe_mut(self, func)
}
}
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: 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: Sized {
func(BorrowMut::<T>::borrow_mut(self))
}
}
pub trait PipeAsRef {
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))
}
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 {
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))
}
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 {}