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)
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)