module Data.Internal.Wkt.GeometryCollection
  ( geometryCollection
  , emptyGeometryCollection
  ) where

import           Control.Applicative       ((<|>))
import qualified Data.Geospatial           as Geospatial
import qualified Data.Sequence             as Sequence
import qualified Text.Trifecta             as Trifecta

import qualified Data.Internal.Wkt.Common  as Wkt
import qualified Data.Internal.Wkt.Line    as Line
import qualified Data.Internal.Wkt.Point   as Point
import qualified Data.Internal.Wkt.Polygon as Polygon

geometryCollection :: Trifecta.Parser (Sequence.Seq Geospatial.GeospatialGeometry)
geometryCollection :: Parser (Seq GeospatialGeometry)
geometryCollection = do
  String
_ <- String -> Parser String
forall (m :: * -> *). CharParsing m => String -> m String
Trifecta.string String
"geometrycollection"
  ()
_ <- Parser ()
forall (m :: * -> *). CharParsing m => m ()
Trifecta.spaces
  Parser (Seq GeospatialGeometry)
forall a. Parser (Seq a)
Wkt.emptySet Parser (Seq GeospatialGeometry)
-> Parser (Seq GeospatialGeometry)
-> Parser (Seq GeospatialGeometry)
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser (Seq GeospatialGeometry)
bracketedAll

bracketedAll :: Trifecta.Parser (Sequence.Seq Geospatial.GeospatialGeometry)
bracketedAll :: Parser (Seq GeospatialGeometry)
bracketedAll = do
  ()
_ <- Char -> Parser Char
forall (m :: * -> *). CharParsing m => Char -> m Char
Trifecta.char Char
'(' Parser Char -> Parser () -> Parser ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
forall (m :: * -> *). CharParsing m => m ()
Trifecta.spaces
  Seq GeospatialGeometry
x <- Parser (Seq GeospatialGeometry)
parseAll
  Char
_ <- Parser ()
forall (m :: * -> *). CharParsing m => m ()
Trifecta.spaces Parser () -> Parser Char -> Parser Char
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Parser Char
forall (m :: * -> *). CharParsing m => Char -> m Char
Trifecta.char Char
')'
  Seq GeospatialGeometry -> Parser (Seq GeospatialGeometry)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Seq GeospatialGeometry
x

parseAll :: Trifecta.Parser (Sequence.Seq Geospatial.GeospatialGeometry)
parseAll :: Parser (Seq GeospatialGeometry)
parseAll = do
  let
    single :: Parser GeospatialGeometry
single = GeoPoint -> GeospatialGeometry
Geospatial.Point (GeoPoint -> GeospatialGeometry)
-> Parser GeoPoint -> Parser GeospatialGeometry
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser GeoPoint
Point.point Parser GeospatialGeometry
-> Parser GeospatialGeometry -> Parser GeospatialGeometry
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> GeoLine -> GeospatialGeometry
Geospatial.Line (GeoLine -> GeospatialGeometry)
-> Parser GeoLine -> Parser GeospatialGeometry
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser GeoLine
Line.lineString Parser GeospatialGeometry
-> Parser GeospatialGeometry -> Parser GeospatialGeometry
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> GeoPolygon -> GeospatialGeometry
Geospatial.Polygon (GeoPolygon -> GeospatialGeometry)
-> Parser GeoPolygon -> Parser GeospatialGeometry
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser GeoPolygon
Polygon.polygon
    multi :: Parser GeospatialGeometry
multi = GeoMultiPoint -> GeospatialGeometry
Geospatial.MultiPoint (GeoMultiPoint -> GeospatialGeometry)
-> Parser GeoMultiPoint -> Parser GeospatialGeometry
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser GeoMultiPoint
Point.multiPoint Parser GeospatialGeometry
-> Parser GeospatialGeometry -> Parser GeospatialGeometry
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> GeoMultiLine -> GeospatialGeometry
Geospatial.MultiLine (GeoMultiLine -> GeospatialGeometry)
-> Parser GeoMultiLine -> Parser GeospatialGeometry
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser GeoMultiLine
Line.multiLineString Parser GeospatialGeometry
-> Parser GeospatialGeometry -> Parser GeospatialGeometry
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> GeoMultiPolygon -> GeospatialGeometry
Geospatial.MultiPolygon (GeoMultiPolygon -> GeospatialGeometry)
-> Parser GeoMultiPolygon -> Parser GeospatialGeometry
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser GeoMultiPolygon
Polygon.multiPolygon
  GeospatialGeometry
x <- Parser GeospatialGeometry
single Parser GeospatialGeometry
-> Parser GeospatialGeometry -> Parser GeospatialGeometry
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser GeospatialGeometry
multi
  [GeospatialGeometry]
xs <- Parser GeospatialGeometry -> Parser [GeospatialGeometry]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
Trifecta.many (Char -> Parser Char
forall (m :: * -> *). CharParsing m => Char -> m Char
Trifecta.char Char
',' Parser Char -> Parser () -> Parser ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser ()
forall (m :: * -> *). CharParsing m => m ()
Trifecta.spaces Parser () -> Parser GeospatialGeometry -> Parser GeospatialGeometry
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (Parser GeospatialGeometry
single Parser GeospatialGeometry
-> Parser GeospatialGeometry -> Parser GeospatialGeometry
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser GeospatialGeometry
multi))
  Seq GeospatialGeometry -> Parser (Seq GeospatialGeometry)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Seq GeospatialGeometry -> Parser (Seq GeospatialGeometry))
-> Seq GeospatialGeometry -> Parser (Seq GeospatialGeometry)
forall a b. (a -> b) -> a -> b
$  GeospatialGeometry
x GeospatialGeometry
-> Seq GeospatialGeometry -> Seq GeospatialGeometry
forall a. a -> Seq a -> Seq a
Sequence.:<| [GeospatialGeometry] -> Seq GeospatialGeometry
forall a. [a] -> Seq a
Sequence.fromList [GeospatialGeometry]
xs

emptyGeometryCollection :: Sequence.Seq Geospatial.GeospatialGeometry
emptyGeometryCollection :: Seq GeospatialGeometry
emptyGeometryCollection = Seq GeospatialGeometry
forall a. Seq a
Sequence.empty