-- | I think this should be in primitive.

{-# LANGUAGE CPP #-}
{-# LANGUAGE UnboxedTuples #-}

module Raehik.Compat.Data.Primitive.Types.Endian where

import Raehik.Compat.Data.Primitive.Types
import               Data.Word
import Raehik.Compat.Data.Word.ByteSwap qualified as X
import               Data.Int
import Raehik.Compat.Data.Int.ByteSwap
import GHC.ByteOrder
import Data.Kind
import GHC.Float

-- | Boxed types which permit reversing byte order ("byte swapping").
class ByteSwap a where byteSwap :: a -> a
instance ByteSwap Word16 where byteSwap :: Word16 -> Word16
byteSwap = Word16 -> Word16
byteSwap16
instance ByteSwap Word32 where byteSwap :: Word32 -> Word32
byteSwap = Word32 -> Word32
byteSwap32
instance ByteSwap Word64 where byteSwap :: Word64 -> Word64
byteSwap = Word64 -> Word64
byteSwap64
instance ByteSwap Word   where byteSwap :: Word -> Word
byteSwap = Word -> Word
X.byteSwap
instance ByteSwap  Int16 where byteSwap :: Int16 -> Int16
byteSwap = Int16 -> Int16
byteSwapI16
instance ByteSwap  Int32 where byteSwap :: Int32 -> Int32
byteSwap = Int32 -> Int32
byteSwapI32
instance ByteSwap  Int64 where byteSwap :: Int64 -> Int64
byteSwap = Int64 -> Int64
byteSwapI64
instance ByteSwap  Int   where byteSwap :: Int -> Int
byteSwap = Int -> Int
byteSwapI

-- I think these two are well-founded. No tests currently though.
instance ByteSwap Float  where
    byteSwap :: Float -> Float
byteSwap = Word32 -> Float
castWord32ToFloat  (Word32 -> Float) -> (Float -> Word32) -> Float -> Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> Word32
forall a. ByteSwap a => a -> a
byteSwap (Word32 -> Word32) -> (Float -> Word32) -> Float -> Word32
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Word32
castFloatToWord32
instance ByteSwap Double where
    byteSwap :: Double -> Double
byteSwap = Word64 -> Double
castWord64ToDouble (Word64 -> Double) -> (Double -> Word64) -> Double -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> Word64
forall a. ByteSwap a => a -> a
byteSwap (Word64 -> Word64) -> (Double -> Word64) -> Double -> Word64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> Word64
castDoubleToWord64

newtype ByteOrdered (end :: ByteOrder) a = ByteOrdered
  { forall (end :: ByteOrder) a. ByteOrdered end a -> a
unByteOrdered :: a
  } deriving (Eq (ByteOrdered end a)
Eq (ByteOrdered end a) =>
(ByteOrdered end a -> ByteOrdered end a -> Ordering)
-> (ByteOrdered end a -> ByteOrdered end a -> Bool)
-> (ByteOrdered end a -> ByteOrdered end a -> Bool)
-> (ByteOrdered end a -> ByteOrdered end a -> Bool)
-> (ByteOrdered end a -> ByteOrdered end a -> Bool)
-> (ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a)
-> (ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a)
-> Ord (ByteOrdered end a)
ByteOrdered end a -> ByteOrdered end a -> Bool
ByteOrdered end a -> ByteOrdered end a -> Ordering
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall (end :: ByteOrder) a. Ord a => Eq (ByteOrdered end a)
forall (end :: ByteOrder) a.
Ord a =>
ByteOrdered end a -> ByteOrdered end a -> Bool
forall (end :: ByteOrder) a.
Ord a =>
ByteOrdered end a -> ByteOrdered end a -> Ordering
forall (end :: ByteOrder) a.
Ord a =>
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
$ccompare :: forall (end :: ByteOrder) a.
Ord a =>
ByteOrdered end a -> ByteOrdered end a -> Ordering
compare :: ByteOrdered end a -> ByteOrdered end a -> Ordering
$c< :: forall (end :: ByteOrder) a.
Ord a =>
ByteOrdered end a -> ByteOrdered end a -> Bool
< :: ByteOrdered end a -> ByteOrdered end a -> Bool
$c<= :: forall (end :: ByteOrder) a.
Ord a =>
ByteOrdered end a -> ByteOrdered end a -> Bool
<= :: ByteOrdered end a -> ByteOrdered end a -> Bool
$c> :: forall (end :: ByteOrder) a.
Ord a =>
ByteOrdered end a -> ByteOrdered end a -> Bool
> :: ByteOrdered end a -> ByteOrdered end a -> Bool
$c>= :: forall (end :: ByteOrder) a.
Ord a =>
ByteOrdered end a -> ByteOrdered end a -> Bool
>= :: ByteOrdered end a -> ByteOrdered end a -> Bool
$cmax :: forall (end :: ByteOrder) a.
Ord a =>
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
max :: ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
$cmin :: forall (end :: ByteOrder) a.
Ord a =>
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
min :: ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
Ord, ByteOrdered end a -> ByteOrdered end a -> Bool
(ByteOrdered end a -> ByteOrdered end a -> Bool)
-> (ByteOrdered end a -> ByteOrdered end a -> Bool)
-> Eq (ByteOrdered end a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (end :: ByteOrder) a.
Eq a =>
ByteOrdered end a -> ByteOrdered end a -> Bool
$c== :: forall (end :: ByteOrder) a.
Eq a =>
ByteOrdered end a -> ByteOrdered end a -> Bool
== :: ByteOrdered end a -> ByteOrdered end a -> Bool
$c/= :: forall (end :: ByteOrder) a.
Eq a =>
ByteOrdered end a -> ByteOrdered end a -> Bool
/= :: ByteOrdered end a -> ByteOrdered end a -> Bool
Eq, Int -> ByteOrdered end a -> ShowS
[ByteOrdered end a] -> ShowS
ByteOrdered end a -> String
(Int -> ByteOrdered end a -> ShowS)
-> (ByteOrdered end a -> String)
-> ([ByteOrdered end a] -> ShowS)
-> Show (ByteOrdered end a)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (end :: ByteOrder) a.
Show a =>
Int -> ByteOrdered end a -> ShowS
forall (end :: ByteOrder) a. Show a => [ByteOrdered end a] -> ShowS
forall (end :: ByteOrder) a. Show a => ByteOrdered end a -> String
$cshowsPrec :: forall (end :: ByteOrder) a.
Show a =>
Int -> ByteOrdered end a -> ShowS
showsPrec :: Int -> ByteOrdered end a -> ShowS
$cshow :: forall (end :: ByteOrder) a. Show a => ByteOrdered end a -> String
show :: ByteOrdered end a -> String
$cshowList :: forall (end :: ByteOrder) a. Show a => [ByteOrdered end a] -> ShowS
showList :: [ByteOrdered end a] -> ShowS
Show, Integer -> ByteOrdered end a
ByteOrdered end a -> ByteOrdered end a
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
(ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a)
-> (ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a)
-> (ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a)
-> (ByteOrdered end a -> ByteOrdered end a)
-> (ByteOrdered end a -> ByteOrdered end a)
-> (ByteOrdered end a -> ByteOrdered end a)
-> (Integer -> ByteOrdered end a)
-> Num (ByteOrdered end a)
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
forall (end :: ByteOrder) a. Num a => Integer -> ByteOrdered end a
forall (end :: ByteOrder) a.
Num a =>
ByteOrdered end a -> ByteOrdered end a
forall (end :: ByteOrder) a.
Num a =>
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
$c+ :: forall (end :: ByteOrder) a.
Num a =>
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
+ :: ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
$c- :: forall (end :: ByteOrder) a.
Num a =>
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
- :: ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
$c* :: forall (end :: ByteOrder) a.
Num a =>
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
* :: ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
$cnegate :: forall (end :: ByteOrder) a.
Num a =>
ByteOrdered end a -> ByteOrdered end a
negate :: ByteOrdered end a -> ByteOrdered end a
$cabs :: forall (end :: ByteOrder) a.
Num a =>
ByteOrdered end a -> ByteOrdered end a
abs :: ByteOrdered end a -> ByteOrdered end a
$csignum :: forall (end :: ByteOrder) a.
Num a =>
ByteOrdered end a -> ByteOrdered end a
signum :: ByteOrdered end a -> ByteOrdered end a
$cfromInteger :: forall (end :: ByteOrder) a. Num a => Integer -> ByteOrdered end a
fromInteger :: Integer -> ByteOrdered end a
Num, Num (ByteOrdered end a)
Ord (ByteOrdered end a)
(Num (ByteOrdered end a), Ord (ByteOrdered end a)) =>
(ByteOrdered end a -> Rational) -> Real (ByteOrdered end a)
ByteOrdered end a -> Rational
forall a. (Num a, Ord a) => (a -> Rational) -> Real a
forall (end :: ByteOrder) a. Real a => Num (ByteOrdered end a)
forall (end :: ByteOrder) a. Real a => Ord (ByteOrdered end a)
forall (end :: ByteOrder) a.
Real a =>
ByteOrdered end a -> Rational
$ctoRational :: forall (end :: ByteOrder) a.
Real a =>
ByteOrdered end a -> Rational
toRational :: ByteOrdered end a -> Rational
Real, Int -> ByteOrdered end a
ByteOrdered end a -> Int
ByteOrdered end a -> [ByteOrdered end a]
ByteOrdered end a -> ByteOrdered end a
ByteOrdered end a -> ByteOrdered end a -> [ByteOrdered end a]
ByteOrdered end a
-> ByteOrdered end a -> ByteOrdered end a -> [ByteOrdered end a]
(ByteOrdered end a -> ByteOrdered end a)
-> (ByteOrdered end a -> ByteOrdered end a)
-> (Int -> ByteOrdered end a)
-> (ByteOrdered end a -> Int)
-> (ByteOrdered end a -> [ByteOrdered end a])
-> (ByteOrdered end a -> ByteOrdered end a -> [ByteOrdered end a])
-> (ByteOrdered end a -> ByteOrdered end a -> [ByteOrdered end a])
-> (ByteOrdered end a
    -> ByteOrdered end a -> ByteOrdered end a -> [ByteOrdered end a])
-> Enum (ByteOrdered end a)
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
forall (end :: ByteOrder) a. Enum a => Int -> ByteOrdered end a
forall (end :: ByteOrder) a. Enum a => ByteOrdered end a -> Int
forall (end :: ByteOrder) a.
Enum a =>
ByteOrdered end a -> [ByteOrdered end a]
forall (end :: ByteOrder) a.
Enum a =>
ByteOrdered end a -> ByteOrdered end a
forall (end :: ByteOrder) a.
Enum a =>
ByteOrdered end a -> ByteOrdered end a -> [ByteOrdered end a]
forall (end :: ByteOrder) a.
Enum a =>
ByteOrdered end a
-> ByteOrdered end a -> ByteOrdered end a -> [ByteOrdered end a]
$csucc :: forall (end :: ByteOrder) a.
Enum a =>
ByteOrdered end a -> ByteOrdered end a
succ :: ByteOrdered end a -> ByteOrdered end a
$cpred :: forall (end :: ByteOrder) a.
Enum a =>
ByteOrdered end a -> ByteOrdered end a
pred :: ByteOrdered end a -> ByteOrdered end a
$ctoEnum :: forall (end :: ByteOrder) a. Enum a => Int -> ByteOrdered end a
toEnum :: Int -> ByteOrdered end a
$cfromEnum :: forall (end :: ByteOrder) a. Enum a => ByteOrdered end a -> Int
fromEnum :: ByteOrdered end a -> Int
$cenumFrom :: forall (end :: ByteOrder) a.
Enum a =>
ByteOrdered end a -> [ByteOrdered end a]
enumFrom :: ByteOrdered end a -> [ByteOrdered end a]
$cenumFromThen :: forall (end :: ByteOrder) a.
Enum a =>
ByteOrdered end a -> ByteOrdered end a -> [ByteOrdered end a]
enumFromThen :: ByteOrdered end a -> ByteOrdered end a -> [ByteOrdered end a]
$cenumFromTo :: forall (end :: ByteOrder) a.
Enum a =>
ByteOrdered end a -> ByteOrdered end a -> [ByteOrdered end a]
enumFromTo :: ByteOrdered end a -> ByteOrdered end a -> [ByteOrdered end a]
$cenumFromThenTo :: forall (end :: ByteOrder) a.
Enum a =>
ByteOrdered end a
-> ByteOrdered end a -> ByteOrdered end a -> [ByteOrdered end a]
enumFromThenTo :: ByteOrdered end a
-> ByteOrdered end a -> ByteOrdered end a -> [ByteOrdered end a]
Enum, Enum (ByteOrdered end a)
Real (ByteOrdered end a)
(Real (ByteOrdered end a), Enum (ByteOrdered end a)) =>
(ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a)
-> (ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a)
-> (ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a)
-> (ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a)
-> (ByteOrdered end a
    -> ByteOrdered end a -> (ByteOrdered end a, ByteOrdered end a))
-> (ByteOrdered end a
    -> ByteOrdered end a -> (ByteOrdered end a, ByteOrdered end a))
-> (ByteOrdered end a -> Integer)
-> Integral (ByteOrdered end a)
ByteOrdered end a -> Integer
ByteOrdered end a
-> ByteOrdered end a -> (ByteOrdered end a, ByteOrdered end a)
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
forall a.
(Real a, Enum a) =>
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
forall (end :: ByteOrder) a. Integral a => Enum (ByteOrdered end a)
forall (end :: ByteOrder) a. Integral a => Real (ByteOrdered end a)
forall (end :: ByteOrder) a.
Integral a =>
ByteOrdered end a -> Integer
forall (end :: ByteOrder) a.
Integral a =>
ByteOrdered end a
-> ByteOrdered end a -> (ByteOrdered end a, ByteOrdered end a)
forall (end :: ByteOrder) a.
Integral a =>
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
$cquot :: forall (end :: ByteOrder) a.
Integral a =>
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
quot :: ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
$crem :: forall (end :: ByteOrder) a.
Integral a =>
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
rem :: ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
$cdiv :: forall (end :: ByteOrder) a.
Integral a =>
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
div :: ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
$cmod :: forall (end :: ByteOrder) a.
Integral a =>
ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
mod :: ByteOrdered end a -> ByteOrdered end a -> ByteOrdered end a
$cquotRem :: forall (end :: ByteOrder) a.
Integral a =>
ByteOrdered end a
-> ByteOrdered end a -> (ByteOrdered end a, ByteOrdered end a)
quotRem :: ByteOrdered end a
-> ByteOrdered end a -> (ByteOrdered end a, ByteOrdered end a)
$cdivMod :: forall (end :: ByteOrder) a.
Integral a =>
ByteOrdered end a
-> ByteOrdered end a -> (ByteOrdered end a, ByteOrdered end a)
divMod :: ByteOrdered end a
-> ByteOrdered end a -> (ByteOrdered end a, ByteOrdered end a)
$ctoInteger :: forall (end :: ByteOrder) a.
Integral a =>
ByteOrdered end a -> Integer
toInteger :: ByteOrdered end a -> Integer
Integral) via a

-- | Newtype for easier instance derivation.
newtype PrimByteSwapped a = PrimByteSwapped { forall a. PrimByteSwapped a -> a
unPrimByteSwapped :: a }

-- | Prim instance where we byte swap at accesses.
instance (Prim a, ByteSwap a) => Prim (PrimByteSwapped a) where
    sizeOf# :: PrimByteSwapped a -> Int#
sizeOf# (PrimByteSwapped a
a) = a -> Int#
forall a. Prim a => a -> Int#
sizeOf# a
a
    alignment# :: PrimByteSwapped a -> Int#
alignment# (PrimByteSwapped a
a) = a -> Int#
forall a. Prim a => a -> Int#
alignment# a
a
    indexByteArray# :: ByteArray# -> Int# -> PrimByteSwapped a
indexByteArray# ByteArray#
arr# Int#
i# =
        a -> PrimByteSwapped a
forall a. a -> PrimByteSwapped a
PrimByteSwapped (a -> a
forall a. ByteSwap a => a -> a
byteSwap (ByteArray# -> Int# -> a
forall a. Prim a => ByteArray# -> Int# -> a
indexByteArray# ByteArray#
arr# Int#
i#))
    readByteArray# :: forall s.
MutableByteArray# s
-> Int# -> State# s -> (# State# s, PrimByteSwapped a #)
readByteArray# MutableByteArray# s
arr# Int#
i# = \State# s
s0 ->
        case MutableByteArray# s -> Int# -> State# s -> (# State# s, a #)
forall s.
MutableByteArray# s -> Int# -> State# s -> (# State# s, a #)
forall a s.
Prim a =>
MutableByteArray# s -> Int# -> State# s -> (# State# s, a #)
readByteArray# MutableByteArray# s
arr# Int#
i# State# s
s0 of
          (# State# s
s1, a
a #) -> (# State# s
s1, a -> PrimByteSwapped a
forall a. a -> PrimByteSwapped a
PrimByteSwapped (a -> a
forall a. ByteSwap a => a -> a
byteSwap a
a) #)
    writeByteArray# :: forall s.
MutableByteArray# s
-> Int# -> PrimByteSwapped a -> State# s -> State# s
writeByteArray# MutableByteArray# s
arr# Int#
i# (PrimByteSwapped a
a) = \State# s
s0 ->
        MutableByteArray# s -> Int# -> a -> State# s -> State# s
forall s. MutableByteArray# s -> Int# -> a -> State# s -> State# s
forall a s.
Prim a =>
MutableByteArray# s -> Int# -> a -> State# s -> State# s
writeByteArray# MutableByteArray# s
arr# Int#
i# (a -> a
forall a. ByteSwap a => a -> a
byteSwap a
a) State# s
s0
    setByteArray# :: forall s.
MutableByteArray# s
-> Int# -> Int# -> PrimByteSwapped a -> State# s -> State# s
setByteArray# MutableByteArray# s
arr# Int#
i# Int#
len# (PrimByteSwapped a
a) = \State# s
s0 ->
        MutableByteArray# s -> Int# -> Int# -> a -> State# s -> State# s
forall s.
MutableByteArray# s -> Int# -> Int# -> a -> State# s -> State# s
forall a s.
Prim a =>
MutableByteArray# s -> Int# -> Int# -> a -> State# s -> State# s
setByteArray# MutableByteArray# s
arr# Int#
i# Int#
len# (a -> a
forall a. ByteSwap a => a -> a
byteSwap a
a) State# s
s0
    indexOffAddr# :: Addr# -> Int# -> PrimByteSwapped a
