rattletrap-11.0.0: src/lib/Rattletrap/BitString.hs
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)