pub struct Specializer<T, U, F>(/* private fields */);
Expand description
Specialized behavior runner (Owned -> Owned)
Implementations§
Source§impl<T, U, F> Specializer<T, U, F>where
F: FnOnce(T) -> U,
T: 'static,
U: 'static,
impl<T, U, F> Specializer<T, U, F>where
F: FnOnce(T) -> U,
T: 'static,
U: 'static,
Sourcepub fn specialize<P, R>(
self,
f: impl FnOnce(P) -> R,
) -> Specializer<T, U, impl FnOnce(T) -> U>where
P: 'static,
R: 'static,
pub fn specialize<P, R>(
self,
f: impl FnOnce(P) -> R,
) -> Specializer<T, U, impl FnOnce(T) -> U>where
P: 'static,
R: 'static,
Specialize on the parameter and the return type of the closure.
use specializer::Specializer;
fn specialized<T, U>(ty: T) -> U
where
T: 'static,
U: 'static + From<T> + From<u8>,
{
Specializer::new(ty, From::from)
.specialize(|int: i32| -> i32 { int * 2 })
.specialize_param(|int: u8| { U::from(int * 3) })
.run()
}
assert_eq!(specialized::<i16, i32>(3), 3);
assert_eq!(specialized::<i32, i32>(3), 6);
assert_eq!(specialized::<u8, i32>(3), 9);
Sourcepub fn specialize_map<P, R>(
self,
p: impl FnOnce(P) -> P,
f: impl FnOnce(T) -> U,
r: impl FnOnce(R) -> R,
) -> Specializer<T, U, impl FnOnce(T) -> U>where
P: 'static,
R: 'static,
pub fn specialize_map<P, R>(
self,
p: impl FnOnce(P) -> P,
f: impl FnOnce(T) -> U,
r: impl FnOnce(R) -> R,
) -> Specializer<T, U, impl FnOnce(T) -> U>where
P: 'static,
R: 'static,
Specialize on the parameter and the return type of the closure, mapping both.
use std::convert;
use specializer::Specializer;
fn specialized<T, U>(ty: T) -> U
where
T: 'static,
U: 'static + From<T>,
{
Specializer::new(ty, From::from)
.specialize(|int: i32| -> i32 { int * 2 })
.specialize_map(
|int: u8| int * 3,
From::from,
convert::identity::<U>,
)
.run()
}
assert_eq!(specialized::<i16, i32>(3), 3);
assert_eq!(specialized::<i32, i32>(3), 6);
assert_eq!(specialized::<u8, i32>(3), 9);
Sourcepub fn specialize_param<P>(
self,
f: impl FnOnce(P) -> U,
) -> Specializer<T, U, impl FnOnce(T) -> U>where
P: 'static,
pub fn specialize_param<P>(
self,
f: impl FnOnce(P) -> U,
) -> Specializer<T, U, impl FnOnce(T) -> U>where
P: 'static,
Specialize on the parameter of the closure.
use specializer::Specializer;
fn specialized<T>(ty: T) -> String
where
T: 'static
{
let fallback = |_| "unknown".to_owned();
Specializer::new(ty, fallback)
.specialize_param(|int: i32| (int * 2).to_string())
.specialize_param(|string: String| string)
.run()
}
assert_eq!(specialized(3), "6");
assert_eq!(specialized("Hello world".to_string()), "Hello world");
assert_eq!(specialized(()), "unknown");
Sourcepub fn specialize_return<R>(
self,
f: impl FnOnce(T) -> R,
) -> Specializer<T, U, impl FnOnce(T) -> U>where
R: 'static,
pub fn specialize_return<R>(
self,
f: impl FnOnce(T) -> R,
) -> Specializer<T, U, impl FnOnce(T) -> U>where
R: 'static,
Specialize on the return type of the closure.
use specializer::Specializer;
fn specialized<T>(int: i32) -> T
where
T: 'static + Default
{
let fallback = |_| -> T { Default::default() };
Specializer::new(int, fallback)
.specialize_return(|int| -> i32 { int * 2 })
.specialize_return(|int| -> String { int.to_string() })
.run()
}
assert_eq!(specialized::<i32>(3), 6);
assert_eq!(specialized::<String>(3), "3");
assert_eq!(specialized::<u8>(3), 0);
Sourcepub fn specialize_map_param<P>(
self,
p: impl FnOnce(P) -> P,
f: impl FnOnce(T) -> U,
) -> Specializer<T, U, impl FnOnce(T) -> U>where
P: 'static,
pub fn specialize_map_param<P>(
self,
p: impl FnOnce(P) -> P,
f: impl FnOnce(T) -> U,
) -> Specializer<T, U, impl FnOnce(T) -> U>where
P: 'static,
Specialize on the parameter and the return type of the closure, mapping the parameter.
use std::convert;
use specializer::Specializer;
fn specialized<T, U>(ty: T) -> U
where
T: 'static,
U: 'static + From<T>,
{
Specializer::new(ty, From::from)
.specialize(|int: i32| -> i32 { int * 2 })
.specialize_map_param(|int: u8| int * 3, From::from)
.run()
}
assert_eq!(specialized::<i16, i32>(3), 3);
assert_eq!(specialized::<i32, i32>(3), 6);
assert_eq!(specialized::<u8, i32>(3), 9);
Sourcepub fn specialize_map_return<R>(
self,
f: impl FnOnce(T) -> U,
r: impl FnOnce(R) -> R,
) -> Specializer<T, U, impl FnOnce(T) -> U>where
R: 'static,
pub fn specialize_map_return<R>(
self,
f: impl FnOnce(T) -> U,
r: impl FnOnce(R) -> R,
) -> Specializer<T, U, impl FnOnce(T) -> U>where
R: 'static,
Specialize on the parameter and the return type of the closure, mapping the parameter.
use std::convert;
use specializer::Specializer;
fn specialized<T, U>(ty: T) -> U
where
T: 'static,
U: 'static + From<T>,
{
Specializer::new(ty, From::from)
.specialize_map_return(From::from, |int: i16| int * 2)
.specialize_map_param(|int: u8| int * 3, From::from)
.run()
}
assert_eq!(specialized::<i16, i32>(3), 3);
assert_eq!(specialized::<i8, i16>(3), 6);
assert_eq!(specialized::<u8, i32>(3), 9);
Trait Implementations§
Auto Trait Implementations§
impl<T, U, F> Freeze for Specializer<T, U, F>
impl<T, U, F> RefUnwindSafe for Specializer<T, U, F>where
T: RefUnwindSafe,
F: RefUnwindSafe,
impl<T, U, F> Send for Specializer<T, U, F>
impl<T, U, F> Sync for Specializer<T, U, F>
impl<T, U, F> Unpin for Specializer<T, U, F>
impl<T, U, F> UnwindSafe for Specializer<T, U, F>where
T: UnwindSafe,
F: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more