wkt-geom-0.0.5: src/Data/Internal/Wkb/Endian.hs
module Data.Internal.Wkb.Endian
( EndianType (..)
, getEndianType
, getFourBytes
, getDouble
, builderEndianType
, builderFourBytes
, builderDouble
) where
import qualified Control.Monad as Monad
import qualified Data.Binary.Get as BinaryGet
import qualified Data.ByteString.Builder as ByteStringBuilder
import qualified Data.Word as Word
data EndianType = LittleEndian | BigEndian deriving (Show, Eq)
getEndianType :: BinaryGet.Get EndianType
getEndianType = do
byte <- BinaryGet.getWord8
case byte of
0 ->
pure BigEndian
1 ->
pure LittleEndian
_ ->
Monad.fail "Invalid EndianType"
getFourBytes :: EndianType -> BinaryGet.Get Word.Word32
getFourBytes endianType =
case endianType of
LittleEndian ->
BinaryGet.getWord32le
BigEndian ->
BinaryGet.getWord32be
getDouble :: EndianType -> BinaryGet.Get Double
getDouble endianType =
case endianType of
LittleEndian ->
BinaryGet.getDoublele
BigEndian ->
BinaryGet.getDoublebe
builderEndianType :: EndianType -> ByteStringBuilder.Builder
builderEndianType BigEndian = ByteStringBuilder.word8 0
builderEndianType LittleEndian = ByteStringBuilder.word8 1
builderFourBytes :: EndianType -> Word.Word32 -> ByteStringBuilder.Builder
builderFourBytes endianType =
case endianType of
LittleEndian ->
ByteStringBuilder.word32LE
BigEndian ->
ByteStringBuilder.word32BE
builderDouble :: EndianType -> Double -> ByteStringBuilder.Builder
builderDouble endianType =
case endianType of
LittleEndian ->
ByteStringBuilder.doubleLE
BigEndian ->
ByteStringBuilder.doubleBE