pub struct Refinement<T, P>(/* private fields */);
Expand description
A Refinement
type ensures all values of a particular type satisfy a Predicate
.
Use as_inner
/to_inner
to access the
underlying value or into_inner
to unwrap the value.
Refinement
also implements many common standard library traits if the underlying
value also implements them.
§Examples
use refinement::{Predicate, Refinement};
struct LessThanTen;
impl Predicate<i32> for LessThanTen {
fn test(x: &i32) -> bool {
*x < 10
}
}
type LessThanTenInt = Refinement<i32, LessThanTen>;
let x = LessThanTenInt::new(5);
assert!(x.is_some());
let y = LessThanTenInt::new(11);
assert!(y.is_none());
Implementations§
Source§impl<T, P> Refinement<T, P>where
P: Predicate<T>,
impl<T, P> Refinement<T, P>where
P: Predicate<T>,
Sourcepub fn new(x: T) -> Option<Self>
pub fn new(x: T) -> Option<Self>
Create a refined value from the underlying type T
.
Returns x
under the refinement type if x
satisfies P
, otherwise returns None
.
§Examples
use refinement::{Predicate, Refinement};
struct NonEmpty;
impl Predicate<String> for NonEmpty {
fn test(x: &String) -> bool {
!x.is_empty()
}
}
type NonEmptyString = Refinement<String, NonEmpty>;
let s1 = NonEmptyString::new(String::from("Hello"));
assert!(s1.is_some());
let s2 = NonEmptyString::new(String::from(""));
assert!(s2.is_none());
Sourcepub fn into_inner(self) -> T
pub fn into_inner(self) -> T
Unwrap the underlying value, consuming self
.
§Examples
use refinement::{Predicate, Refinement};
struct ThreeDigit;
impl Predicate<String> for ThreeDigit {
fn test(x: &String) -> bool {
x.chars().count() == 3 && x.chars().filter(|c| c.is_ascii_digit()).count() == 3
}
}
type ThreeDigitString = Refinement<String, ThreeDigit>;
let s = ThreeDigitString::new(String::from("123"));
assert_eq!(String::from("123"), s.unwrap().into_inner());
Source§impl<T, P> Refinement<T, P>
impl<T, P> Refinement<T, P>
Sourcepub fn to_inner(&self) -> T
pub fn to_inner(&self) -> T
Retrieve the underlying value without consuming self
.
§Examples
use refinement::{Predicate, Refinement};
struct ThreeDigit;
impl Predicate<String> for ThreeDigit {
fn test(x: &String) -> bool {
x.chars().count() == 3 && x.chars().filter(|c| c.is_ascii_digit()).count() == 3
}
}
type ThreeDigitString = Refinement<String, ThreeDigit>;
let s = ThreeDigitString::new(String::from("123"));
assert_eq!(String::from("123"), s.unwrap().to_inner());
Source§impl<T, P> Refinement<T, P>
impl<T, P> Refinement<T, P>
Sourcepub fn as_inner(&self) -> T
pub fn as_inner(&self) -> T
Retrieve the underlying value for Copy
types without consuming self
.
§Examples
use refinement::{Predicate, Refinement};
struct LessThanTen;
impl Predicate<i32> for LessThanTen {
fn test(x: &i32) -> bool {
*x < 10
}
}
type LessThanTenInt = Refinement<i32, LessThanTen>;
let x = LessThanTenInt::new(5);
assert_eq!(5, x.unwrap().as_inner());
Trait Implementations§
Source§impl<T, P> Add<T> for Refinement<T, P>
impl<T, P> Add<T> for Refinement<T, P>
Source§impl<T, P> Add for Refinement<T, P>
impl<T, P> Add for Refinement<T, P>
Source§impl<T, P> AsRef<T> for Refinement<T, P>where
P: Predicate<T>,
impl<T, P> AsRef<T> for Refinement<T, P>where
P: Predicate<T>,
Source§impl<T, P> BitAnd<T> for Refinement<T, P>
impl<T, P> BitAnd<T> for Refinement<T, P>
Source§impl<T, P> BitAnd for Refinement<T, P>
impl<T, P> BitAnd for Refinement<T, P>
Source§impl<T, P> BitOr<T> for Refinement<T, P>
impl<T, P> BitOr<T> for Refinement<T, P>
Source§impl<T, P> BitOr for Refinement<T, P>
impl<T, P> BitOr for Refinement<T, P>
Source§impl<T, P> BitXor<T> for Refinement<T, P>
impl<T, P> BitXor<T> for Refinement<T, P>
Source§impl<T, P> BitXor for Refinement<T, P>
impl<T, P> BitXor for Refinement<T, P>
Source§impl<T, P> Borrow<T> for Refinement<T, P>where
P: Predicate<T>,
impl<T, P> Borrow<T> for Refinement<T, P>where
P: Predicate<T>,
Source§impl<T: Clone, P> Clone for Refinement<T, P>
impl<T: Clone, P> Clone for Refinement<T, P>
Source§impl<T, P> Debug for Refinement<T, P>where
T: Debug,
impl<T, P> Debug for Refinement<T, P>where
T: Debug,
Source§impl<T, P> Deref for Refinement<T, P>
impl<T, P> Deref for Refinement<T, P>
Source§impl<T, P> DerefMut for Refinement<T, P>
impl<T, P> DerefMut for Refinement<T, P>
Source§impl<T, P> Display for Refinement<T, P>
impl<T, P> Display for Refinement<T, P>
Source§impl<T, P> Div<T> for Refinement<T, P>
impl<T, P> Div<T> for Refinement<T, P>
Source§impl<T, P> Div for Refinement<T, P>
impl<T, P> Div for Refinement<T, P>
Source§impl<T, P, I> Index<I> for Refinement<T, P>
impl<T, P, I> Index<I> for Refinement<T, P>
Source§impl<T, P> Mul<T> for Refinement<T, P>
impl<T, P> Mul<T> for Refinement<T, P>
Source§impl<T, P> Mul for Refinement<T, P>
impl<T, P> Mul for Refinement<T, P>
Source§impl<T, P> Neg for Refinement<T, P>
impl<T, P> Neg for Refinement<T, P>
Source§impl<T, P> Not for Refinement<T, P>
impl<T, P> Not for Refinement<T, P>
Source§impl<T: Ord, P: Ord> Ord for Refinement<T, P>
impl<T: Ord, P: Ord> Ord for Refinement<T, P>
Source§fn cmp(&self, other: &Refinement<T, P>) -> Ordering
fn cmp(&self, other: &Refinement<T, P>) -> Ordering
1.21.0 · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read more
Source§impl<T: PartialOrd, P: PartialOrd> PartialOrd for Refinement<T, P>
impl<T: PartialOrd, P: PartialOrd> PartialOrd for Refinement<T, P>
Source§impl<T, P, B> RangeBounds<B> for Refinement<T, P>where
T: RangeBounds<B>,
P: Predicate<T>,
impl<T, P, B> RangeBounds<B> for Refinement<T, P>where
T: RangeBounds<B>,
P: Predicate<T>,
Source§impl<T, P> Rem<T> for Refinement<T, P>
impl<T, P> Rem<T> for Refinement<T, P>
Source§impl<T, P> Rem for Refinement<T, P>
impl<T, P> Rem for Refinement<T, P>
Source§impl<T, P> Shl<T> for Refinement<T, P>
impl<T, P> Shl<T> for Refinement<T, P>
Source§impl<T, P> Shl for Refinement<T, P>
impl<T, P> Shl for Refinement<T, P>
Source§impl<T, P> Shr<T> for Refinement<T, P>
impl<T, P> Shr<T> for Refinement<T, P>
Source§impl<T, P> Shr for Refinement<T, P>
impl<T, P> Shr for Refinement<T, P>
Source§impl<T, P> Sub<T> for Refinement<T, P>
impl<T, P> Sub<T> for Refinement<T, P>
Source§impl<T, P> Sub for Refinement<T, P>
impl<T, P> Sub for Refinement<T, P>
impl<T: Copy, P> Copy for Refinement<T, P>
impl<T: Eq, P: Eq> Eq for Refinement<T, P>
impl<T, P> StructuralPartialEq for Refinement<T, P>
Auto Trait Implementations§
impl<T, P> Freeze for Refinement<T, P>where
T: Freeze,
impl<T, P> RefUnwindSafe for Refinement<T, P>where
T: RefUnwindSafe,
P: RefUnwindSafe,
impl<T, P> Send for Refinement<T, P>
impl<T, P> Sync for Refinement<T, P>
impl<T, P> Unpin for Refinement<T, P>
impl<T, P> UnwindSafe for Refinement<T, P>where
T: UnwindSafe,
P: 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