{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleContexts #-}

module Database.Postgis.Trivial.Traversable.Geometry where

import GHC.Base hiding ( foldr )
import Control.Monad ( mapM_ )
import Control.Exception ( throw )
import Control.Applicative ( (<$>) )

import Database.Postgis.Trivial.PGISConst
import Database.Postgis.Trivial.Types
import Database.Postgis.Trivial.Internal
import Database.Postgis.Trivial.Cast


-- | Point geometry
data Point p = Point SRID p

instance Castable p => Geometry (Point p) where
    putGeometry :: Putter (Point p)
putGeometry (Point SRID
srid p
v) = do
        SRID -> Word32 -> (Bool, Bool) -> Put
putHeader SRID
srid Word32
pgisPoint (forall a. PointND a => (Bool, Bool)
dimProps @(Cast p))
        Putter (Cast p)
forall a. PointND a => Putter a
putPointND (p -> Cast p
forall p. Castable p => p -> Cast p
toPointND p
v::Cast p)
    getGeometry :: Get (Point p)
getGeometry = do
        Header
h <- Get Header
getHeaderPre
        (Cast p
v::Cast p, SRID
srid) <- if Header -> Word32
lookupType Header
hWord32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
==Word32
pgisPoint
            then Header -> HeaderGetter (Cast p) -> Get (Cast p, SRID)
forall a. Header -> HeaderGetter a -> Get (a, SRID)
makeResult Header
h (HeaderGetter ()
skipHeader HeaderGetter () -> HeaderGetter (Cast p) -> HeaderGetter (Cast p)
forall a b.
ReaderT Header Get a
-> ReaderT Header Get b -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> HeaderGetter (Cast p)
forall a. PointND a => HeaderGetter a
getPointND)
            else GeometryError -> Get (Cast p, SRID)
forall a e. Exception e => e -> a
throw (GeometryError -> Get (Cast p, SRID))
-> GeometryError -> Get (Cast p, SRID)
forall a b. (a -> b) -> a -> b
$
                String -> GeometryError
GeometryError String
"invalid data for point geometry"
        Point p -> Get (Point p)
forall a. a -> Get a
forall (m :: * -> *) a. Monad m => a -> m a
return (SRID -> p -> Point p
forall p. SRID -> p -> Point p
Point SRID
srid (Cast p -> p
forall p. Castable p => Cast p -> p
fromPointND Cast p
v::p))

-- | Linestring geometry
data LineString t p = LineString SRID (t p)

instance (GeoChain t, Trans t p) => Geometry (LineString t p) where
    putGeometry :: Putter (LineString t p)
putGeometry (LineString SRID
srid t p
vs) = do
        SRID -> Word32 -> (Bool, Bool) -> Put
putHeader SRID
srid Word32
pgisLinestring (forall a. PointND a => (Bool, Bool)
dimProps @(Cast p))
        Putter (t (Cast p))
forall a. PointND a => Putter (t a)
forall (t :: * -> *) a. (GeoChain t, PointND a) => Putter (t a)
putChain (t p -> t (Cast p)
forall (t :: * -> *) p. Trans t p => t p -> t (Cast p)
transTo t p
vs::t (Cast p))
    getGeometry :: Get (LineString t p)
getGeometry = do
        Header
h <- Get Header
getHeaderPre
        (t (Cast p)
vs::t (Cast p), SRID
srid) <- if Header -> Word32
lookupType Header
hWord32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
==Word32
pgisLinestring
            then Header -> HeaderGetter (t (Cast p)) -> Get (t (Cast p), SRID)
forall a. Header -> HeaderGetter a -> Get (a, SRID)
makeResult Header
h (HeaderGetter ()
skipHeader HeaderGetter ()
-> HeaderGetter (t (Cast p)) -> HeaderGetter (t (Cast p))
forall a b.
ReaderT Header Get a
-> ReaderT Header Get b -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> HeaderGetter (t (Cast p))
forall a. (Traversable t, PointND a) => HeaderGetter (t a)
forall (t :: * -> *) a.
(GeoChain t, Traversable t, PointND a) =>
HeaderGetter (t a)
getChain)
            else GeometryError -> Get (t (Cast p), SRID)
forall a e. Exception e => e -> a
throw (GeometryError -> Get (t (Cast p), SRID))
-> GeometryError -> Get (t (Cast p), SRID)
forall a b. (a -> b) -> a -> b
$
                String -> GeometryError
GeometryError String
"invalid data for linestring geometry"
        LineString t p -> Get (LineString t p)
forall a. a -> Get a
forall (m :: * -> *) a. Monad m => a -> m a
return (SRID -> t p -> LineString t p
forall (t :: * -> *) p. SRID -> t p -> LineString t p
LineString SRID
srid (t (Cast p) -> t p
forall (t :: * -> *) p. Trans t p => t (Cast p) -> t p
transFrom t (Cast p)
vs::t p))

-- | Polygon geometry
data Polygon t2 t1 p = Polygon SRID (t2 (t1 p))

instance (Repl t2 (t1 (Cast p)), GeoChain t2, GeoChain t1, Trans t1 p) =>
        Geometry (Polygon t2 t1 p) where
    putGeometry :: Putter (Polygon t2 t1 p)
putGeometry (Polygon SRID
srid t2 (t1 p)
vss) = do
        SRID -> Word32 -> (Bool, Bool) -> Put
putHeader SRID
srid Word32
pgisPolygon (forall a. PointND a => (Bool, Bool)
dimProps @(Cast p))
        Putter Int
putChainLen Putter Int -> Putter Int
forall a b. (a -> b) -> a -> b
$ t2 (t1 p) -> Int
forall p. t2 p -> Int
forall (t :: * -> *) p. GeoChain t => t p -> Int
count t2 (t1 p)
vss
        (t1 p -> Put) -> t2 (t1 p) -> Put
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\t1 p
vs -> Putter (t1 (Cast p))
forall a. PointND a => Putter (t1 a)
forall (t :: * -> *) a. (GeoChain t, PointND a) => Putter (t a)
putChain (t1 p -> t1 (Cast p)
forall (t :: * -> *) p. Trans t p => t p -> t (Cast p)
transTo t1 p
vs :: t1 (Cast p))) t2 (t1 p)
vss
    getGeometry :: Get (Polygon t2 t1 p)
