diff options
Diffstat (limited to 'TraversableT.hs')
-rw-r--r-- | TraversableT.hs | 22 |
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 @@ | |||
1 | module TraversableT where | ||
2 | |||
3 | import Data.Traversable | ||
4 | import Control.Monad (join) | ||
5 | |||
6 | newtype TraversableT m t a = TraversableT { runTraversableT :: m (t a) } | ||
7 | |||
8 | instance (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 | |||
16 | liftT :: Monad m => t a -> TraversableT m t a | ||
17 | liftT = TraversableT . return | ||
18 | |||
19 | liftMT :: m (t a) -> TraversableT m t a | ||
20 | liftMT = TraversableT | ||
21 | |||
22 | |||