-- | Missing @byteSwap@ functions for signed integers.
--
-- We have them for unsigned integers, but not for signed.
-- They should probably be provided, so I'm considering this a compatibility
-- module for the future when we have them.

module Raehik.Compat.Data.Int.ByteSwap where

import GHC.Exts
import GHC.Int

byteSwapI16 :: Int16 -> Int16
byteSwapI16 :: Int16 -> Int16
byteSwapI16 (I16# Int16#
i#) = Int16# -> Int16
I16# (Word16# -> Int16#
word16ToInt16# (Word# -> Word16#
wordToWord16# (Word# -> Word#
byteSwap16# (Word16# -> Word#
word16ToWord# (Int16# -> Word16#
int16ToWord16# Int16#
i#)))))
{-# INLINE byteSwapI16 #-}

byteSwapI32 :: Int32 -> Int32
byteSwapI32 :: Int32 -> Int32
byteSwapI32 (I32# Int32#
i#) = Int32# -> Int32
I32# (Word32# -> Int32#
word32ToInt32# (Word# -> Word32#
wordToWord32# (Word# -> Word#
byteSwap32# (Word32# -> Word#
word32ToWord# (Int32# -> Word32#
int32ToWord32# Int32#
i#)))))
{-# INLINE byteSwapI32 #-}

byteSwapI64 :: Int64 -> Int64
byteSwapI64 :: Int64 -> Int64
byteSwapI64 (I64# Int64#
i#) = Int64# -> Int64
I64# (Word64# -> Int64#
word64ToInt64# (Word64# -> Word64#
byteSwap64# (Int64# -> Word64#
int64ToWord64# Int64#
i#)))
{-# INLINE byteSwapI64 #-}

byteSwapI :: Int -> Int
byteSwapI :: Int -> Int
byteSwapI (I# Int#
i#) = Int# -> Int
I# (Word# -> Int#
word2Int# (Word# -> Word#
byteSwap# (Int# -> Word#
int2Word# Int#
i#)))
{-# INLINE byteSwapI #-}