getGeometry = do
        Header
h <- Get Header
getHeaderPre
        (t2 (t1 (Cast p))
vss::t2 (t1 (Cast p)), SRID
srid) <- if Header -> Word32
lookupType Header
hWord32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
==Word32
pgisPolygon
            then Header
-> HeaderGetter (t2 (t1 (Cast p))) -> Get (t2 (t1 (Cast p)), SRID)
forall a. Header -> HeaderGetter a -> Get (a, SRID)
makeResult Header
h (HeaderGetter ()
skipHeader HeaderGetter () -> ReaderT Header Get Int -> ReaderT Header Get Int
forall a b.
ReaderT Header Get a
-> ReaderT Header Get b -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ReaderT Header Get Int
getChainLen ReaderT Header Get Int
-> (Int -> HeaderGetter (t2 (t1 (Cast p))))
-> HeaderGetter (t2 (t1 (Cast p)))
forall a b.
ReaderT Header Get a
-> (a -> ReaderT Header Get b) -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Int
-> HeaderGetter (t1 (Cast p)) -> HeaderGetter (t2 (t1 (Cast p)))
forall (t :: * -> *) b.
Repl t b =>
Int -> HeaderGetter b -> HeaderGetter (t b)
`repl` HeaderGetter (t1 (Cast p))
forall a. (Traversable t1, PointND a) => HeaderGetter (t1 a)
forall (t :: * -> *) a.
(GeoChain t, Traversable t, PointND a) =>
HeaderGetter (t a)
getChain))
            else GeometryError -> Get (t2 (t1 (Cast p)), SRID)
forall a e. Exception e => e -> a
throw (GeometryError -> Get (t2 (t1 (Cast p)), SRID))
-> GeometryError -> Get (t2 (t1 (Cast p)), SRID)
forall a b. (a -> b) -> a -> b
$
                String -> GeometryError
