add elimLift, suggested by Baldur Blöndal
authorRoss Paterson <ross@soi.city.ac.uk>
Thu, 16 Feb 2017 10:31:03 +0000 (10:31 +0000)
committerRoss Paterson <ross@soi.city.ac.uk>
Thu, 16 Feb 2017 10:31:03 +0000 (10:31 +0000)
Control/Applicative/Lift.hs

index 4ae107f..1ce3053 100644 (file)
@@ -23,6 +23,7 @@ module Control.Applicative.Lift (
     Lift(..),
     unLift,
     mapLift,
+    elimLift,
     -- * Collecting errors
     Errors,
     runErrors,
@@ -117,6 +118,16 @@ mapLift _ (Pure x) = Pure x
 mapLift f (Other e) = Other (f e)
 {-# INLINE mapLift #-}
 
+-- | Eliminator for 'Lift'.
+--
+-- * @'elimLift' f g . 'pure' = f@
+--
+-- * @'elimLift' f g . 'Other' = g@
+--
+elimLift :: (a -> r) -> (f a -> r) -> Lift f a -> r
+elimLift f _ (Pure x) = f x
+elimLift _ g (Other e) = g e
+
 -- | An applicative functor that collects a monoid (e.g. lists) of errors.
 -- A sequence of computations fails if any of its components do, but
 -- unlike monads made with 'ExceptT' from "Control.Monad.Trans.Except",