module Geometry.Shapefile.Internal where
import Control.Monad (replicateM)
import Data.Binary.Get
import Data.Binary.IEEE754 (getFloat64le)
import qualified Data.ByteString.Char8 as C
getInt8 :: Get Int
getInt8 = fromIntegral <$> getWord8
getIntBE :: Get Int
getIntBE = fromIntegral <$> getWord32be
getInt16BE :: Get Int
getInt16BE = fromIntegral <$> getWord16be
getIntLE :: Get Int
getIntLE = fromIntegral <$> getWord32le
getInt16LE :: Get Int
getInt16LE = fromIntegral <$> getWord16le
getString :: Int -> Get String
getString l = filter (/= '\NUL') . C.unpack <$> getByteString l
getCharVal :: Get Char
getCharVal = C.head <$> getByteString 1
type Point = (Double, Double)
getPoint :: Get Point
getPoint = (,) <$> getFloat64le <*> getFloat64le
steps :: Num a => [a] -> [a]
steps [] = []
steps [_] = []
steps (x1:x2:xs) = x2 - x1 : steps (x2:xs)
getPointList :: Int -> Get [Point]
getPointList numPoints = replicateM numPoints getPoint