packages feed

control-monad-free (empty) → 0.1

raw patch · 3 files changed

+41/−0 lines, 3 filesdep +basedep +mtlsetup-changed

Dependencies added: base, mtl

Files

+ Control/Monad/Free.hs view
@@ -0,0 +1,26 @@+module Control.Monad.Free (FreeT(..)) where++import Control.Applicative+import Control.Monad (liftM)+import Control.Monad.Trans++{- | @FreeT f@ is a monad transformer for free monads over a functor @f@. +-}+newtype FreeT f m a = FreeT { runFreeT :: m (Either a (f (FreeT f m a))) }++editEither l r = either (Left . l) (Right . r)+conj f = FreeT . f . runFreeT++instance (Functor f, Functor m) => Functor (FreeT f m) where+    fmap f = conj $ fmap (editEither f ((fmap.fmap) f))++instance (Functor f, Monad m) => Monad (FreeT f m) where+    return = FreeT . return . Left+    m >>= f = FreeT $ do+        r <- runFreeT m+        case r of+             Left x   -> runFreeT $ f x+             Right xc -> return . Right $ fmap (>>= f) xc++instance (Functor f) => MonadTrans (FreeT f) where+    lift = FreeT . liftM Left
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ control-monad-free.cabal view
@@ -0,0 +1,13 @@+Name: control-monad-free+Description:+    A monad transformer for free monads.+Version: 0.1+Stability: experimental+Synopsis: A monad transformer for free monads.+License: PublicDomain+Category: Control+Author: Luke Palmer+Maintainer: lrpalmer@gmail.com+Build-Type: Simple+Build-Depends: base, mtl+Exposed-Modules: Control.Monad.Free