module Data.Conduit.Types.Conduit
( ConduitResult (..)
, Conduit (..)
, ConduitPush
, ConduitClose
) where
import Control.Monad.Trans.Resource (ResourceT)
import Control.Monad (liftM)
type ConduitPush input m output = input -> ResourceT m (ConduitResult input m output)
type ConduitClose m output = ResourceT m [output]
data ConduitResult input m output =
Producing (Conduit input m output) [output]
| Finished (Maybe input) [output]
instance Monad m => Functor (ConduitResult input m) where
fmap f (Producing c o) = Producing (fmap f c) (fmap f o)
fmap f (Finished i o) = Finished i (fmap f o)
data Conduit input m output = Conduit
{ conduitPush :: ConduitPush input m output
, conduitClose :: ConduitClose m output
}
instance Monad m => Functor (Conduit input m) where
fmap f c = c
{ conduitPush = liftM (fmap f) . conduitPush c
, conduitClose = liftM (fmap f) (conduitClose c)
}