use core::{
borrow::{Borrow, BorrowMut},
ops::{Deref, DerefMut},
};
pub trait Pipe {
#[inline(always)]
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where
Self: Sized,
R: Sized,
{
func(self)
}
#[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_ref_mut<'a, R>(
&'a mut self,
func: impl FnOnce(&'a mut Self) -> R,
) -> R
where
R: 'a + Sized,
{
func(self)
}
#[inline(always)]
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a + Sized,
{
func(Borrow::<B>::borrow(self))
}
#[inline(always)]
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
where
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a + Sized,
{
func(BorrowMut::<B>::borrow_mut(self))
}
#[inline(always)]
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a + Sized,
{
func(AsRef::<U>::as_ref(self))
}
#[inline(always)]
fn pipe_as_mut<'a, U, R>(
&'a mut self,
func: impl FnOnce(&'a mut U) -> R,
) -> R
where
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a + Sized,
{
func(AsMut::<U>::as_mut(self))
}
#[inline(always)]
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where
Self: Deref<Target = T>,
T: 'a + ?Sized,
R: 'a + Sized,
{
func(Deref::deref(self))
}
#[inline(always)]
fn pipe_deref_mut<'a, T, R>(
&'a mut self,
func: impl FnOnce(&'a mut T) -> R,
) -> R
where
Self: DerefMut + Deref<Target = T>,
T: 'a + ?Sized,
R: 'a + Sized,
{
func(DerefMut::deref_mut(self))
}
}
impl<T> Pipe for T where T: ?Sized {}