[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