@@ -0,0 +1,69 @@
11+module Squeal.PostgreSQL.Expression.SetOf
13+ , unsafeSetOfFunction
15+ , unsafeSetOfFunctionN
18+ , generateSeriesTimestamp
21+import Data.ByteString (ByteString)
23+import qualified Generics.SOP as SOP
25+import Squeal.PostgreSQL.Alias
26+import Squeal.PostgreSQL.Expression
27+import Squeal.PostgreSQL.List
28+import Squeal.PostgreSQL.Render
29+import Squeal.PostgreSQL.Query
30+import Squeal.PostgreSQL.Schema
32+type SetOfFunction ty setof
33+ = forall outer commons schemas params
34+ . Expression outer commons 'Ungrouped schemas params '[] ty
35+ -> FromClause outer commons schemas params setof
37+unsafeSetOfFunction :: ByteString -> SetOfFunction ty setof
38+unsafeSetOfFunction fun x = UnsafeFromClause $
39+ fun <> parenthesized (renderSQL x)
41+type SetOfFunctionN tys setof
42+ = forall outer commons schemas params
43+ . NP (Expression outer commons 'Ungrouped schemas params '[]) tys
44+ -> FromClause outer commons schemas params setof
49+ -> SetOfFunctionN tys setof
50+unsafeSetOfFunctionN fun xs = UnsafeFromClause $
51+ fun <> parenthesized (renderCommaSeparated renderSQL xs)
54+ :: ty `In` '[ 'PGint4, 'PGint8, 'PGnumeric]
55+ => SetOfFunctionN '[ null ty, null ty]
56+ '["generate_series" ::: '["generate_series" ::: '[null ty]]]
57+generateSeries = unsafeSetOfFunctionN "generate_series"
60+ :: ty `In` '[ 'PGint4, 'PGint8, 'PGnumeric]
61+ => SetOfFunctionN '[null ty, null ty, null ty]
62+ '["generate_series" ::: '["generate_series" ::: '[null ty]]]
63+generateSeriesStep = unsafeSetOfFunctionN "generate_series"
65+generateSeriesTimestamp
66+ :: ty `In` '[ 'PGtimestamp, 'PGtimestamptz]
67+ => SetOfFunctionN '[null ty, null ty, null 'PGinterval]
68+ '["generate_series" ::: '["generate_series" ::: '[null ty]]]
69+generateSeriesTimestamp = unsafeSetOfFunctionN "generate_series"