on master help sign in
Fix incorrect >>= implementation for Query (#73)
70ce05dShane
src/Rel8/Query.hs+10−5
@@ -174,7 +174,7 @@ instance Monad Query where
174 Opaleye.QueryArr qa = q dummies
174 Opaleye.QueryArr qa = q dummies
175 ((m, a), query', tag') = qa ((), query, tag)
175 ((m, a), query', tag') = qa ((), query, tag)
176 Query q' = f a
176 Query q' = f a
177− (dummies', lquery, tag'') =
177+ (dummies', query'', tag'') =
178 ( dummy : dummies
178 ( dummy : dummies
179 , Opaleye.Rebind True bindings query'
179 , Opaleye.Rebind True bindings query'
180 , Opaleye.next tag'
180 , Opaleye.next tag'
@@ -185,11 +185,16 @@ instance Monad Query where
185 random = Opaleye.FunExpr "random" []
185 random = Opaleye.FunExpr "random" []
186 name = Opaleye.extractAttr "dummy" tag'
186 name = Opaleye.extractAttr "dummy" tag'
187 Opaleye.QueryArr qa' = Opaleye.lateral $ \_ -> q' dummies'
187 Opaleye.QueryArr qa' = Opaleye.lateral $ \_ -> q' dummies'
188+ -- NOTE: query''' and needsDummies are corecursive; only laziness saves
189+ -- us here.
190+ --
191+ -- This refactoring, if adopted, would allow us to do this without
192+ -- relying on laziness:
193+ -- https://github.com/tomjaguarpaw/haskell-opaleye/commit/8a23f5028ab7396290984d63a8316949909fdbb4
188− ((m'@(Any needsDummies), b), rquery, tag''') = qa' ((), Opaleye.Unit, tag'')
194+ ((m'@(Any needsDummies), b), query'''', tag''') = qa' ((), query''', tag'')
189− lquery'
195+ query'''
190− | needsDummies = lquery
196+ | needsDummies = query''
191 | otherwise = query'
197 | otherwise = query'
192− query'''' = Opaleye.times lquery' rquery
193 m'' = m <> m'
198 m'' = m <> m'
194 in
199 in
195 ((m'', b), query'''', tag''')
200 ((m'', b), query'''', tag''')