Refactor TcRnMonad.mapAndRecoverM
authorSimon Jakobi <simon.jakobi@gmail.com>
Thu, 22 Nov 2018 16:51:53 +0000 (11:51 -0500)
committerBen Gamari <ben@smart-cactus.org>
Thu, 22 Nov 2018 18:14:02 +0000 (13:14 -0500)
This version doesn't require the 'reverse' step after the monadic
fold.

Test Plan: ./validate

Reviewers: bgamari, tdammers

Reviewed By: tdammers

Subscribers: monoidal, rwbarton, carter

Differential Revision: https://phabricator.haskell.org/D5343

compiler/typecheck/TcRnMonad.hs
compiler/utils/Maybes.hs

index eb5a63a..a033bc4 100644 (file)
@@ -990,7 +990,7 @@ recoverM recover thing
 -- | Drop elements of the input that fail, so the result
 -- list can be shorter than the argument list
 mapAndRecoverM :: (a -> TcRn b) -> [a] -> TcRn [b]
-mapAndRecoverM f = fmap reverse . foldAndRecoverM (\xs x -> (:xs) <$> f x ) []
+mapAndRecoverM f = mapMaybeM (fmap rightToMaybe . try_m . f)
 
 -- | The accumulator is not updated if the action fails
 foldAndRecoverM :: (b -> a -> TcRn b) -> b -> [a] -> TcRn b
index 3a139a5..14bc46b 100644 (file)
@@ -18,6 +18,7 @@ module Maybes (
         firstJust, firstJusts,
         whenIsJust,
         expectJust,
+        rightToMaybe,
 
         -- * MaybeT
         MaybeT(..), liftMaybeT, tryMaybeT
@@ -62,6 +63,10 @@ whenIsJust Nothing  _ = return ()
 orElse :: Maybe a -> a -> a
 orElse = flip fromMaybe
 
+rightToMaybe :: Either a b -> Maybe b
+rightToMaybe (Left _)  = Nothing
+rightToMaybe (Right x) = Just x
+
 {-
 ************************************************************************
 *                                                                      *