module Data.Carbonara.Maybe where import Data.Carbonara.Read (readD) import Data.Maybe (fromJust, isJust, listToMaybe) infix 4 ^<^, ^<=^, ^>^, ^>=^ infixl 6 ^+^, ^-^ infixl 7 ^*^, ^/^ infixr 8 ^**^ infixl 9 !? -- | zero-based index -- > [1..10] !? 1 --> Just 2 -- > [1..10] !? 15 --> Nothing (!?) :: [a] -> Int -> Maybe a (!?) xs n = listToMaybe $ drop n xs -- The two type must be separate, otherwise it will be inpossbile to calculate two different types (^+^) :: (Show a, Show b) => a -> b -> Maybe Double (^+^) x y = calcMaybeString (+) x y (^-^) :: (Show a, Show b) => a -> b -> Maybe Double (^-^) x y = calcMaybeString (-) x y (^*^) :: (Show a, Show b) => a -> b -> Maybe Double (^*^) x y = calcMaybeString (*) x y (^/^) :: (Show a, Show b) => a -> b -> Maybe Double (^/^) x y = calcMaybeString (/) x y (^**^) :: (Show a, Show b) => a -> b -> Maybe Double (^**^) x y = calcMaybeString (**) x y (^>^) :: (Show a, Show b) => a -> b -> Maybe Bool (^>^) x y = calcMaybeString (>) x y (^>=^) :: (Show a, Show b) => a -> b -> Maybe Bool (^>=^) x y = calcMaybeString (>=) x y (^<^) :: (Show a, Show b) => a -> b -> Maybe Bool (^<^) x y = calcMaybeString (<) x y (^<=^) :: (Show a, Show b) => a -> b -> Maybe Bool (^<=^) x y = calcMaybeString (<=) x y calcMaybeString :: (Show a, Show b) => (Double -> Double -> c) -> a -> b -> Maybe c calcMaybeString f x y = Just f <*> readD x <*> readD y -- ^ > calcMaybeString (*) (Just "5") (Just "3") --> Just 15.0 justs :: [Maybe a] -> [a] justs = map fromJust . filter isJust -- ^ justs [Just 1, Nothing, Just 3, Just 5] --> [1,3,5]