@@ -1,23 +1,29 @@
11{-# language FlexibleContexts #-}
2+{-# language MonoLocalBinds #-}
23
34module Rel8.Query.List
45 ( many, some
6+ , manyExpr, someExpr
57 )
68where
79
810-- base
11+import Data.List.NonEmpty ( NonEmpty )
912import Prelude
1013
1114-- rel8
1215import Rel8.Expr ( Expr )
16+import Rel8.Expr.Aggregate ( listAggExpr, nonEmptyAggExpr )
1317import Rel8.Query ( Query )
1418import Rel8.Query.Aggregate ( aggregate )
1519import Rel8.Query.Maybe ( optional )
20+import Rel8.Schema.Null ( Sql )
1621import Rel8.Table ( Table )
1722import Rel8.Table.Aggregate ( listAgg, nonEmptyAgg )
1823import Rel8.Table.List ( ListTable )
1924import Rel8.Table.Maybe ( maybeTable )
2025import Rel8.Table.NonEmpty ( NonEmptyTable )
26+import Rel8.Type ( DBType )
2127
2228
2329-- | Aggregate a 'Query' into a 'NonEmptyTable'. If the supplied query returns
@@ -41,3 +47,13 @@ some = aggregate . fmap nonEmptyAgg
4147-- @Control.Applicative@.
4248many :: Table Expr a => Query a -> Query (ListTable a)
4349many = 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