indexOffAddr# Addr#
addr# Int#
i# =
        a -> PrimByteSwapped a
forall a. a -> PrimByteSwapped a
PrimByteSwapped (a -> a
forall a. ByteSwap a => a -> a
byteSwap (Addr# -> Int# -> a
forall a. Prim a => Addr# -> Int# -> a
indexOffAddr# Addr#
addr# Int#
i#))
    readOffAddr# :: forall s.
Addr# -> Int# -> State# s -> (# State# s, PrimByteSwapped a #)
readOffAddr# Addr#
addr# Int#
i# = \State# s
s0 ->
        case Addr# -> Int# -> State# s -> (# State# s, a #)
forall s. Addr# -> Int# -> State# s -> (# State# s, a #)
forall a s.
Prim a =>
Addr# -> Int# -> State# s -> (# State# s, a #)
readOffAddr# Addr#
addr# Int#
i# State# s
s0 of
          (# State# s
s1, a
a #) -> (# State# s
s1, a -> PrimByteSwapped a
forall a. a -> PrimByteSwapped a
PrimByteSwapped (a -> a
forall a. ByteSwap a => a -> a
byteSwap a
a) #)
    writeOffAddr# :: forall s.
Addr# -> Int# -> PrimByteSwapped a -> State# s -> State# s
writeOffAddr# Addr#
addr# Int#
i# (PrimByteSwapped a
a) = \State# s
s0 ->
        Addr# -> Int# -> a -> State# s -> State# s
forall s. Addr# -> Int# -> a -> State# s -> State# s
forall a s. Prim a => Addr# -> Int# -> a -> State# s -> State# s
writeOffAddr# Addr#
addr# Int#
i# (a -> a
forall a. ByteSwap a => a -> a
byteSwap a
a) State# s
s0
    setOffAddr# :: forall s.
Addr# -> Int# -> Int# -> PrimByteSwapped a -> State# s -> State# s
setOffAddr# Addr#
arr# Int#
i# Int#
len# (PrimByteSwapped a
a) = \State# s
s0 ->
        Addr# -> Int# -> Int# -> a -> State# s -> State# s
