Run Pipes

Each implementation must supply its own runPipe function since it is
the only non-polymorphic Pipe function and the compiler uses it to
select which underlying proxy implementation to use.

Upgrade Pipes to Proxies

You can upgrade classic Pipe code to work with the proxy ecosystem in
steps. Each change enables greater interoperability with proxy utilities
and transformers and if time permits you should implement the entire upgrade
for your libraries if you want to take advantage of proxy standard
libraries.

Then replace the ProxyFast in the type signature with a type variable p
constrained by the Proxy type class:

fromList :: (Monad m, Proxy p) => [b] -> () -> Producer p b m ()

This change upgrades your Pipe to work natively within proxies and proxy
transformers, without any manual conversion or lifting. You can now compose
or sequence your Pipe within any feature set transparently.