{-# LANGUAGE CPP #-}

-- | Why does this module exist? There is "GHC.ByteOrder" in base.
-- But that module is /broken/ until base-4.14/ghc-8.10, so we
-- can't rely on it until we drop support for older ghcs.
-- See https://gitlab.haskell.org/ghc/ghc/-/issues/20338
-- and https://gitlab.haskell.org/ghc/ghc/-/issues/18445

#include "MachDeps.h"

module Data.ByteString.Utils.ByteOrder
  ( ByteOrder(..)
  , hostByteOrder
  , whenLittleEndian
  , whenBigEndian
  ) where

data ByteOrder
  = LittleEndian
  | BigEndian

hostByteOrder :: ByteOrder
hostByteOrder =
#ifdef WORDS_BIGENDIAN
  BigEndian
#else
  LittleEndian
#endif

-- | If the host is little-endian, applies the given function to the given arg.
-- If the host is big-endian, returns the second argument unchanged.
whenLittleEndian :: (a -> a) -> a -> a
whenLittleEndian fun val = case hostByteOrder of
  LittleEndian -> fun val
  BigEndian    -> val

-- | If the host is little-endian, returns the second argument unchanged.
-- If the host is big-endian, applies the given function to the given arg.
whenBigEndian :: (a -> a) -> a -> a
whenBigEndian fun val = case hostByteOrder of
  LittleEndian -> val
  BigEndian    -> fun val
