@@ -13,7 +13,6 @@ module Rel8.Query.These
16−import Data.Bifunctor ( bimap )
17import Prelude
16import Prelude
@@ -22,12 +21,13 @@ import qualified Opaleye.Internal.PrimQuery as Opaleye
24import Rel8.Expr ( Expr )
23import Rel8.Expr ( Expr )
25−import Rel8.Expr.Bool ( (&&.), boolExpr, not_ )
24+import Rel8.Expr.Bool ( boolExpr, not_ )
25+import Rel8.Expr.Eq ( (==.) )
26import Rel8.Expr.Opaleye ( toColumn, toPrimExpr )
26import Rel8.Expr.Opaleye ( toColumn, toPrimExpr )
27import Rel8.Expr.Serialize ( litExpr )
27import Rel8.Expr.Serialize ( litExpr )
28import Rel8.Query ( Query )
28import Rel8.Query ( Query )
29import Rel8.Query.Filter ( where_ )
29import Rel8.Query.Filter ( where_ )
30−import Rel8.Query.Maybe ( traverseMaybeTable )
30+import Rel8.Query.Maybe ( optional )
31import Rel8.Query.Opaleye ( zipOpaleyeWith )
31import Rel8.Query.Opaleye ( zipOpaleyeWith )
32import Rel8.Table ( Table )
32import Rel8.Table ( Table )
33import Rel8.Table.Either ( EitherTable( EitherTable ) )
33import Rel8.Table.Either ( EitherTable( EitherTable ) )
@@ -35,6 +35,7 @@ import Rel8.Table.Maybe ( MaybeTable( MaybeTable ), isJustTable )
35import Rel8.Table.Opaleye ( unpackspec )
35import Rel8.Table.Opaleye ( unpackspec )
36import Rel8.Table.These
36import Rel8.Table.These
37 ( TheseTable( TheseTable )
37 ( TheseTable( TheseTable )
38+ , hasHereTable, hasThereTable
38 , isThisTable, isThatTable, isThoseTable
39 , isThisTable, isThatTable, isThoseTable
40import Rel8.Type.Tag ( EitherTag( IsLeft, IsRight ) )
41import Rel8.Type.Tag ( EitherTag( IsLeft, IsRight ) )
@@ -115,15 +116,14 @@ bindTheseTable query (TheseTable here (MaybeTable input i)) = do
115 pure $ TheseTable (here <> here') (MaybeTable (input <> output) b)
116 pure $ TheseTable (here <> here') (MaybeTable (input <> output) b)
118−bitraverseTheseTable :: (Table Expr c, Table Expr d)
119+bitraverseTheseTable :: ()
119 => (a -> Query c)
120 => (a -> Query c)
120 -> (b -> Query d)
121 -> (b -> Query d)
121 -> TheseTable a b
122 -> TheseTable a b
122 -> Query (TheseTable c d)
123 -> Query (TheseTable c d)
123−bitraverseTheseTable f g (TheseTable here there) =
124+bitraverseTheseTable f g t = do
124− bimap fromJustTable fromJustTable <$>
125+ mc <- optional (f . fst =<< keepHereTable t)
125− alignBy (\l r -> isJustTable l &&. isJustTable r)
126+ md <- optional (g . snd =<< keepThereTable t)
126− (traverseMaybeTable f here)
127+ where_ $ isJustTable mc ==. hasHereTable t
127− (traverseMaybeTable g there)
128+ where_ $ isJustTable md ==. hasThereTable t
128− where
129+ pure $ TheseTable mc md
129− fromJustTable (MaybeTable _ a) = a