GeometryError String
"invalid data for polygon geometry"
        Polygon t2 t1 p -> Get (Polygon t2 t1 p)
forall a. a -> Get a
forall (m :: * -> *) a. Monad m => a -> m a
return (SRID -> t2 (t1 p) -> Polygon t2 t1 p
forall (t2 :: * -> *) (t1 :: * -> *) p.
SRID -> t2 (t1 p) -> Polygon t2 t1 p
Polygon SRID
srid (t1 (Cast p) -> t1 p
forall (t :: * -> *) p. Trans t p => t (Cast p) -> t p
transFrom (t1 (Cast p) -> t1 p) -> t2 (t1 (Cast p)) -> t2 (t1 p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> t2 (t1 (Cast p))
vss::t2 (t1 p)))

-- | MultiPoint geometry
data MultiPoint t p = MultiPoint SRID (t p)

instance (Repl t (Cast p), GeoChain t, Trans t p) =>
        Geometry (MultiPoint t p) where
    putGeometry :: Putter (MultiPoint t p)
putGeometry (MultiPoint SRID
srid t p
vs) = do
        SRID -> Word32 -> (Bool, Bool) -> Put
putHeader SRID
srid Word32
pgisMultiPoint (forall a. PointND a => (Bool, Bool)
dimProps @(Cast p))
        Putter Int
putChainLen Putter Int -> Putter Int
forall a b. (a -> b) -> a -> b
$ t p -> Int
forall p. t p -> Int
forall (t :: * -> *) p. GeoChain t => t p -> Int
count t p
vs
        (p -> Put) -> t p -> Put
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\p
v -> do
            Putter (Point p)
forall a. Geometry a => Putter a
putGeometry (SRID -> p -> Point p
forall p. SRID -> p -> Point p
Point SRID
srid p
v :: Point p)
            ) t p
vs
    getGeometry :: Get (MultiPoint t p)
getGeometry = do
        Header
h <- Get Header
getHeaderPre
        (t (Cast p)
vs::t (Cast p), SRID
srid) <- if Header -> Word32
lookupType Header
hWord32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
==Word32
pgisMultiPoint
            then Header -> HeaderGetter (t (Cast p)) -> Get (t (Cast p), SRID)
forall a. Header -> HeaderGetter a -> Get (a, SRID)
makeResult Header
h (
                HeaderGetter ()
skipHeader HeaderGetter () -> ReaderT Header Get Int -> ReaderT Header Get Int
forall a b.
ReaderT Header Get a
-> ReaderT Header Get b -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ReaderT Header Get Int
getChainLen ReaderT Header Get Int
-> (Int -> HeaderGetter (t (Cast p))) -> HeaderGetter (t (Cast p))
forall a b.
ReaderT Header Get a
-> (a -> ReaderT Header Get b) -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Int -> HeaderGetter (Cast p) -> HeaderGetter (t (Cast p))
forall (t :: * -> *) b.
Repl t b =>
Int -> HeaderGetter b -> HeaderGetter (t b)
`repl` (HeaderGetter ()
skipHeader HeaderGetter () -> HeaderGetter (Cast p) -> HeaderGetter (Cast p)
forall a b.
ReaderT Header Get a
-> ReaderT Header Get b -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> HeaderGetter (Cast p)
forall a. PointND a => HeaderGetter a
getPointND))
                )
            else GeometryError -> Get (t (Cast p), SRID)
forall a e. Exception e => e -> a
throw (GeometryError -> Get (t (Cast p), SRID))
-> GeometryError -> Get (t (Cast p), SRID)
forall a b. (a -> b) -> a -> b
$
                String -> GeometryError
GeometryError String
"invalid data for multipoint geometry"
        MultiPoint t p -> Get (MultiPoint t p)
forall a. a -> Get a
forall (m :: * -> *) a. Monad m => a -> m a
return (SRID -> t p -> MultiPoint t p
forall (t :: * -> *) p. SRID -> t p -> MultiPoint t p
MultiPoint SRID
srid (t (Cast p) -> t p
forall (t :: * -> *) p. Trans t p => t (Cast p) -> t p
transFrom t (Cast p)
vs::t p))

