{-# LANGUAGE UnicodeSyntax, CPP #-}

module Data.Endian (
    EndianSensitive(),
    BigEndian(),
    LittleEndian(),
    toBigEndian,
    fromBigEndian,
    toLittleEndian,
    fromLittleEndian
  ) where

import Data.Endian.Internal
import Data.Endian.Wrap

#include <HsBaseConfig.h>

-- | Convert from the native format to big-endian
toBigEndian       EndianSensitive α  α  BigEndian α
-- | Convert from big-endian to the native format
fromBigEndian     EndianSensitive α  BigEndian α  α
-- | Convert from the native format to little-endian
toLittleEndian    EndianSensitive α  α  LittleEndian α
-- | Convert from little-endian to the native format
fromLittleEndian  EndianSensitive α  LittleEndian α  α

beHelp  EndianSensitive α  α  α
leHelp  EndianSensitive α  α  α

#ifdef WORDS_BIGENDIAN
beHelp = id
leHelp = swapEndian
#else
beHelp = swapEndian
leHelp = id
#endif

toBigEndian    = BE . beHelp
toLittleEndian = LE . leHelp
fromBigEndian    (BE a) = beHelp a
fromLittleEndian (LE a) = leHelp a

{-# INLINE toBigEndian #-}
{-# INLINE fromBigEndian #-}
{-# INLINE toLittleEndian #-}
{-# INLINE fromLittleEndian #-}