module Util ( mapPair, colorToString, stringToColor, colorToCairo, enumToNum, whenJust ) where import Control.Monad import Data.Char import Graphics.UI.Gtk.General.Structs import GHC.Word (Word16) import Text.ParserCombinators.Parsec import Text.ParserCombinators.Parsec.Char import Text.Printf mapPair :: (a -> b) -> (a,a) -> (b,b) mapPair f (x,y) = (f x,f y) colorToNums :: Num a => Color -> (a,a,a) colorToNums (Color r g b) = (fromIntegral r, fromIntegral g, fromIntegral b) colorToString :: Color -> String colorToString c = let (r,g,b) = colorToNums c :: (Int,Int,Int) in printf "#%02x%02x%02x" (r `div` 257) (g `div` 257) (b `div` 257) colorComponent :: Parser Word16 colorComponent = do d <- hexDigit d' <- hexDigit return (fromIntegral ((digitToInt d * 16 + digitToInt d') * 256)) -- Parser for the full color string in hexadecimal notation. colorParser :: Parser Color colorParser = do char '#' r <- colorComponent g <- colorComponent b <- colorComponent return (Color r g b) stringToColor :: String -> Color stringToColor s = case parse colorParser "" s of Left _ -> error "invalid color" Right c -> c colorToCairo :: Color -> (Double,Double,Double) colorToCairo c = let (r,g,b) = colorToNums c :: (Double,Double,Double) in (r / 65535, g / 65535, b / 65535) enumToNum :: (Enum a, Num b) => a -> b enumToNum = fromIntegral . fromEnum whenJust :: Monad m => Maybe a -> (a -> m ()) -> m () whenJust = flip (maybe (return ()))