@@ -0,0 +1,69 @@
1+{-# LANGUAGE
2+ AllowAmbiguousTypes
3+ , DataKinds
4+ , FlexibleContexts
5+ , OverloadedStrings
6+ , PolyKinds
7+ , RankNTypes
8+ , TypeOperators
9+#-}
10+
11+module Squeal.PostgreSQL.Expression.SetOf
12+ ( SetOfFunction
13+ , unsafeSetOfFunction
14+ , SetOfFunctionN
15+ , unsafeSetOfFunctionN
16+ , generateSeries
17+ , generateSeriesStep
18+ , generateSeriesTimestamp
19+ ) where
20+
21+import Data.ByteString (ByteString)
22+
23+import qualified Generics.SOP as SOP
24+
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
31+
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
36+
37+unsafeSetOfFunction :: ByteString -> SetOfFunction ty setof
38+unsafeSetOfFunction fun x = UnsafeFromClause $
39+ fun <> parenthesized (renderSQL x)
40+
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
45+
46+unsafeSetOfFunctionN
47+ :: SOP.SListI tys
48+ => ByteString
49+ -> SetOfFunctionN tys setof
50+unsafeSetOfFunctionN fun xs = UnsafeFromClause $
51+ fun <> parenthesized (renderCommaSeparated renderSQL xs)
52+
53+generateSeries
54+ :: ty `In` '[ 'PGint4, 'PGint8, 'PGnumeric]
55+ => SetOfFunctionN '[ null ty, null ty]
56+ '["generate_series" ::: '["generate_series" ::: '[null ty]]]
57+generateSeries = unsafeSetOfFunctionN "generate_series"
58+
59+generateSeriesStep
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"
64+
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"