module Sindre.Util
( io
, fi
, err
, upcase
, downcase
, hsv2rgb
, wrap
, quote
, clamp
, mapAccumLM
, ifM
) where
import Control.Monad.Trans
import Data.Char
import System.IO
io :: MonadIO m => IO a -> m a
io = liftIO
fi :: (Integral a, Num b) => a -> b
fi = fromIntegral
err :: MonadIO m => String -> m ()
err = io . hPutStrLn stderr
upcase :: String -> String
upcase = map toUpper
downcase :: String -> String
downcase = map toLower
hsv2rgb :: Fractional a => (Integer,a,a) -> (a,a,a)
hsv2rgb (h,s,v) =
let hi = div h 60 `mod` 6 :: Integer
f = fi h/60 fi hi :: Fractional a => a
q = v * (1f)
p = v * (1s)
t = v * (1(1f)*s)
in case hi of
0 -> (v,t,p)
1 -> (q,v,p)
2 -> (p,v,t)
3 -> (p,q,v)
4 -> (t,p,v)
5 -> (v,p,q)
_ -> error "The world is ending. x mod a >= a."
wrap :: String -> String -> String
wrap x y = x ++ y ++ x
quote :: String -> String
quote = wrap "\""
clamp :: Ord a => a -> a -> a -> a
clamp lower x upper = min upper $ max lower x
mapAccumLM :: Monad m => (acc -> x -> m (acc, y))
-> acc
-> [x]
-> m (acc, [y])
mapAccumLM _ s [] = return (s, [])
mapAccumLM f s (x:xs) = do
(s', y ) <- f s x
(s'',ys) <- mapAccumLM f s' xs
return (s'',y:ys)
ifM :: Monad m => m Bool -> m a -> m a -> m a
ifM p t e = do b <- p
if b then t else e