[Haskell-cafe] addCatch in conduit

Yitzchak Gale gale at sefer.org
Wed Nov 5 16:44:11 UTC 2014


In getting the dtd library to compile with recent versions
of conduit (yes, I know that it's deprecated and Michael
longer supports it, but we still need it), we came across
the following bit of code:

    -- (snip) --
    CI.ConduitM $ addCatch $ CI.unConduitM src0
  where
    -- (snip) --
    addCatch :: (MonadThrow m, MonadBaseControl IO m)
             => CI.Pipe l i o u m r
             -> CI.Pipe l i o u m r
    addCatch (CI.HaveOutput src close x) = CI.HaveOutput (addCatch
src) (addCatch' close) x
    addCatch (CI.NeedInput p c) = CI.NeedInput (addCatch . p) (addCatch . c)
    addCatch (CI.Done r) = CI.Done r
    addCatch (CI.PipeM msrc) = CI.PipeM (addCatch' $ liftM addCatch msrc)
    addCatch (CI.Leftover p i) = CI.Leftover (addCatch p) i

    addCatch' m = m `Lifted.catch` throw rr

We adapted it to the new ConduitM type simply by changing
the first line to:

    CI.ConduitM $ addCatch . CI.unConduitM src0

Not bad, a diff of exactly one character. It compiles and seems
to work. Does this sound reasonable?

Obviously, we would love to get rid of this use of conduit internals.
addCatch seems like a general operation, not specific to this
library. Is there a way to do this in modern conduit without dipping
into internals? If not - can we propose to add it?

Thanks,
Yitz


More information about the Haskell-Cafe mailing list