[Haskell-cafe] ANNOUNCE: pipes-core 0.1.0

Paolo Capriotti p.capriotti at gmail.com
Wed Apr 18 00:11:55 CEST 2012

On Tue, Apr 17, 2012 at 4:10 PM, Chris Smith <cdsmith at gmail.com> wrote:
> One thing that Gabriel and
> Michael have been talking about, though, that seems to be missing
> here, is a way for a pipe to indicate that it's finished with its
> upstream portion, so that upstream finalizers can be immediately run
> without waiting for the downstream parts of the pipe to complete.

Yes, that is indeed a limitation of pipes-core, but it's still
possible to achieve early finalization when needed, by explicitly
returning a "continuation" pipe. The following operator

(>!>) :: Monad m
      => Pipe a b m r
      -> Pipe b c m (Pipe a c m r)
      -> Pipe a c m r
p1 >!> p2 = do
  r0 <- (Left <$> p1) >+> (Right <$> p2)
  case r0 of
    Left r -> return r
    Right p' -> p'

could be used to compose such a pipe. Alternatively, one can use
'Control.Pipe.Zip.controllable' together with 'loopP' (there's a
similar example in pipes-extra/Examples/finalizers/complex.hs).

Unfortunately, both approaches are not compositional. They require you
to structure the whole pipeline around them.

I suspect it might be possible to incorporate these ideas into the
Pipe type without losing associativity, but I don't have any
motivating examples where this feature would actually be useful. Do
you have anything in mind, Chris?


More information about the Haskell-Cafe mailing list