module MachDeps (littleEndian) where
import Language.Haskell.TH.Syntax(Lift(..))
import Foreign.Marshal.Alloc
import Foreign.Storable
import Foreign.Ptr
import System.IO.Unsafe (unsafePerformIO)
import Data.Word
littleEndian :: Bool
littleEndian =
$(
let cst :: Word32
cst = 0x01020304
check :: [Word8] -> Bool
check x
| x == [1,2,3,4] = False
| x == [4,3,2,1] = True
| otherwise = error $ "Very interesting endianness! "
++"(unfortunately we don't support it yet)"
in lift $ unsafePerformIO $ alloca $ \p -> do
poke p cst
let wd8Ptrs = map (castPtr p `plusPtr`) [0..3]
mapM peek wd8Ptrs >>= return . check
)