module Rattletrap.Utility.Bytes
  ( encodeLatin1
  , padBytes
  , reverseBytes
  ) where

import qualified Data.Bits as Bits
import qualified Data.ByteString as Bytes
import qualified Data.ByteString.Char8 as Bytes8
import qualified Data.Text as Text
import qualified Data.Word as Word

encodeLatin1 :: Text.Text -> Bytes.ByteString
encodeLatin1 :: Text -> ByteString
encodeLatin1 Text
text = String -> ByteString
Bytes8.pack (Text -> String
Text.unpack Text
text)

padBytes :: Integral a => a -> Bytes.ByteString -> Bytes.ByteString
padBytes :: a -> ByteString -> ByteString
padBytes a
size ByteString
bytes =
  ByteString
bytes ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> Int -> Word8 -> ByteString
Bytes.replicate (a -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
size Int -> Int -> Int
forall a. Num a => a -> a -> a
- ByteString -> Int
Bytes.length ByteString
bytes) Word8
0x00

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

reverseBytes :: Bytes.ByteString -> Bytes.ByteString
reverseBytes :: ByteString -> ByteString
reverseBytes = (Word8 -> Word8) -> ByteString -> ByteString
Bytes.map Word8 -> Word8
reverseByte