module Rattletrap.Utility.Bytes where

import qualified Data.Bits as Bits
import qualified Data.ByteString.Lazy as LazyBytes
import qualified Data.ByteString.Lazy.Char8 as LazyBytes8
import qualified Data.Text as Text
import qualified Data.Word as Word

encodeLatin1 :: Text.Text -> LazyBytes.ByteString
encodeLatin1 text = LazyBytes8.pack (Text.unpack text)

padBytes :: Integral a => a -> LazyBytes.ByteString -> LazyBytes.ByteString
padBytes size bytes = LazyBytes.concat
  [ bytes
  , LazyBytes.replicate (fromIntegral size - LazyBytes.length bytes) 0x00
  ]

reverseByte :: Word.Word8 -> Word.Word8
reverseByte byte =
  Bits.shiftR (byte Bits..&. Bits.bit 7) 7
    + Bits.shiftR (byte Bits..&. Bits.bit 6) 5
    + Bits.shiftR (byte Bits..&. Bits.bit 5) 3
    + Bits.shiftR (byte Bits..&. Bits.bit 4) 1
    + Bits.shiftL (byte Bits..&. Bits.bit 3) 1
    + Bits.shiftL (byte Bits..&. Bits.bit 2) 3
    + Bits.shiftL (byte Bits..&. Bits.bit 1) 5
    + Bits.shiftL (byte Bits..&. Bits.bit 0) 7

reverseBytes :: LazyBytes.ByteString -> LazyBytes.ByteString
reverseBytes = LazyBytes.map reverseByte