-- | MultiLineString geometry
data MultiLineString t2 t1 p = MultiLineString SRID (t2 (t1 p))

instance (Repl t2 (t1 (Cast p)), GeoChain t2, GeoChain t1, Trans t1 p) =>
        Geometry (MultiLineString t2 t1 p) where
    putGeometry :: Putter (MultiLineString t2 t1 p)
putGeometry (MultiLineString SRID
srid t2 (t1 p)
vss) = do
        SRID -> Word32 -> (Bool, Bool) -> Put
putHeader SRID
srid Word32
pgisMultiLinestring (forall a. PointND a => (Bool, Bool)
dimProps @(Cast p))
        Putter Int
putChainLen Putter Int -> Putter Int
forall a b. (a -> b) -> a -> b
$ t2 (t1 p) -> Int
forall p. t2 p -> Int
forall (t :: * -> *) p. GeoChain t => t p -> Int
count t2 (t1 p)
vss
        (t1 p -> Put) -> t2 (t1 p) -> Put
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\t1 p
vs -> do
            Putter (LineString t1 p)
forall a. Geometry a => Putter a
putGeometry (SRID -> t1 p -> LineString t1 p
forall (t :: * -> *) p. SRID -> t p -> LineString t p
LineString SRID
srid t1 p
vs :: LineString t1 p)
            ) t2 (t1 p)
vss
    getGeometry :: Get (MultiLineString t2 t1 p)
getGeometry = do
        Header
h <- Get Header
getHeaderPre
        (t2 (t1 (Cast p))
vss::t2 (t1 (Cast p)), SRID
srid) <- if Header -> Word32
lookupType Header
hWord32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
==Word32
pgisMultiLinestring
            then Header
-> HeaderGetter (t2 (t1 (Cast p))) -> Get (t2 (t1 (Cast p)), SRID)
forall a. Header -> HeaderGetter a -> Get (a, SRID)
makeResult Header
h (
                HeaderGetter ()
skipHeader HeaderGetter () -> ReaderT Header Get Int -> ReaderT Header Get Int
forall a b.
ReaderT Header Get a
-> ReaderT Header Get b -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ReaderT Header Get Int
getChainLen ReaderT Header Get Int
-> (Int -> HeaderGetter (t2 (t1 (Cast p))))
-> HeaderGetter (t2 (t1 (Cast p)))
forall a b.
ReaderT Header Get a
-> (a -> ReaderT Header Get b) -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Int
-> HeaderGetter (t1 (Cast p)) -> HeaderGetter (t2 (t1 (Cast p)))
forall (t :: * -> *) b.
Repl t b =>
Int -> HeaderGetter b -> HeaderGetter (t b)
`repl` (HeaderGetter ()
skipHeader HeaderGetter ()
-> HeaderGetter (t1 (Cast p)) -> HeaderGetter (t1 (Cast p))
forall a b.
ReaderT Header Get a
-> ReaderT Header Get b -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> HeaderGetter (t1 (Cast p))
forall a. (Traversable t1, PointND a) => HeaderGetter (t1 a)
forall (t :: * -> *) a.
(GeoChain t, Traversable t, PointND a) =>
HeaderGetter (t a)
getChain))
                )
            else GeometryError -> Get (t2 (t1 (Cast p)), SRID)
forall a e. Exception e => e -> a
throw (GeometryError -> Get (t2 (t1 (Cast p)), SRID))
-> GeometryError -> Get (t2 (t1 (Cast p)), SRID)
forall a b. (a -> b) -> a -> b
$
                String -> GeometryError
GeometryError String
"invalid data for multilinestring geometry"
        MultiLineString t2 t1 p -> Get (MultiLineString t2 t1 p)
