Skip to content
Snippets Groups Projects
Select Git revision
  • 609bfc51bcc45f2cc15e8e9b72e528daa626b310
  • main default protected
  • update_2024
  • fix_formatting
4 results

something_or_nothing.rs

Blame
  • Forked from orestis.malaspin / rust-101
    Source project has a limited visibility.
    something_or_nothing.rs 2.69 KiB
    use crate::minimum::Minimum;
    
    /// An generic enumerated type that has two variants.
    ///
    /// - Nothing
    /// - Something
    #[derive(Clone, Copy)]
    pub enum SomethingOrNothing<T> {
        /// A [SomethingOrNothing::Nothing]
        Nothing,
        /// A [SomethingOrNothing::Something] encapsulating a T
        Something(T),
    }
    
    impl<T: std::fmt::Display> SomethingOrNothing<T> {
        /// A static function that prints the content of a SomethingOrNothing.
        pub fn print(&self) {
            match self {
                SomethingOrNothing::Nothing => println!("Nothing."),
                SomethingOrNothing::Something(val) => println!("Something is: {}", val),
            }
        }
    }
    
    impl<T> Default for SomethingOrNothing<T> {
        /// By Default a [SomethingOrNothing] is a nothing.
        fn default() -> Self {
            SomethingOrNothing::Nothing
        }
    }
    
    impl<T: PartialEq> PartialEq for SomethingOrNothing<T> {
        fn eq(&self, other: &Self) -> bool {
            match (self, other) {
                (SomethingOrNothing::Nothing, SomethingOrNothing::Nothing) => true,
                (SomethingOrNothing::Something(lhs), SomethingOrNothing::Something(rhs)) => {
                    *lhs == *rhs
                }
                _ => false,
            }
        }
    }
    
    impl<T: Minimum> Minimum for SomethingOrNothing<T> {
        fn min(self, rhs: Self) -> Self {
            match (self, rhs) {
                (SomethingOrNothing::Nothing, SomethingOrNothing::Nothing) => {
                    SomethingOrNothing::Nothing
                }
                (SomethingOrNothing::Something(lhs), SomethingOrNothing::Something(rhs)) => {
                    SomethingOrNothing::Something(lhs.min(rhs))
                }
                (SomethingOrNothing::Nothing, SomethingOrNothing::Something(rhs)) => {
                    SomethingOrNothing::Something(rhs)
                }
                (SomethingOrNothing::Something(lhs), SomethingOrNothing::Nothing) => {
                    SomethingOrNothing::Something(lhs)
                }
            }
        }
    }
    
    /// Computes the minimum of an Array of a type T which implements the [Minimum] trait.
    /// Returns a [SomethingOrNothing::Something] containing the the minimum value
    /// or [SomethingOrNothing::Nothing] if no minimum value was found.
    ///
    /// # Example
    ///
    /// ```
    /// # use part06::something_or_nothing::{SomethingOrNothing, find_min};