{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Database.Esqueleto.Postgis.Processing
  ( st_union
  , st_unions
  , st_centroid
  , st_buffer
  , st_convexhull
  , st_envelope
  , st_pointonsurface
  , st_intersection
  , st_difference
  , st_symdifference
  , st_unaryunion
  , st_split
  , st_node
  , st_buildarea
  , st_chaikinsmoothing
  , st_concavehull
  , st_delaunaytriangles
  , st_generatepoints
  , st_geometricmedian
  , st_linemerge
  , st_minimumboundingcircle
  , st_offsetcurve
  , st_reduceprecision
  , st_sharedpaths
  , st_simplify
  , st_simplifypreservetopology
  , st_voronoilines
  , st_voronoipolygons
  ) where

import Data.Proxy
import Database.Esqueleto.Postgis.Geometry (Postgis, SpatialType(..), HasPgType(..))
import Database.Esqueleto.Experimental (SqlExpr, Value)
import Database.Esqueleto.Internal.Internal (unsafeSqlFunction, unsafeSqlCastAs)

-- | allows union of geometries, eg group a bunch together,
--   https://postgis.net/docs/ST_Union.html
--   for example:
--
-- @
--  mCombined <- selectOne $ do
--    grid <- from $ table @Grid
--    pure $ st_union $ grid ^. GridGeom
--
--
--  select $  do
--    unit <- from $ table @Unit
--    forM_ mCombined $ \combined ->
--      where_ $ (unit ^. UnitGeom) `st_intersects` (val $ unValue combined)
--    pure unit
-- @
st_union ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_union :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_union SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_union" SqlExpr (Value (Postgis 'Geometry a))
a

st_unions ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_unions :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_unions SqlExpr (Value (Postgis 'Geometry a))
a SqlExpr (Value (Postgis 'Geometry a))
b =
  -- casts to prevent
  -- function st_union(unknown, unknown) is not unique", sqlErrorDetail = "", sqlErrorHint = "Could not choose a best candidate function. You might need to add explicit type casts.
  Builder
-> (SqlExpr (Value Any), SqlExpr (Value Any))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_union" ((Text
-> SqlExpr (Value (Postgis 'Geometry a)) -> SqlExpr (Value Any)
forall a b. Text -> SqlExpr (Value a) -> SqlExpr (Value b)
unsafeSqlCastAs Text
casted SqlExpr (Value (Postgis 'Geometry a))
a), (Text
-> SqlExpr (Value (Postgis 'Geometry a)) -> SqlExpr (Value Any)
forall a b. Text -> SqlExpr (Value a) -> SqlExpr (Value b)
unsafeSqlCastAs Text
casted SqlExpr (Value (Postgis 'Geometry a))
b))
  where
    casted :: Text
casted = (Proxy 'Geometry -> Text
forall (spatialType :: SpatialType) (proxy :: SpatialType -> *).
HasPgType spatialType =>
proxy spatialType -> Text
forall (proxy :: SpatialType -> *). proxy 'Geometry -> Text
pgType (Proxy 'Geometry -> Text) -> Proxy 'Geometry -> Text
forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
forall (t :: SpatialType). Proxy t
Proxy @'Geometry)

-- | Returns the geometric center (centroid) of a geometry.
--   For polygons this is the center of mass of the surface.
--   https://postgis.net/docs/ST_Centroid.html
st_centroid ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_centroid :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_centroid SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_Centroid" SqlExpr (Value (Postgis 'Geometry a))
a

-- | Returns a geometry that is the buffer of the input geometry at a given distance.
--   The buffer is a polygon expanded (or shrunk if negative) from the input by the distance.
--   https://postgis.net/docs/ST_Buffer.html
st_buffer ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value Double) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_buffer :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value Double) -> SqlExpr (Value (Postgis 'Geometry a))
st_buffer SqlExpr (Value (Postgis 'Geometry a))
a SqlExpr (Value Double)
d = Builder
-> (SqlExpr (Value (Postgis 'Geometry a)), SqlExpr (Value Double))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_Buffer" (SqlExpr (Value (Postgis 'Geometry a))
a, SqlExpr (Value Double)
d)

-- | Returns the convex hull of a geometry.
--   The smallest convex polygon that contains the input geometry.
--   https://postgis.net/docs/ST_ConvexHull.html
st_convexhull ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_convexhull :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_convexhull SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_ConvexHull" SqlExpr (Value (Postgis 'Geometry a))
a

-- | Returns the bounding box of a geometry as a geometry (polygon or point).
--   A minimal axis-aligned rectangle that fully contains the input.
--   https://postgis.net/docs/ST_Envelope.html
st_envelope ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_envelope :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_envelope SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_Envelope" SqlExpr (Value (Postgis 'Geometry a))
a

-- | Returns a point guaranteed to lie on the surface of the geometry.
--   Unlike 'st_centroid', the result is always on or inside the geometry.
--   https://postgis.net/docs/ST_PointOnSurface.html
st_pointonsurface ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_pointonsurface :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_pointonsurface SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_PointOnSurface" SqlExpr (Value (Postgis 'Geometry a))
a

-- | Returns the shared portion of two geometries (their intersection).
--   The result geometry contains only the area common to both inputs.
--   https://postgis.net/docs/ST_Intersection.html
st_intersection ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_intersection :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_intersection SqlExpr (Value (Postgis 'Geometry a))
a SqlExpr (Value (Postgis 'Geometry a))
b = Builder
-> (SqlExpr (Value (Postgis 'Geometry a)),
    SqlExpr (Value (Postgis 'Geometry a)))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_Intersection" (SqlExpr (Value (Postgis 'Geometry a))
a, SqlExpr (Value (Postgis 'Geometry a))
b)

-- | Returns the part of geometry A that does not intersect geometry B.
--   Computes the geometric difference: A minus the shared area of A and B.
--   https://postgis.net/docs/ST_Difference.html
st_difference ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_difference :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_difference SqlExpr (Value (Postgis 'Geometry a))
a SqlExpr (Value (Postgis 'Geometry a))
b = Builder
-> (SqlExpr (Value (Postgis 'Geometry a)),
    SqlExpr (Value (Postgis 'Geometry a)))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_Difference" (SqlExpr (Value (Postgis 'Geometry a))
a, SqlExpr (Value (Postgis 'Geometry a))
b)

-- | Returns the portions of A and B that do not intersect (symmetric difference).
--   https://postgis.net/docs/ST_SymDifference.html
st_symdifference ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_symdifference :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_symdifference SqlExpr (Value (Postgis 'Geometry a))
a SqlExpr (Value (Postgis 'Geometry a))
b = Builder
-> (SqlExpr (Value (Postgis 'Geometry a)),
    SqlExpr (Value (Postgis 'Geometry a)))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_SymDifference" (SqlExpr (Value (Postgis 'Geometry a))
a, SqlExpr (Value (Postgis 'Geometry a))
b)

-- | Computes the union of a single geometry (dissolves internal boundaries).
--   https://postgis.net/docs/ST_UnaryUnion.html
st_unaryunion ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_unaryunion :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_unaryunion SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_UnaryUnion" SqlExpr (Value (Postgis 'Geometry a))
a

-- | Splits a geometry by another geometry, returning a collection of geometries.
--   https://postgis.net/docs/ST_Split.html
st_split ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_split :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_split SqlExpr (Value (Postgis 'Geometry a))
a SqlExpr (Value (Postgis 'Geometry a))
b = Builder
-> (SqlExpr (Value (Postgis 'Geometry a)),
    SqlExpr (Value (Postgis 'Geometry a)))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_Split" (SqlExpr (Value (Postgis 'Geometry a))
a, SqlExpr (Value (Postgis 'Geometry a))
b)

-- | Nodes a set of linestrings, adding intersection points.
--   https://postgis.net/docs/ST_Node.html
st_node ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_node :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_node SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_Node" SqlExpr (Value (Postgis 'Geometry a))
a

-- | Creates an areal geometry formed by the constituent linework of the input geometry.
--   https://postgis.net/docs/ST_BuildArea.html
st_buildarea ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_buildarea :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_buildarea SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_BuildArea" SqlExpr (Value (Postgis 'Geometry a))
a

-- | Returns a smoothed version of the geometry using Chaikin's algorithm.
--   https://postgis.net/docs/ST_ChaikinSmoothing.html
st_chaikinsmoothing ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_chaikinsmoothing :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_chaikinsmoothing SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_ChaikinSmoothing" SqlExpr (Value (Postgis 'Geometry a))
a

-- | Returns a concave hull of a geometry with a target percent of area.
--   https://postgis.net/docs/ST_ConcaveHull.html
st_concavehull ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value Double) -> -- ^ target_percent
  SqlExpr (Value (Postgis 'Geometry a))
st_concavehull :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value Double) -> SqlExpr (Value (Postgis 'Geometry a))
st_concavehull SqlExpr (Value (Postgis 'Geometry a))
a SqlExpr (Value Double)
d = Builder
-> (SqlExpr (Value (Postgis 'Geometry a)), SqlExpr (Value Double))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_ConcaveHull" (SqlExpr (Value (Postgis 'Geometry a))
a, SqlExpr (Value Double)
d)

-- | Returns the Delaunay triangulation of a geometry's vertices.
--   https://postgis.net/docs/ST_DelaunayTriangles.html
st_delaunaytriangles ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_delaunaytriangles :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_delaunaytriangles SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_DelaunayTriangles" SqlExpr (Value (Postgis 'Geometry a))
a

-- | Generates pseudo-random points within a polygon.
--   https://postgis.net/docs/ST_GeneratePoints.html
st_generatepoints ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value Int) -> -- ^ npoints
  SqlExpr (Value (Postgis 'Geometry a))
st_generatepoints :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value Int) -> SqlExpr (Value (Postgis 'Geometry a))
st_generatepoints SqlExpr (Value (Postgis 'Geometry a))
a SqlExpr (Value Int)
n = Builder
-> (SqlExpr (Value (Postgis 'Geometry a)), SqlExpr (Value Int))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_GeneratePoints" (SqlExpr (Value (Postgis 'Geometry a))
a, SqlExpr (Value Int)
n)

-- | Returns the geometric median of a multipoint.
--   https://postgis.net/docs/ST_GeometricMedian.html
st_geometricmedian ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_geometricmedian :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_geometricmedian SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_GeometricMedian" SqlExpr (Value (Postgis 'Geometry a))
a

-- | Merges a collection of linestrings into a single (or fewer) linestrings.
--   https://postgis.net/docs/ST_LineMerge.html
st_linemerge ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_linemerge :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_linemerge SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_LineMerge" SqlExpr (Value (Postgis 'Geometry a))
a

-- | Returns the minimum bounding circle enclosing a geometry.
--   https://postgis.net/docs/ST_MinimumBoundingCircle.html
st_minimumboundingcircle ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_minimumboundingcircle :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_minimumboundingcircle SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_MinimumBoundingCircle" SqlExpr (Value (Postgis 'Geometry a))
a

-- | Returns an offset line at a given distance from the input line.
--   https://postgis.net/docs/ST_OffsetCurve.html
st_offsetcurve ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value Double) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_offsetcurve :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value Double) -> SqlExpr (Value (Postgis 'Geometry a))
st_offsetcurve SqlExpr (Value (Postgis 'Geometry a))
a SqlExpr (Value Double)
d = Builder
-> (SqlExpr (Value (Postgis 'Geometry a)), SqlExpr (Value Double))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_OffsetCurve" (SqlExpr (Value (Postgis 'Geometry a))
a, SqlExpr (Value Double)
d)

-- | Reduces the precision of coordinates in a geometry to a given grid size.
--   https://postgis.net/docs/ST_ReducePrecision.html
st_reduceprecision ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value Double) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_reduceprecision :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value Double) -> SqlExpr (Value (Postgis 'Geometry a))
st_reduceprecision SqlExpr (Value (Postgis 'Geometry a))
a SqlExpr (Value Double)
d = Builder
-> (SqlExpr (Value (Postgis 'Geometry a)), SqlExpr (Value Double))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_ReducePrecision" (SqlExpr (Value (Postgis 'Geometry a))
a, SqlExpr (Value Double)
d)

-- | Returns a collection of shared paths between two linestring/multilinestring geometries.
--   https://postgis.net/docs/ST_SharedPaths.html
st_sharedpaths ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_sharedpaths :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_sharedpaths SqlExpr (Value (Postgis 'Geometry a))
a SqlExpr (Value (Postgis 'Geometry a))
b = Builder
-> (SqlExpr (Value (Postgis 'Geometry a)),
    SqlExpr (Value (Postgis 'Geometry a)))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_SharedPaths" (SqlExpr (Value (Postgis 'Geometry a))
a, SqlExpr (Value (Postgis 'Geometry a))
b)

-- | Returns a simplified version of a geometry using the Douglas-Peucker algorithm.
--   https://postgis.net/docs/ST_Simplify.html
st_simplify ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value Double) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_simplify :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value Double) -> SqlExpr (Value (Postgis 'Geometry a))
st_simplify SqlExpr (Value (Postgis 'Geometry a))
a SqlExpr (Value Double)
d = Builder
-> (SqlExpr (Value (Postgis 'Geometry a)), SqlExpr (Value Double))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_Simplify" (SqlExpr (Value (Postgis 'Geometry a))
a, SqlExpr (Value Double)
d)

-- | Returns a simplified version of a geometry that preserves topology.
--   https://postgis.net/docs/ST_SimplifyPreserveTopology.html
st_simplifypreservetopology ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value Double) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_simplifypreservetopology :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value Double) -> SqlExpr (Value (Postgis 'Geometry a))
st_simplifypreservetopology SqlExpr (Value (Postgis 'Geometry a))
a SqlExpr (Value Double)
d = Builder
-> (SqlExpr (Value (Postgis 'Geometry a)), SqlExpr (Value Double))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_SimplifyPreserveTopology" (SqlExpr (Value (Postgis 'Geometry a))
a, SqlExpr (Value Double)
d)

-- | Returns the Voronoi diagram edges for a set of points.
--   https://postgis.net/docs/ST_VoronoiLines.html
st_voronoilines ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_voronoilines :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_voronoilines SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_VoronoiLines" SqlExpr (Value (Postgis 'Geometry a))
a

-- | Returns the Voronoi diagram polygons for a set of points.
--   https://postgis.net/docs/ST_VoronoiPolygons.html
st_voronoipolygons ::
  SqlExpr (Value (Postgis 'Geometry a)) ->
  SqlExpr (Value (Postgis 'Geometry a))
st_voronoipolygons :: forall a.
SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
st_voronoipolygons SqlExpr (Value (Postgis 'Geometry a))
a = Builder
-> SqlExpr (Value (Postgis 'Geometry a))
-> SqlExpr (Value (Postgis 'Geometry a))
forall a b.
UnsafeSqlFunctionArgument a =>
Builder -> a -> SqlExpr (Value b)
unsafeSqlFunction Builder
"ST_VoronoiPolygons" SqlExpr (Value (Postgis 'Geometry a))
a