module Precis.Utils
(
H
, snocH
, toListH
, onSuccess
, onSuccessM
) where
import Control.Monad
type H a = [a] -> [a]
snocH :: H a -> a -> H a
snocH f a = f . (a:)
toListH :: H a -> [a]
toListH = ($ [])
onSuccess :: Monad m => Either a b -> (b -> m c) -> m (Either a c)
onSuccess (Left a) _ = return (Left a)
onSuccess (Right b) mf = liftM Right $ mf b
onSuccessM :: Monad m => m (Either a b) -> (b -> m c) -> m (Either a c)
onSuccessM ma msk = ma >>= step
where
step (Left a) = return (Left a)
step (Right b) = liftM Right $ msk b