#![doc = include_str!("doc.md")]
#![no_std]
use core::{
borrow::{Borrow, BorrowMut},
ops::{Deref, DerefMut},
};
pub trait Pipe {
#[inline]
fn pipe<Return, Function>(self, f: Function) -> Return
where
Self: Sized,
Function: FnOnce(Self) -> Return,
{
f(self)
}
#[inline]
fn pipe_ref<'a, Return, Function>(&'a self, f: Function) -> Return
where
Function: FnOnce(&'a Self) -> Return,
{
f(self)
}
#[inline]
fn pipe_mut<'a, Return, Function>(&'a mut self, f: Function) -> Return
where
Function: FnOnce(&'a mut Self) -> Return,
{
f(self)
}
#[inline]
fn pipe_as_ref<'a, Param, Return, Function>(&'a self, f: Function) -> Return
where
Self: AsRef<Param>,
Param: ?Sized + 'a,
Function: FnOnce(&'a Param) -> Return,
{
f(self.as_ref())
}
#[inline]
fn pipe_as_mut<'a, Param, Return, Function>(&'a mut self, f: Function) -> Return
where
Self: AsMut<Param>,
Param: ?Sized + 'a,
Function: FnOnce(&'a mut Param) -> Return,
{
f(self.as_mut())
}
#[inline]
fn pipe_deref<'a, Param, Return, Function>(&'a self, f: Function) -> Return
where
Self: Deref<Target = Param>,
Param: ?Sized + 'a,
Function: FnOnce(&'a Param) -> Return,
{
f(self)
}
#[inline]
fn pipe_deref_mut<'a, Param, Return, Function>(&'a mut self, f: Function) -> Return
where
Self: DerefMut<Target = Param>,
Param: ?Sized + 'a,
Function: FnOnce(&'a mut Param) -> Return,
{
f(self)
}
#[inline]
fn pipe_borrow<'a, Param, Return, Function>(&'a self, f: Function) -> Return
where
Self: Borrow<Param>,
Param: ?Sized + 'a,
Function: FnOnce(&'a Param) -> Return,
{
f(self.borrow())
}
#[inline]
fn pipe_borrow_mut<'a, Param, Return, Function>(&'a mut self, f: Function) -> Return
where
Self: BorrowMut<Param>,
Param: ?Sized + 'a,
Function: FnOnce(&'a mut Param) -> Return,
{
f(self.borrow_mut())
}
}
impl<X> Pipe for X {}
#[cfg(test)]
mod tests;