packages feed

carbonara-0.0.1: src/Data/Carbonara/Maybe.hs

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]