module Rattletrap.BitString where import qualified Data.Bits as Bits import qualified Data.ByteString as ByteString data BitString = BitString { BitString -> ByteString byteString :: ByteString.ByteString , BitString -> Int offset :: Int } deriving (BitString -> BitString -> Bool (BitString -> BitString -> Bool) -> (BitString -> BitString -> Bool) -> Eq BitString forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: BitString -> BitString -> Bool $c/= :: BitString -> BitString -> Bool == :: BitString -> BitString -> Bool $c== :: BitString -> BitString -> Bool Eq, Int -> BitString -> ShowS [BitString] -> ShowS BitString -> String (Int -> BitString -> ShowS) -> (BitString -> String) -> ([BitString] -> ShowS) -> Show BitString forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [BitString] -> ShowS $cshowList :: [BitString] -> ShowS show :: BitString -> String $cshow :: BitString -> String showsPrec :: Int -> BitString -> ShowS $cshowsPrec :: Int -> BitString -> ShowS Show) fromByteString :: ByteString.ByteString -> BitString fromByteString :: ByteString -> BitString fromByteString ByteString byteString = BitString :: ByteString -> Int -> BitString BitString { ByteString byteString :: ByteString byteString :: ByteString byteString, offset :: Int offset = Int 0 } pop :: BitString -> Maybe (Bool, BitString) pop :: BitString -> Maybe (Bool, BitString) pop BitString old = do (Word8 word, ByteString byteString) <- ByteString -> Maybe (Word8, ByteString) ByteString.uncons (ByteString -> Maybe (Word8, ByteString)) -> ByteString -> Maybe (Word8, ByteString) forall a b. (a -> b) -> a -> b $ BitString -> ByteString byteString BitString old let bit :: Bool bit = Word8 -> Int -> Bool forall a. Bits a => a -> Int -> Bool Bits.testBit Word8 word (Int -> Bool) -> Int -> Bool forall a b. (a -> b) -> a -> b $ BitString -> Int offset BitString old new :: BitString new = if BitString -> Int offset BitString old Int -> Int -> Bool forall a. Eq a => a -> a -> Bool == Int 7 then ByteString -> BitString fromByteString ByteString byteString else BitString old { offset :: Int offset = BitString -> Int offset BitString old Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1 } (Bool, BitString) -> Maybe (Bool, BitString) forall (f :: * -> *) a. Applicative f => a -> f a pure (Bool bit, BitString new)