on master help sign in
Add manyExpr and someExpr
bdf2d87Shane O'Brien
src/Rel8.hs+2
@@ -98,6 +98,7 @@ module Rel8
98 , insertListTable
98 , insertListTable
99 , nameListTable
99 , nameListTable
100 , many
100 , many
101+ , manyExpr
101
102
102 -- ** @NonEmptyTable@
103 -- ** @NonEmptyTable@
103 , NonEmptyTable
104 , NonEmptyTable
@@ -105,6 +106,7 @@ module Rel8
105 , insertNonEmptyTable
106 , insertNonEmptyTable
106 , nameNonEmptyTable
107 , nameNonEmptyTable
107 , some
108 , some
109+ , someExpr
108
110
109 -- ** @ADT@
111 -- ** @ADT@
110 , ADT, ADTable, fromADT, toADT
112 , ADT, ADTable, fromADT, toADT
src/Rel8/Query/List.hs+16
@@ -1,23 +1,29 @@
1{-# language FlexibleContexts #-}
1{-# language FlexibleContexts #-}
2+{-# language MonoLocalBinds #-}
2
3
3module Rel8.Query.List
4module Rel8.Query.List
4 ( many, some
5 ( many, some
6+ , manyExpr, someExpr
5 )
7 )
6where
8where
7
9
8-- base
10-- base
11+import Data.List.NonEmpty ( NonEmpty )
9import Prelude
12import Prelude
10
13
11-- rel8
14-- rel8
12import Rel8.Expr ( Expr )
15import Rel8.Expr ( Expr )
16+import Rel8.Expr.Aggregate ( listAggExpr, nonEmptyAggExpr )
13import Rel8.Query ( Query )
17import Rel8.Query ( Query )
14import Rel8.Query.Aggregate ( aggregate )
18import Rel8.Query.Aggregate ( aggregate )
15import Rel8.Query.Maybe ( optional )
19import Rel8.Query.Maybe ( optional )
20+import Rel8.Schema.Null ( Sql )
16import Rel8.Table ( Table )
21import Rel8.Table ( Table )
17import Rel8.Table.Aggregate ( listAgg, nonEmptyAgg )
22import Rel8.Table.Aggregate ( listAgg, nonEmptyAgg )
18import Rel8.Table.List ( ListTable )
23import Rel8.Table.List ( ListTable )
19import Rel8.Table.Maybe ( maybeTable )
24import Rel8.Table.Maybe ( maybeTable )
20import Rel8.Table.NonEmpty ( NonEmptyTable )
25import Rel8.Table.NonEmpty ( NonEmptyTable )
26+import Rel8.Type ( DBType )
21
27
22
28
23-- | Aggregate a 'Query' into a 'NonEmptyTable'. If the supplied query returns
29-- | Aggregate a 'Query' into a 'NonEmptyTable'. If the supplied query returns
@@ -41,3 +47,13 @@ some = aggregate . fmap nonEmptyAgg
41-- @Control.Applicative@.
47-- @Control.Applicative@.
42many :: Table Expr a => Query a -> Query (ListTable a)
48many :: Table Expr a => Query a -> Query (ListTable a)
43many = fmap (maybeTable mempty id) . optional . aggregate . fmap listAgg
49many = fmap (maybeTable mempty id) . optional . aggregate . fmap listAgg
50+
51+
52+-- | A version of 'many' specialised to single expressions.
53+manyExpr :: Sql DBType a => Query (Expr a) -> Query (Expr [a])
54+manyExpr = fmap (maybeTable mempty id) . optional . aggregate . fmap listAggExpr
55+
56+
57+-- | A version of 'many' specialised to single expressions.
58+someExpr :: Query (Expr a) -> Query (Expr (NonEmpty a))
59+someExpr = aggregate . fmap nonEmptyAggExpr