{-# LANGUAGE MagicHash #-}

module HaskellWorks.Data.Branchless
  ( ltWord8
  , ltWord16
  , ltWord32
  , ltWord64

  , leWord8
  , leWord16
  , leWord32
  , leWord64

  , gtWord8
  , gtWord16
  , gtWord32
  , gtWord64

  , geWord8
  , geWord16
  , geWord32
  , geWord64
  ) where

import GHC.Int
import GHC.Prim
import GHC.Word (Word16 (..), Word32 (..), Word64 (..), Word8 (..))

ltWord8 :: Word8 -> Word8 -> Word8
ltWord8 (W8# a#) (W8# b#) = fromIntegral (I8# (ltWord# a# b#))
{-# INLINE ltWord8 #-}

ltWord16 :: Word16 -> Word16 -> Word16
ltWord16 (W16# a#) (W16# b#) = fromIntegral (I16# (ltWord# a# b#))
{-# INLINE ltWord16 #-}

ltWord32 :: Word32 -> Word32 -> Word32
ltWord32 (W32# a#) (W32# b#) = fromIntegral (I32# (ltWord# a# b#))
{-# INLINE ltWord32 #-}

ltWord64 :: Word64 -> Word64 -> Word64
ltWord64 (W64# a#) (W64# b#) = fromIntegral (I64# (ltWord# a# b#))
{-# INLINE ltWord64 #-}

leWord8 :: Word8 -> Word8 -> Word8
leWord8 (W8# a#) (W8# b#) = fromIntegral (I8# (leWord# a# b#))
{-# INLINE leWord8 #-}

leWord16 :: Word16 -> Word16 -> Word16
leWord16 (W16# a#) (W16# b#) = fromIntegral (I16# (leWord# a# b#))
{-# INLINE leWord16 #-}

leWord32 :: Word32 -> Word32 -> Word32
leWord32 (W32# a#) (W32# b#) = fromIntegral (I32# (leWord# a# b#))
{-# INLINE leWord32 #-}

leWord64 :: Word64 -> Word64 -> Word64
leWord64 (W64# a#) (W64# b#) = fromIntegral (I64# (leWord# a# b#))
{-# INLINE leWord64 #-}

gtWord8 :: Word8 -> Word8 -> Word8
gtWord8 (W8# a#) (W8# b#) = fromIntegral (I8# (gtWord# a# b#))
{-# INLINE gtWord8 #-}

gtWord16 :: Word16 -> Word16 -> Word16
gtWord16 (W16# a#) (W16# b#) = fromIntegral (I16# (gtWord# a# b#))
{-# INLINE gtWord16 #-}

gtWord32 :: Word32 -> Word32 -> Word32
gtWord32 (W32# a#) (W32# b#) = fromIntegral (I32# (gtWord# a# b#))
{-# INLINE gtWord32 #-}

gtWord64 :: Word64 -> Word64 -> Word64
gtWord64 (W64# a#) (W64# b#) = fromIntegral (I64# (gtWord# a# b#))
{-# INLINE gtWord64 #-}

geWord8 :: Word8 -> Word8 -> Word8
geWord8 (W8# a#) (W8# b#) = fromIntegral (I8# (geWord# a# b#))
{-# INLINE geWord8 #-}

geWord16 :: Word16 -> Word16 -> Word16
geWord16 (W16# a#) (W16# b#) = fromIntegral (I16# (geWord# a# b#))
{-# INLINE geWord16 #-}

geWord32 :: Word32 -> Word32 -> Word32
geWord32 (W32# a#) (W32# b#) = fromIntegral (I32# (geWord# a# b#))
{-# INLINE geWord32 #-}

geWord64 :: Word64 -> Word64 -> Word64
geWord64 (W64# a#) (W64# b#) = fromIntegral (I64# (geWord# a# b#))
{-# INLINE geWord64 #-}