module Data.Internal.Wkb.Endian
  ( EndianType (..)
  , endianType
  , fourBytes
  , doubleBytes
  ) where

import qualified Control.Monad   as Monad
import qualified Data.Binary.Get as BinaryGet
import qualified Data.Word       as Word

data EndianType = LittleEndian | BigEndian deriving (Show, Eq)

endianType :: BinaryGet.Get EndianType
endianType = do
  byte <- BinaryGet.getWord8
  case byte of
    0 ->
      pure BigEndian
    1 ->
      pure LittleEndian
    _ ->
      Monad.fail "Invalid EndianType"

fourBytes :: EndianType -> BinaryGet.Get Word.Word32
fourBytes et =
  case et of
    LittleEndian ->
      BinaryGet.getWord32le
    BigEndian ->
      BinaryGet.getWord32be

doubleBytes :: EndianType -> BinaryGet.Get Double
doubleBytes et =
  case et of
    LittleEndian ->
      BinaryGet.getDoublele
    BigEndian ->
      BinaryGet.getDoublebe