module Rattletrap.BitString where import qualified Data.Bits as Bits import qualified Data.ByteString as ByteString data BitString = BitString { byteString :: ByteString.ByteString, offset :: Int } deriving (Eq, Show) fromByteString :: ByteString.ByteString -> BitString fromByteString byteString = BitString {byteString, offset = 0} pop :: BitString -> Maybe (Bool, BitString) pop old = do (word, byteString) <- ByteString.uncons $ byteString old let bit = Bits.testBit word $ offset old new = if offset old == 7 then fromByteString byteString else old {offset = offset old + 1} pure (bit, new)