On Tue, Sep 25, 2012 at 06:43:49PM +0200, Agata Murawska wrote:
> This patch creates ResultT, a monad transformation used later in
> RPC <-> query integration.
> 
> Signed-off-by: Agata Murawska <[email protected]>
> ---
>  htools/Ganeti/BasicTypes.hs |   26 ++++++++++++++++++++++++++
>  1 files changed, 26 insertions(+), 0 deletions(-)
> 
> diff --git a/htools/Ganeti/BasicTypes.hs b/htools/Ganeti/BasicTypes.hs
> index 61a7e56..2402114 100644
> --- a/htools/Ganeti/BasicTypes.hs
> +++ b/htools/Ganeti/BasicTypes.hs
> @@ -21,6 +21,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
> MA
>  
>  module Ganeti.BasicTypes
>    ( Result(..)
> +  , ResultT(..)
> +  , resultT
>    , isOk
>    , isBad
>    , eitherToResult
> @@ -38,6 +40,7 @@ module Ganeti.BasicTypes
>  
>  import Control.Applicative
>  import Control.Monad
> +import Control.Monad.Trans
>  import Data.Function
>  import Data.List
>  
> @@ -75,6 +78,29 @@ instance Applicative Result where
>    _       <*> (Bad x) = Bad x
>    (Ok f)  <*> (Ok x)  = Ok $ f x
>  
> +-- | This is a monad transformation for Result. It's implementation is
> +-- based on the implementations of MaybeT and ErrorT.
> +newtype ResultT m a = ResultT {runResultT :: m (Result a)}
> +
> +instance (Monad m) => Monad (ResultT m) where
> +  fail err = ResultT (return $ Bad err)
> +  return = lift . return
> +  x >>= f = ResultT $ do

I wouldn't mind a bit of nicer alignment here on "=" :)

> +              a <- runResultT x
> +              case a of
> +                Ok val -> runResultT $ f val
> +                Bad err -> return $ Bad err
> +
> +instance MonadTrans ResultT where
> +  lift x = ResultT (liftM Ok x)
> +
> +instance (MonadIO m) => MonadIO (ResultT m) where
> +  liftIO = lift . liftIO
> +
> +-- | Lift a `Maybe` value to a `MaybeT`.

Typo in docstring?

No need to resend, LGTM.

iustin

Reply via email to