@@ -16,10 +16,12 @@
17module Language.PureScript.Errors where
17module Language.PureScript.Errors where
19+import Data.Either (lefts, rights)
19import Data.List (intersperse, intercalate)
20import Data.List (intersperse, intercalate)
20import Data.Monoid
21import Data.Monoid
22import Control.Monad.Error
23import Control.Monad.Error
24+import Control.Applicative ((<$>))
24import Language.PureScript.Declarations
26import Language.PureScript.Declarations
25import Language.PureScript.Pretty
27import Language.PureScript.Pretty
@@ -121,3 +123,18 @@ rethrow f = flip catchError $ \e -> throwError (f e)
122rethrowWithPosition :: (MonadError ErrorStack m) => SourcePos -> m a -> m a
124rethrowWithPosition :: (MonadError ErrorStack m) => SourcePos -> m a -> m a
123rethrowWithPosition pos = rethrow (positionError pos <>)
125rethrowWithPosition pos = rethrow (positionError pos <>)
128+-- Collect errors in in parallel
130+parU :: (MonadError ErrorStack m, Functor m) => [a] -> (a -> m b) -> m [b]
131+parU xs f = forM xs (withError . f) >>= collectErrors
133+ withError :: (MonadError ErrorStack m, Functor m) => m a -> m (Either ErrorStack a)
134+ withError u = catchError (Right <$> u) (return . Left)
136+ collectErrors :: (MonadError ErrorStack m, Functor m) => [Either ErrorStack a] -> m [a]
137+ collectErrors es = case lefts es of
138+ [err] -> throwError err
139+ [] -> return $ rights es
140+ errs -> throwError $ MultipleErrors errs