{-# LANGUAGE EmptyDataDecls, PatternGuards #-} module Casui.Utils ( unreachable , justRight , ifJust , insertAt , divPoint , maxSize , convertInt , fst3 , snd3 , first3 , second3 , maybeNth , third3 , thrd , maybeHead , dropSame , splitChar , TagError , errorData , errorMessage , err ) where import Control.Monad.Error unreachable :: a unreachable = error "unreachable" justRight :: Either a b -> Maybe b justRight (Left _) = Nothing justRight (Right a) = Just a ifJust :: (Monad m) => Maybe a -> (a -> m ()) -> m () ifJust a f = maybe (return ()) f a insertAt :: a -> Int -> [a] -> [a] insertAt a _ [] = [a] insertAt a 0 l = a:l insertAt a n (x:l) = x : insertAt a (n-1) l type Point = (Int, Int) divPoint :: Point -> Int -> Point divPoint (a,b) x = (div a x, div b x) maxSize :: Point -> Point -> Point maxSize (a,b) (c,d) = (max a c, max b d) instance (Num a, Num b) => Num (a, b) where (a,b) + (c,d) = (a+c, b+d) (a,b) - (c,d) = (a-c, b-d) (a,b) * (c,d) = (a*c, b*d) abs (a,b) = (abs a, abs b) signum (a,b) = (signum a, signum b) fromInteger a = (fromInteger a,0) convertInt :: (Integral a, Integral b) => a -> b convertInt = fromInteger . toInteger fst3 (a,_,_) = a first3 f (a,b,c) = (f a,b,c) second3 f (a,b,c) = (a,f b,c) third3 f (a,b,c) = (a,b,f c) maybeNth [] _ = Nothing maybeNth (x:_) 0 = Just x maybeNth (_:xs) n = maybeNth xs (n-1) snd3 (_,a,_) = a thrd (_, _, a) = a maybeHead :: [a] -> Maybe a maybeHead (x:_) = Just x maybeHead _ = Nothing dropSame :: Eq a => [a] -> [a] -> ([a], [a]) dropSame (a:as) (b:bs) | a == b = dropSame as bs dropSame as bs = (,) as bs splitChar :: Char -> String -> [String] splitChar c l | (a,(_:b)) <- break (==c) l = a : splitChar c b | otherwise = [l] data TagError a = TagError { errorMessage :: String, errorData :: Maybe a } instance Error (TagError a) where noMsg = TagError "" Nothing strMsg e = TagError e Nothing err :: String -> a -> TagError a err e d = TagError e $ Just d