@@ -13,7 +13,6 @@ module Rel8.Query.These
1313where
1414
1515-- base
16−import Data.Bifunctor ( bimap )
1716import Prelude
1817
1918-- opaleye
@@ -22,12 +21,13 @@ import qualified Opaleye.Internal.PrimQuery as Opaleye
2221
2322-- rel8
2423import Rel8.Expr ( Expr )
25−import Rel8.Expr.Bool ( (&&.), boolExpr, not_ )
24+import Rel8.Expr.Bool ( boolExpr, not_ )
25+import Rel8.Expr.Eq ( (==.) )
2626import Rel8.Expr.Opaleye ( toColumn, toPrimExpr )
2727import Rel8.Expr.Serialize ( litExpr )
2828import Rel8.Query ( Query )
2929import Rel8.Query.Filter ( where_ )
30−import Rel8.Query.Maybe ( traverseMaybeTable )
30+import Rel8.Query.Maybe ( optional )
3131import Rel8.Query.Opaleye ( zipOpaleyeWith )
3232import Rel8.Table ( Table )
3333import Rel8.Table.Either ( EitherTable( EitherTable ) )
@@ -35,6 +35,7 @@ import Rel8.Table.Maybe ( MaybeTable( MaybeTable ), isJustTable )
3535import Rel8.Table.Opaleye ( unpackspec )
3636import Rel8.Table.These
3737 ( TheseTable( TheseTable )
38+ , hasHereTable, hasThereTable
3839 , isThisTable, isThatTable, isThoseTable
3940 )
4041import Rel8.Type.Tag ( EitherTag( IsLeft, IsRight ) )
@@ -115,15 +116,14 @@ bindTheseTable query (TheseTable here (MaybeTable input i)) = do
115116 pure $ TheseTable (here <> here') (MaybeTable (input <> output) b)
116117
117118
118−bitraverseTheseTable :: (Table Expr c, Table Expr d)
119+bitraverseTheseTable :: ()
119120 => (a -> Query c)
120121 -> (b -> Query d)
121122 -> TheseTable a b
122123 -> Query (TheseTable c d)
123−bitraverseTheseTable f g (TheseTable here there) =
124− bimap fromJustTable fromJustTable <$>
125− alignBy (\l r -> isJustTable l &&. isJustTable r)
126− (traverseMaybeTable f here)
127− (traverseMaybeTable g there)
128− where
129− fromJustTable (MaybeTable _ a) = a
124+bitraverseTheseTable f g t = do
125+ mc <- optional (f . fst =<< keepHereTable t)
126+ md <- optional (g . snd =<< keepThereTable t)
127+ where_ $ isJustTable mc ==. hasHereTable t
128+ where_ $ isJustTable md ==. hasThereTable t
129+ pure $ TheseTable mc md