-
Notifications
You must be signed in to change notification settings - Fork 13
Open
Description
With the requirement for values to implement Value, typically through the use of sentinel values, hard-to-diagnose bugs can crop up.
The suggestion is an addition of a type to the library; an enum using generics with three variants: a redirect variant, a null variant, and a variant which actually contains data. Developers using your library can use this enum, and those with very strict space or performance requirements can implement Value manually.
A sample implementation:
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum LeapValue<V> {
Redirect,
Null,
Inner(V)
}
impl<V> LeapValue<V> {
pub fn to_option(self) -> Option<V> {
match self {
Self::Inner(inner) => Some(inner),
_ => None,
}
}
}
impl<V> Value for LeapValue<V>
where V: Sized + Debug + Clone + Copy {
fn is_redirect(&self) -> bool {
match self {
Self::Redirect => true,
_ => false,
}
}
fn is_null(&self) -> bool {
match self {
Self::Null => true,
_ => false,
}
}
fn redirect() -> Self {
Self::Redirect
}
fn null() -> Self {
Self::Null
}
}What do you think?
Metadata
Metadata
Assignees
Labels
No labels