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