@@ -16,6 +16,7 @@ module Control.Monad.Validation
1616 , vWarningL
1717 , vZoom
1818 , vZoomL
19+ , vPromote
1920 , mmSingleton
2021 , setMempty
2122 , neConcat
@@ -143,12 +144,12 @@ neConcat f a
143144textErrors :: [Text] -> Maybe Text
144145textErrors = neConcat (\a b -> a <> ", " <> b)
145146
146−-- | Returns 'mempty' instead of error if no warnings have occured.
147+-- | Returns 'mempty' instead of error if no warnings have occurred.
147148-- Returns 'Nothing' as the second element of tuple if computation was
148149-- interrupted by 'vError'.
149150--
150151-- Returns all concatenated errors and warnings and the result if no
151−-- errors have occured (warnings could have occured).
152+-- errors have occurred (warnings could have occurred).
152153--
153154-- >>> :{
154155-- runValidationT $ do
@@ -174,7 +175,7 @@ runValidationT (ValidationT m) = do
174175 Right a -> (warnings, Just a)
175176
176177-- | Like 'runValidationT' but doesn't return the result
177−-- if any warning has occured.
178+-- if any warning has occurred.
178179--
179180-- >>> :{
180181-- runValidationTEither $ do
@@ -285,3 +286,12 @@ vZoomL
285286 -> ValidationT a m x
286287 -> ValidationT b m x
287288vZoomL l = vZoom (setMempty l)
289+
290+-- | Turn any warnings the have occurred into errors.
291+vPromote
292+ :: (Monad m, Monoid a, Eq a)
293+ => ValidationT a m x
294+ -> ValidationT a m x
295+vPromote m = do
296+ err <- lift $ runValidationTEither m
297+ either vError return err