forall a. a -> Get a
forall (m :: * -> *) a. Monad m => a -> m a
return (SRID -> t2 (t1 p) -> MultiLineString t2 t1 p
forall (t2 :: * -> *) (t1 :: * -> *) p.
SRID -> t2 (t1 p) -> MultiLineString t2 t1 p
MultiLineString SRID
srid (t1 (Cast p) -> t1 p
forall (t :: * -> *) p. Trans t p => t (Cast p) -> t p
transFrom (t1 (Cast p) -> t1 p) -> t2 (t1 (Cast p)) -> t2 (t1 p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> t2 (t1 (Cast p))
vss::t2 (t1 p)))

-- | MultiPolygon geometry
data MultiPolygon t3 t2 t1 p = MultiPolygon SRID (t3 (t2 (t1 p)))

instance (Repl t3 (t2 (t1 (Cast p))), Repl t2 (t1 (Cast p)), GeoChain t3, GeoChain t2,
        GeoChain t1, Trans t1 p) => Geometry (MultiPolygon t3 t2 t1 p) where
    putGeometry :: Putter (MultiPolygon t3 t2 t1 p)
putGeometry (MultiPolygon SRID
srid t3 (t2 (t1 p))
vsss) = do
        SRID -> Word32 -> (Bool, Bool) -> Put
putHeader SRID
srid Word32
pgisMultiPolygon (forall a. PointND a => (Bool, Bool)
dimProps @(Cast p))
        Putter Int
putChainLen Putter Int -> Putter Int
forall a b. (a -> b) -> a -> b
$ t3 (t2 (t1 p)) -> Int
forall p. t3 p -> Int
forall (t :: * -> *) p. GeoChain t => t p -> Int
count t3 (t2 (t1 p))
vsss
        (t2 (t1 p) -> Put) -> t3 (t2 (t1 p)) -> Put
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\t2 (t1 p)
vss -> do
            Putter (Polygon t2 t1 p)
forall a. Geometry a => Putter a
putGeometry (SRID -> t2 (t1 p) -> Polygon t2 t1 p
forall (t2 :: * -> *) (t1 :: * -> *) p.
SRID -> t2 (t1 p) -> Polygon t2 t1 p
Polygon SRID
srid t2 (t1 p)
vss :: Polygon t2 t1 p)
            ) t3 (t2 (t1 p))
vsss
    getGeometry :: Get (MultiPolygon t3 t2 t1 p)
getGeometry = do
        Header
h <- Get Header
getHeaderPre
        (t3 (t2 (t1 (Cast p)))
vsss::t3 (t2 (t1 (Cast p))), SRID
srid) <- if Header -> Word32
lookupType Header
hWord32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
==Word32
pgisMultiPolygon
            then Header
-> HeaderGetter (t3 (t2 (t1 (Cast p))))
-> Get (t3 (t2 (t1 (Cast p))), SRID)
forall a. Header -> HeaderGetter a -> Get (a, SRID)
makeResult Header
h (do
                HeaderGetter ()
skipHeader HeaderGetter () -> ReaderT Header Get Int -> ReaderT Header Get Int
forall a b.
ReaderT Header Get a
-> ReaderT Header Get b -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ReaderT Header Get Int
getChainLen ReaderT Header Get Int
-> (Int -> HeaderGetter (t3 (t2 (t1 (Cast p)))))
-> HeaderGetter (t3 (t2 (t1 (Cast p))))
forall a b.
ReaderT Header Get a
-> (a -> ReaderT Header Get b) -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Int
-> HeaderGetter (t2 (t1 (Cast p)))
-> HeaderGetter (t3 (t2 (t1 (Cast p))))
forall (t :: * -> *) b.
Repl t b =>
Int -> HeaderGetter b -> HeaderGetter (t b)
`repl` (HeaderGetter ()
skipHeader HeaderGetter () -> ReaderT Header Get Int -> ReaderT Header Get Int
forall a b.
ReaderT Header Get a
-> ReaderT Header Get b -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ReaderT Header Get Int
getChainLen
                    ReaderT Header Get Int
-> (Int -> HeaderGetter (t2 (t1 (Cast p))))
-> HeaderGetter (t2 (t1 (Cast p)))
forall a b.
ReaderT Header Get a
-> (a -> ReaderT Header Get b) -> ReaderT Header Get b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Int
-> HeaderGetter (t1 (Cast p)) -> HeaderGetter (t2 (t1 (Cast p)))
forall (t :: * -> *) b.
Repl t b =>
Int -> HeaderGetter b -> HeaderGetter (t b)
`repl` HeaderGetter (t1 (Cast p))
forall a. (Traversable t1, PointND a) => HeaderGetter (t1 a)
forall (t :: * -> *) a.
(GeoChain t, Traversable t, PointND a) =>
HeaderGetter (t a)
getChain)))
                )
            else GeometryError -> Get (t3 (t2 (t1 (Cast p))), SRID)
