wkt-geom-0.0.1: src/Data/Internal/Wkt/Line.hs
module Data.Internal.Wkt.Line
( line
, lineString
, multiLineString
, emptyLine
, emptyMultiLine
, commandPoint
) where
import Control.Applicative ((<|>))
import qualified Data.Geospatial as Geospatial
import qualified Data.LineString as LineString
import qualified Data.Vector as Vector
import qualified Data.Vector.Storable as VectorStorable
import qualified Text.Trifecta as Trifecta
import qualified Data.Internal.Wkt.Common as Wkt
import qualified Data.Internal.Wkt.Point as Point
lineString :: Trifecta.Parser Geospatial.GeoLine
lineString = do
_ <- Trifecta.string "linestring"
_ <- Trifecta.spaces
(Trifecta.string "empty" >> pure emptyLine) <|> Geospatial.GeoLine <$> line
multiLineString :: Trifecta.Parser Geospatial.GeoMultiLine
multiLineString = do
_ <- Trifecta.string "multilinestring"
_ <- Trifecta.spaces
x <- Wkt.emptySet <|> manyLines
pure $ Geospatial.GeoMultiLine x
manyLines :: Trifecta.Parser (Vector.Vector (LineString.LineString Geospatial.GeoPositionWithoutCRS))
manyLines = do
_ <- Trifecta.spaces >> Trifecta.char '('
x <- line
xs <- Trifecta.many (Trifecta.char ',' >> Trifecta.spaces >> line)
_ <- Trifecta.char ')' >> Trifecta.spaces
pure $ Vector.cons x (Vector.fromList xs)
line :: Trifecta.Parser (LineString.LineString Geospatial.GeoPositionWithoutCRS)
line = do
_ <- Trifecta.spaces >> Trifecta.char '(' >> Trifecta.spaces
first <- Point.justPoints
second <- commandPoint
rest <- Trifecta.many commandPoint
_ <- Trifecta.char ')' >> Trifecta.spaces
pure $ LineString.makeLineString first second (VectorStorable.fromList rest)
commandPoint :: Trifecta.Parser Geospatial.GeoPositionWithoutCRS
commandPoint = do
_ <- Trifecta.char ','
_ <- Trifecta.spaces
Point.justPoints
emptyLine :: Geospatial.GeoLine
emptyLine = Geospatial.GeoLine $ LineString.makeLineString Geospatial.GeoEmpty Geospatial.GeoEmpty VectorStorable.empty
emptyMultiLine :: Geospatial.GeoMultiLine
emptyMultiLine = Geospatial.mergeGeoLines Vector.empty