packages feed

rattletrap-14.1.4: 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)