summaryrefslogtreecommitdiff
path: root/TraversableT.hs
blob: 6446fcc908bf8fccc5deb5650fcea89b2e2ff11d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
module TraversableT where

import Data.Traversable
import Control.Monad (join)

newtype TraversableT m t a = TraversableT { runTraversableT :: m (t a) }

instance (Monad m, Traversable t, Monad t) => Monad (TraversableT m t) where
    return = TraversableT . return . return
    m >>= k  = TraversableT $ do
        a <- runTraversableT m
        b <- forM a $ runTraversableT . k
        return (join b)
    fail s = TraversableT $ return (fail s)

liftT :: Monad m => t a -> TraversableT m t a
liftT = TraversableT . return

liftMT :: m (t a) -> TraversableT m t a
liftMT = TraversableT