forall a e. Exception e => e -> a
throw (GeometryError -> Get (t3 (t2 (t1 (Cast p))), SRID))
-> GeometryError -> Get (t3 (t2 (t1 (Cast p))), SRID)
forall a b. (a -> b) -> a -> b
$
                String -> GeometryError
GeometryError String
"invalid data for multipolygon geometry"
        MultiPolygon t3 t2 t1 p -> Get (MultiPolygon t3 t2 t1 p)
forall a. a -> Get a
forall (m :: * -> *) a. Monad m => a -> m a
return (SRID -> t3 (t2 (t1 p)) -> MultiPolygon t3 t2 t1 p
forall (t3 :: * -> *) (t2 :: * -> *) (t1 :: * -> *) p.
SRID -> t3 (t2 (t1 p)) -> MultiPolygon t3 t2 t1 p
MultiPolygon SRID
srid ((t1 (Cast p) -> t1 p
forall (t :: * -> *) p. Trans t p => t (Cast p) -> t p
transFrom (t1 (Cast p) -> t1 p) -> t2 (t1 (Cast p)) -> t2 (t1 p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (t2 (t1 (Cast p)) -> t2 (t1 p))
-> t3 (t2 (t1 (Cast p))) -> t3 (t2 (t1 p))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> t3 (t2 (t1 (Cast p)))
vsss::t3 (t2 (t1 p))))

-- | Point putter
putPoint :: Castable p => SRID -> p -> Geo (Point p)
putPoint :: forall p. Castable p => SRID -> p -> Geo (Point p)
putPoint SRID
srid p
p = Point p -> Geo (Point p)
forall g. g -> Geo g
Geo (SRID -> p -> Point p
forall p. SRID -> p -> Point p
Point SRID
srid p
p)

-- | Point getter
getPoint :: Geo (Point p) -> (SRID, p)
getPoint :: forall p. Geo (Point p) -> (SRID, p)
getPoint (Geo (Point SRID
srid p
p)) = (SRID
srid, p
p)

-- | Linestring putter
putLS :: SRID -> t p -> Geo (LineString t p)
putLS :: forall (t :: * -> *) p. SRID -> t p -> Geo (LineString t p)
putLS SRID
srid t p
ps = LineString t p -> Geo (LineString t p)
forall g. g -> Geo g
Geo (SRID -> t p -> LineString t p
forall (t :: * -> *) p. SRID -> t p -> LineString t p
LineString SRID
srid t p
ps)

-- | LineString getter
getLS :: Geo (LineString t p) -> (SRID, t p)
getLS :: forall (t :: * -> *) p. Geo (LineString t p) -> (SRID, t p)
getLS (Geo (LineString SRID
srid t p
vs)) = (SRID
srid, t p
vs)

-- | Polygon putter
putPoly :: SRID -> t2 (t1 p) -> Geo (Polygon t2 t1 p)
putPoly :: forall (t2 :: * -> *) (t1 :: * -> *) p.
SRID -> t2 (t1 p) -> Geo (Polygon t2 t1 p)
putPoly SRID
srid t2 (t1 p)
pss = Polygon t2 t1 p -> Geo (Polygon t2 t1 p)
forall g. g -> Geo g
Geo (SRID -> t2 (t1 p) -> Polygon t2 t1 p
forall (t2 :: * -> *) (t1 :: * -> *) p.
SRID -> t2 (t1 p) -> Polygon t2 t1 p
Polygon SRID
srid t2 (t1 p)
pss)

-- | Polygon getter
getPoly :: Geo (Polygon t2 t1 p) -> (SRID, t2 (t1 p))
getPoly :: forall (t2 :: * -> *) (t1 :: * -> *) p.
Geo (Polygon t2 t1 p) -> (SRID, t2 (t1 p))
getPoly (Geo (Polygon SRID
srid t2 (t1 p)
vss)) = (SRID
srid, t2 (t1 p)
vss)

-- | MultiPoint putter
putMPoint :: SRID -> t p -> Geo (MultiPoint t p)
putMPoint :: forall (t :: * -> *) p. SRID -> t p -> Geo (MultiPoint t p)
putMPoint SRID
srid t p
ps = MultiPoint t p -> Geo (MultiPoint t p)
forall g. g -> Geo g
Geo (SRID -> t p -> MultiPoint t p
forall (t :: * -> *) p. SRID -> t p -> MultiPoint t p
MultiPoint SRID
srid t p
ps)

-- | MultiPoint getter
getMPoint :: Geo (MultiPoint t p) -> (SRID, t p)
getMPoint :: forall (t :: * -> *) p. Geo (MultiPoint t p) -> (SRID, t p)
getMPoint (Geo (MultiPoint SRID
srid t p
vs)) = (SRID
srid, t p
vs)

-- | MultiLineString putter
putMLS :: SRID -> t2 (t1 p) -> Geo (MultiLineString t2 t1 p)
putMLS :: forall (t2 :: * -> *) (t1 :: * -> *) p.
SRID -> t2 (t1 p) -> Geo (MultiLineString t2 t1 p)
putMLS SRID
srid t2 (t1 p)
pss = MultiLineString t2 t1 p -> Geo (MultiLineString t2 t1 p)
forall g. g -> Geo g
Geo (SRID -> t2 (t1 p) -> MultiLineString t2 t1 p
forall (t2 :: * -> *) (t1 :: * -> *) p.
SRID -> t2 (t1 p) -> MultiLineString t2 t1 p
MultiLineString SRID
srid t2 (t1 p)
pss)

-- | MultiLineString getter
getMLS :: Geo (MultiLineString t2 t1 p) -> (SRID, t2 (t1 p))
getMLS :: forall (t2 :: * -> *) (t1 :: * -> *) p.
Geo (MultiLineString t2 t1 p) -> (SRID, t2 (t1 p))
getMLS (Geo (MultiLineString SRID
srid t2 (t1 p)
vs)) = (SRID
srid, t2 (t1 p)
vs)

-- | MultiPolygon putter
putMPoly :: SRID -> t3 (t2 (t1 p)) -> Geo (MultiPolygon t3 t2 t1 p)
putMPoly :: forall (t3 :: * -> *) (t2 :: * -> *) (t1 :: * -> *) p.
SRID -> t3 (t2 (t1 p)) -> Geo (MultiPolygon t3 t2 t1 p)
putMPoly SRID
srid t3 (t2 (t1 p))
psss = MultiPolygon t3 t2 t1 p -> Geo (MultiPolygon t3 t2 t1 p)
forall g. g -> Geo g
Geo (SRID -> t3 (t2 (t1 p)) -> MultiPolygon t3 t2 t1 p
forall (t3 :: * -> *) (t2 :: * -> *) (t1 :: * -> *) p.
SRID -> t3 (t2 (t1 p)) -> MultiPolygon t3 t2 t1 p
MultiPolygon SRID
srid t3 (t2 (t1 p))
psss)

-- | MultiPolygon getter
getMPoly :: Geo (MultiPolygon t3 t2 t1 p) -> (SRID, t3 (t2 (t1 p)))
getMPoly :: forall (t3 :: * -> *) (t2 :: * -> *) (t1 :: * -> *) p.
Geo (MultiPolygon t3 t2 t1 p) -> (SRID, t3 (t2 (t1 p)))
getMPoly (Geo (MultiPolygon SRID
srid t3 (t2 (t1 p))
vs)) = (SRID
srid, t3 (t2 (t1 p))
vs)