summaryrefslogtreecommitdiff
path: root/TraversableT.hs
diff options
context:
space:
mode:
Diffstat (limited to 'TraversableT.hs')
-rw-r--r--TraversableT.hs22
1 files changed, 22 insertions, 0 deletions
diff --git a/TraversableT.hs b/TraversableT.hs
new file mode 100644
index 00000000..6446fcc9
--- /dev/null
+++ b/TraversableT.hs
@@ -0,0 +1,22 @@
1module TraversableT where
2
3import Data.Traversable
4import Control.Monad (join)
5
6newtype TraversableT m t a = TraversableT { runTraversableT :: m (t a) }
7
8instance (Monad m, Traversable t, Monad t) => Monad (TraversableT m t) where
9 return = TraversableT . return . return
10 m >>= k = TraversableT $ do
11 a <- runTraversableT m
12 b <- forM a $ runTraversableT . k
13 return (join b)
14 fail s = TraversableT $ return (fail s)
15
16liftT :: Monad m => t a -> TraversableT m t a
17liftT = TraversableT . return
18
19liftMT :: m (t a) -> TraversableT m t a
20liftMT = TraversableT
21
22