packages feed

hsexif-0.6.0.1: Graphics/Helpers.hs

module Graphics.Helpers where

import Data.Binary.Get
import qualified Data.ByteString.Lazy as B
import Control.Monad (replicateM)
import Control.Applicative ( (<$>) )
import Data.Char (chr, isDigit, ord)

-- | Suppress the 'Left' value of an 'Either'
-- From the 'errors' package.
hush :: Either a b -> Maybe b
hush = either (const Nothing) Just

runEitherGet :: Get a -> B.ByteString -> Either String a
runEitherGet get bs = case runGetOrFail get bs of
	Left (_,_,errorMsg) -> Left errorMsg
	Right (_,_,x) -> Right x

runMaybeGet :: Get a -> B.ByteString -> Maybe a
runMaybeGet get = hush . runEitherGet get

getCharWhere :: (Char->Bool) -> Get Char
getCharWhere wher = do
	char <- chr . fromIntegral <$> getWord8
	if wher char
		then return char
		else fail "no parse"

getDigit :: Get Char
getDigit = getCharWhere isDigit

getCharValue :: Char -> Get Char
getCharValue char = getCharWhere (==char)

readDigit :: Read a => Int -> Get a
readDigit x = read <$> count x getDigit

count :: Int -> Get a -> Get [a]
count = replicateM

stringToByteString :: String -> B.ByteString
stringToByteString = B.pack . map (fromIntegral . ord)