forall s. Addr# -> Int# -> Int# -> a -> State# s -> State# s
forall a s.
Prim a =>
Addr# -> Int# -> Int# -> a -> State# s -> State# s
setOffAddr# Addr#
arr# Int#
i# Int#
len# (a -> a
forall a. ByteSwap a => a -> a
byteSwap a
a) State# s
s0

instance (Prim' a, ByteSwap a) => Prim' (PrimByteSwapped a) where
    type SizeOf (PrimByteSwapped a) = SizeOf a
    indexWord8ByteArrayAs# :: ByteArray# -> Int# -> PrimByteSwapped a
indexWord8ByteArrayAs# ByteArray#
arr# Int#
os# =
        a -> PrimByteSwapped a
forall a. a -> PrimByteSwapped a
PrimByteSwapped (a -> a
forall a. ByteSwap a => a -> a
byteSwap (ByteArray# -> Int# -> a
forall a. Prim' a => ByteArray# -> Int# -> a
indexWord8ByteArrayAs# ByteArray#
arr# Int#
os#))
    readWord8ByteArrayAs# :: forall s.
MutableByteArray# s
-> Int# -> State# s -> (# State# s, PrimByteSwapped a #)
readWord8ByteArrayAs# MutableByteArray# s
arr# Int#
os# = \State# s
s0 ->
        case MutableByteArray# s -> Int# -> State# s -> (# State# s, a #)
forall s.
MutableByteArray# s -> Int# -> State# s -> (# State# s, a #)
forall a s.
Prim' a =>
MutableByteArray# s -> Int# -> State# s -> (# State# s, a #)
readWord8ByteArrayAs# MutableByteArray# s
arr# Int#
os# State# s
s0 of
          (# State# s
s1, a
a #) -> (# State# s
s1, a -> PrimByteSwapped a
forall a. a -> PrimByteSwapped a
PrimByteSwapped (a -> a
forall a. ByteSwap a => a -> a
byteSwap a
a) #)
    writeWord8ByteArrayAs# :: forall s.
MutableByteArray# s
-> Int# -> PrimByteSwapped a -> State# s -> State# s
writeWord8ByteArrayAs# MutableByteArray# s
arr# Int#
os# (PrimByteSwapped a
a) = \State# s
s0 ->
        MutableByteArray# s -> Int# -> a -> State# s -> State# s
forall s. MutableByteArray# s -> Int# -> a -> State# s -> State# s
forall a s.
Prim' a =>
MutableByteArray# s -> Int# -> a -> State# s -> State# s
writeWord8ByteArrayAs# MutableByteArray# s
arr# Int#
os# (a -> a
forall a. ByteSwap a => a -> a
byteSwap a
a) State# s
s0
    indexWord8OffAddrAs# :: Addr# -> Int# -> PrimByteSwapped a
indexWord8OffAddrAs# Addr#
addr# Int#
os# =
        a -> PrimByteSwapped a
forall a. a -> PrimByteSwapped a
PrimByteSwapped (a -> a
forall a. ByteSwap a => a -> a
byteSwap (Addr# -> Int# -> a
forall a. Prim' a => Addr# -> Int# -> a
indexWord8OffAddrAs# Addr#
addr# Int#
os#))
    readWord8OffAddrAs# :: forall s.
Addr# -> Int# -> State# s -> (# State# s, PrimByteSwapped a #)
readWord8OffAddrAs# Addr#
addr# Int#
os# = \State# s
s0 ->
        case Addr# -> Int# -> State# s -> (# State# s, a #)
forall s. Addr# -> Int# -> State# s -> (# State# s, a #)
forall a s.
Prim' a =>
Addr# -> Int# -> State# s -> (# State# s, a #)
readWord8OffAddrAs# Addr#
addr# Int#
os# State# s
s0 of
          (# State# s
s1, a
a #) -> (# State# s
s1, a -> PrimByteSwapped a
forall a. a -> PrimByteSwapped a
PrimByteSwapped (a -> a
forall a. ByteSwap a => a -> a
byteSwap a
a) #)
    writeWord8OffAddrAs# :: forall s.
Addr# -> Int# -> PrimByteSwapped a -> State# s -> State# s
writeWord8OffAddrAs# Addr#
addr# Int#
os# (PrimByteSwapped a
a) = \State# s
s0 ->
        Addr# -> Int# -> a -> State# s -> State# s
forall s. Addr# -> Int# -> a -> State# s -> State# s
forall a s. Prim' a => Addr# -> Int# -> a -> State# s -> State# s
writeWord8OffAddrAs# Addr#
addr# Int#
os# (a -> a
forall a. ByteSwap a => a -> a
byteSwap a
a) State# s
s0

-- idk why I gotta (a :: Type) why is GHC going kind-polymorphic there lol
#if defined(WORDS_BIGENDIAN)
deriving via (PrimByteSwapped a) instance
    (Prim  a, ByteSwap a) => Prim  (ByteOrdered 'LittleEndian a)
deriving via (PrimByteSwapped a) instance
    (Prim' a, ByteSwap a) => Prim' (ByteOrdered 'LittleEndian a)
deriving via (a :: Type) instance
    Prim  a => Prim  (ByteOrdered 'BigEndian a)
deriving via (a :: Type) instance
    Prim' a => Prim' (ByteOrdered 'BigEndian a)
#else
deriving via (a :: Type) instance
    Prim  a => Prim  (ByteOrdered 'LittleEndian a)
deriving via (a :: Type) instance
    Prim' a => Prim' (ByteOrdered 'LittleEndian a)
deriving via (PrimByteSwapped a) instance
    (Prim  a, ByteSwap a) => Prim  (ByteOrdered 'BigEndian a)
deriving via (PrimByteSwapped a) instance
    (Prim' a, ByteSwap a) => Prim' (ByteOrdered 'BigEndian a)
#endif