Sophie

Sophie

distrib > Fedora > 17 > i386 > media > updates > by-pkgid > 421b097eac9957a2de7d68ce938b447d > files > 65

ghc-conduit-devel-0.4.1.1-2.fc17.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>Data/Conduit/Internal.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# OPTIONS_HADDOCK not-home #-}</span>
<a name="line-2"></a><span class='hs-comment'>{-# OPTIONS_GHC -O2 #-}</span> <span class='hs-comment'>-- necessary to avoid some space leaks</span>
<a name="line-3"></a><span class='hs-comment'>{-# LANGUAGE FlexibleContexts #-}</span>
<a name="line-4"></a><span class='hs-comment'>{-# LANGUAGE FlexibleInstances #-}</span>
<a name="line-5"></a><span class='hs-comment'>{-# LANGUAGE MultiParamTypeClasses #-}</span>
<a name="line-6"></a><span class='hs-comment'>{-# LANGUAGE UndecidableInstances #-}</span>
<a name="line-7"></a><span class='hs-comment'>{-# LANGUAGE RankNTypes #-}</span>
<a name="line-8"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Conduit</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span>
<a name="line-9"></a>    <span class='hs-layout'>(</span> <span class='hs-comment'>-- * Types</span>
<a name="line-10"></a>      <span class='hs-conid'>Pipe</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-11"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>Source</span>
<a name="line-12"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>Sink</span>
<a name="line-13"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>Conduit</span>
<a name="line-14"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>Finalize</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-15"></a>      <span class='hs-comment'>-- * Functions</span>
<a name="line-16"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>pipeClose</span>
<a name="line-17"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>pipe</span>
<a name="line-18"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>pipeResume</span>
<a name="line-19"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>runPipe</span>
<a name="line-20"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>sinkToPipe</span>
<a name="line-21"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>await</span>
<a name="line-22"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>yield</span>
<a name="line-23"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>hasInput</span>
<a name="line-24"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>transPipe</span>
<a name="line-25"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mapOutput</span>
<a name="line-26"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>runFinalize</span>
<a name="line-27"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>addCleanup</span>
<a name="line-28"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-29"></a>
<a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;$&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>&gt;=&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftM</span><span class='hs-layout'>,</span> <span class='hs-varid'>ap</span><span class='hs-layout'>)</span>
<a name="line-32"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Trans</span><span class='hs-varop'>.</span><span class='hs-conid'>Class</span> <span class='hs-layout'>(</span><span class='hs-conid'>MonadTrans</span> <span class='hs-layout'>(</span><span class='hs-varid'>lift</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Class</span> <span class='hs-layout'>(</span><span class='hs-conid'>MonadIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>liftIO</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Base</span> <span class='hs-layout'>(</span><span class='hs-conid'>MonadBase</span> <span class='hs-layout'>(</span><span class='hs-varid'>liftBase</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Void</span> <span class='hs-layout'>(</span><span class='hs-conid'>Void</span><span class='hs-layout'>,</span> <span class='hs-varid'>absurd</span><span class='hs-layout'>)</span>
<a name="line-36"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Monoid</span> <span class='hs-layout'>(</span><span class='hs-conid'>Monoid</span> <span class='hs-layout'>(</span><span class='hs-varid'>mappend</span><span class='hs-layout'>,</span> <span class='hs-varid'>mempty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Trans</span><span class='hs-varop'>.</span><span class='hs-conid'>Resource</span>
<a name="line-38"></a>
<a name="line-39"></a><a name="Finalize"></a><span class='hs-comment'>-- | A cleanup action to be performed.</span>
<a name="line-40"></a><a name="Finalize"></a><span class='hs-comment'>--</span>
<a name="line-41"></a><a name="Finalize"></a><span class='hs-comment'>-- Previously, we just had a plain action. However, most @Pipe@s simply have</span>
<a name="line-42"></a><a name="Finalize"></a><span class='hs-comment'>-- empty cleanup actions, and storing a large set of them wastes memory. But</span>
<a name="line-43"></a><a name="Finalize"></a><span class='hs-comment'>-- having strict fields and distinguishing between pure and impure actions, we</span>
<a name="line-44"></a><a name="Finalize"></a><span class='hs-comment'>-- can keep memory usage constant, and only allocate memory for the actual</span>
<a name="line-45"></a><a name="Finalize"></a><span class='hs-comment'>-- actions we have to track.</span>
<a name="line-46"></a><a name="Finalize"></a><span class='hs-comment'>--</span>
<a name="line-47"></a><a name="Finalize"></a><span class='hs-comment'>-- Since 0.4.1</span>
<a name="line-48"></a><a name="Finalize"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FinalizePure</span> <span class='hs-varid'>r</span>
<a name="line-49"></a>                  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>FinalizeM</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-50"></a>
<a name="line-51"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Functor</span> <span class='hs-layout'>(</span><span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-52"></a>    <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>FinalizePure</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FinalizePure</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-53"></a>    <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>FinalizeM</span> <span class='hs-varid'>mr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FinalizeM</span> <span class='hs-layout'>(</span><span class='hs-varid'>liftM</span> <span class='hs-varid'>f</span> <span class='hs-varid'>mr</span><span class='hs-layout'>)</span>
<a name="line-54"></a>
<a name="line-55"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-56"></a>    <span class='hs-varid'>pure</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FinalizePure</span>
<a name="line-57"></a>    <span class='hs-layout'>(</span><span class='hs-varop'>&lt;*&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ap</span>
<a name="line-58"></a>
<a name="line-59"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Monad</span> <span class='hs-layout'>(</span><span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-60"></a>    <span class='hs-varid'>return</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FinalizePure</span>
<a name="line-61"></a>    <span class='hs-conid'>FinalizePure</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span>
<a name="line-62"></a>    <span class='hs-conid'>FinalizeM</span> <span class='hs-varid'>mx</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FinalizeM</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mx</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-63"></a>        <span class='hs-keyword'>case</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>of</span>
<a name="line-64"></a>            <span class='hs-conid'>FinalizePure</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>y</span>
<a name="line-65"></a>            <span class='hs-conid'>FinalizeM</span> <span class='hs-varid'>my</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>my</span>
<a name="line-66"></a>
<a name="line-67"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadTrans</span> <span class='hs-conid'>Finalize</span> <span class='hs-keyword'>where</span>
<a name="line-68"></a>    <span class='hs-varid'>lift</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FinalizeM</span>
<a name="line-69"></a>
<a name="line-70"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadThrow</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadThrow</span> <span class='hs-layout'>(</span><span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-71"></a>    <span class='hs-varid'>monadThrow</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lift</span> <span class='hs-varop'>.</span> <span class='hs-varid'>monadThrow</span>
<a name="line-72"></a>
<a name="line-73"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadIO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-74"></a>    <span class='hs-varid'>liftIO</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lift</span> <span class='hs-varop'>.</span> <span class='hs-varid'>liftIO</span>
<a name="line-75"></a>
<a name="line-76"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadResource</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadResource</span> <span class='hs-layout'>(</span><span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-77"></a>    <span class='hs-varid'>allocate</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lift</span> <span class='hs-varop'>.</span> <span class='hs-varid'>allocate</span> <span class='hs-varid'>a</span>
<a name="line-78"></a>    <span class='hs-varid'>register</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lift</span> <span class='hs-varop'>.</span> <span class='hs-varid'>register</span>
<a name="line-79"></a>    <span class='hs-varid'>release</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lift</span> <span class='hs-varop'>.</span> <span class='hs-varid'>release</span>
<a name="line-80"></a>    <span class='hs-varid'>resourceMask</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lift</span> <span class='hs-varop'>.</span> <span class='hs-varid'>resourceMask</span>
<a name="line-81"></a>
<a name="line-82"></a><a name="Pipe"></a><span class='hs-comment'>-- | The underlying datatype for all the types in this package.  In has four</span>
<a name="line-83"></a><a name="Pipe"></a><span class='hs-comment'>-- type parameters:</span>
<a name="line-84"></a><a name="Pipe"></a><span class='hs-comment'>--</span>
<a name="line-85"></a><a name="Pipe"></a><span class='hs-comment'>-- * /i/ is the type of values for this @Pipe@'s input stream.</span>
<a name="line-86"></a><a name="Pipe"></a><span class='hs-comment'>--</span>
<a name="line-87"></a><a name="Pipe"></a><span class='hs-comment'>-- * /o/ is the type of values for this @Pipe@'s output stream.</span>
<a name="line-88"></a><a name="Pipe"></a><span class='hs-comment'>--</span>
<a name="line-89"></a><a name="Pipe"></a><span class='hs-comment'>-- * /m/ is the underlying monad.</span>
<a name="line-90"></a><a name="Pipe"></a><span class='hs-comment'>--</span>
<a name="line-91"></a><a name="Pipe"></a><span class='hs-comment'>-- * /r/ is the result type.</span>
<a name="line-92"></a><a name="Pipe"></a><span class='hs-comment'>--</span>
<a name="line-93"></a><a name="Pipe"></a><span class='hs-comment'>-- Note that /o/ and /r/ are inherently different. /o/ is the type of the</span>
<a name="line-94"></a><a name="Pipe"></a><span class='hs-comment'>-- stream of values this @Pipe@ will produce and send downstream. /r/ is the</span>
<a name="line-95"></a><a name="Pipe"></a><span class='hs-comment'>-- final output of this @Pipe@.</span>
<a name="line-96"></a><a name="Pipe"></a><span class='hs-comment'>--</span>
<a name="line-97"></a><a name="Pipe"></a><span class='hs-comment'>-- @Pipe@s can be composed via the 'pipe' function. To do so, the output type</span>
<a name="line-98"></a><a name="Pipe"></a><span class='hs-comment'>-- of the left pipe much match the input type of the left pipe, and the result</span>
<a name="line-99"></a><a name="Pipe"></a><span class='hs-comment'>-- type of the left pipe must be unit @()@. This is due to the fact that any</span>
<a name="line-100"></a><a name="Pipe"></a><span class='hs-comment'>-- result produced by the left pipe must be discarded in favor of the result of</span>
<a name="line-101"></a><a name="Pipe"></a><span class='hs-comment'>-- the right pipe.</span>
<a name="line-102"></a><a name="Pipe"></a><span class='hs-comment'>--</span>
<a name="line-103"></a><a name="Pipe"></a><span class='hs-comment'>-- Since 0.4.0</span>
<a name="line-104"></a><a name="Pipe"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span>
<a name="line-105"></a>    <span class='hs-comment'>-- | Provide new output to be sent downstream. This constructor has three</span>
<a name="line-106"></a>    <span class='hs-comment'>-- fields: the next @Pipe@ to be used, an early-closed function, and the</span>
<a name="line-107"></a>    <span class='hs-comment'>-- output value.</span>
<a name="line-108"></a>    <span class='hs-conid'>HaveOutput</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varid'>o</span>
<a name="line-109"></a>    <span class='hs-comment'>-- | Request more input from upstream. The first field takes a new input</span>
<a name="line-110"></a>    <span class='hs-comment'>-- value and provides a new @Pipe@. The second is for early termination. It</span>
<a name="line-111"></a>    <span class='hs-comment'>-- gives a new @Pipe@ which takes no input from upstream. This allows a</span>
<a name="line-112"></a>    <span class='hs-comment'>-- @Pipe@ to provide a final stream of output values after no more input is</span>
<a name="line-113"></a>    <span class='hs-comment'>-- available from upstream.</span>
<a name="line-114"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NeedInput</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-115"></a>    <span class='hs-comment'>-- | Processing with this @Pipe@ is complete. Provides an optional leftover</span>
<a name="line-116"></a>    <span class='hs-comment'>-- input value and and result.</span>
<a name="line-117"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Done</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span>
<a name="line-118"></a>    <span class='hs-comment'>-- | Require running of a monadic action to get the next @Pipe@. Second</span>
<a name="line-119"></a>    <span class='hs-comment'>-- field is an early cleanup function. Technically, this second field</span>
<a name="line-120"></a>    <span class='hs-comment'>-- could be skipped, but doing so would require extra operations to be</span>
<a name="line-121"></a>    <span class='hs-comment'>-- performed in some cases. For example, for a @Pipe@ pulling data from a</span>
<a name="line-122"></a>    <span class='hs-comment'>-- file, it may be forced to pull an extra, unneeded chunk before closing</span>
<a name="line-123"></a>    <span class='hs-comment'>-- the @Handle@.</span>
<a name="line-124"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>PipeM</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-125"></a>
<a name="line-126"></a><a name="Source"></a><span class='hs-comment'>-- | A @Pipe@ which provides a stream of output values, without consuming any</span>
<a name="line-127"></a><a name="Source"></a><span class='hs-comment'>-- input. The input parameter is set to @Void@ to indicate that this @Pipe@</span>
<a name="line-128"></a><a name="Source"></a><span class='hs-comment'>-- takes no input.  A @Source@ is not used to produce a final result, and thus</span>
<a name="line-129"></a><a name="Source"></a><span class='hs-comment'>-- the result parameter is set to @()@.</span>
<a name="line-130"></a><a name="Source"></a><span class='hs-comment'>--</span>
<a name="line-131"></a><a name="Source"></a><span class='hs-comment'>-- Since 0.4.0</span>
<a name="line-132"></a><a name="Source"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Source</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pipe</span> <span class='hs-conid'>Void</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-133"></a>
<a name="line-134"></a><a name="Sink"></a><span class='hs-comment'>-- | A @Pipe@ which consumes a stream of input values and produces a final</span>
<a name="line-135"></a><a name="Sink"></a><span class='hs-comment'>-- result. It cannot produce any output values, and thus the output parameter</span>
<a name="line-136"></a><a name="Sink"></a><span class='hs-comment'>-- is set to @Void@. In other words, it is impossible to create a @HaveOutput@</span>
<a name="line-137"></a><a name="Sink"></a><span class='hs-comment'>-- constructor for a @Sink@.</span>
<a name="line-138"></a><a name="Sink"></a><span class='hs-comment'>--</span>
<a name="line-139"></a><a name="Sink"></a><span class='hs-comment'>-- Since 0.4.0</span>
<a name="line-140"></a><a name="Sink"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Sink</span> <span class='hs-varid'>i</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-conid'>Void</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span>
<a name="line-141"></a>
<a name="line-142"></a><a name="Conduit"></a><span class='hs-comment'>-- | A @Pipe@ which consumes a stream of input values and produces a stream of</span>
<a name="line-143"></a><a name="Conduit"></a><span class='hs-comment'>-- output values. It does not produce a result value, and thus the result</span>
<a name="line-144"></a><a name="Conduit"></a><span class='hs-comment'>-- parameter is set to @()@.</span>
<a name="line-145"></a><a name="Conduit"></a><span class='hs-comment'>--</span>
<a name="line-146"></a><a name="Conduit"></a><span class='hs-comment'>-- Since 0.4.0</span>
<a name="line-147"></a><a name="Conduit"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Conduit</span> <span class='hs-varid'>i</span> <span class='hs-varid'>m</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-148"></a>
<a name="line-149"></a><a name="pipeClose"></a><span class='hs-comment'>-- | Perform any close actions available for the given @Pipe@.</span>
<a name="line-150"></a><span class='hs-comment'>--</span>
<a name="line-151"></a><span class='hs-comment'>-- Since 0.4.0</span>
<a name="line-152"></a><span class='hs-definition'>pipeClose</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span>
<a name="line-153"></a><span class='hs-definition'>pipeClose</span> <span class='hs-layout'>(</span><span class='hs-conid'>HaveOutput</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span>
<a name="line-154"></a><span class='hs-definition'>pipeClose</span> <span class='hs-layout'>(</span><span class='hs-conid'>NeedInput</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pipeClose</span> <span class='hs-varid'>p</span>
<a name="line-155"></a><span class='hs-definition'>pipeClose</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FinalizePure</span> <span class='hs-varid'>r</span>
<a name="line-156"></a><span class='hs-definition'>pipeClose</span> <span class='hs-layout'>(</span><span class='hs-conid'>PipeM</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span>
<a name="line-157"></a>
<a name="line-158"></a><a name="pipePush"></a><span class='hs-definition'>pipePush</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span>
<a name="line-159"></a><span class='hs-definition'>pipePush</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-conid'>HaveOutput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HaveOutput</span> <span class='hs-layout'>(</span><span class='hs-varid'>pipePush</span> <span class='hs-varid'>i</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span> <span class='hs-varid'>o</span>
<a name="line-160"></a><span class='hs-definition'>pipePush</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-conid'>NeedInput</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span> <span class='hs-varid'>i</span>
<a name="line-161"></a><span class='hs-definition'>pipePush</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Done</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span>
<a name="line-162"></a><span class='hs-definition'>pipePush</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-conid'>PipeM</span> <span class='hs-varid'>mp</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PipeM</span> <span class='hs-layout'>(</span><span class='hs-varid'>pipePush</span> <span class='hs-varid'>i</span> <span class='hs-varop'>`liftM`</span> <span class='hs-varid'>mp</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span>
<a name="line-163"></a>
<a name="line-164"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Functor</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-165"></a>    <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>HaveOutput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HaveOutput</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varop'>`liftM`</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-varid'>o</span>
<a name="line-166"></a>    <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>NeedInput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NeedInput</span> <span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-varop'>.</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-167"></a>    <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Done</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-168"></a>    <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PipeM</span> <span class='hs-varid'>mp</span> <span class='hs-varid'>mr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PipeM</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varop'>`liftM`</span> <span class='hs-varid'>mp</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varop'>`liftM`</span> <span class='hs-varid'>mr</span><span class='hs-layout'>)</span>
<a name="line-169"></a>
<a name="line-170"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-171"></a>    <span class='hs-varid'>pure</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Done</span> <span class='hs-conid'>Nothing</span>
<a name="line-172"></a>
<a name="line-173"></a>    <span class='hs-conid'>Done</span> <span class='hs-conid'>Nothing</span> <span class='hs-varid'>f</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>px</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>px</span>
<a name="line-174"></a>    <span class='hs-conid'>Done</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>f</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>px</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pipePush</span> <span class='hs-varid'>i</span> <span class='hs-varop'>$</span> <span class='hs-varid'>f</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>px</span>
<a name="line-175"></a>    <span class='hs-conid'>HaveOutput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-varid'>o</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>px</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HaveOutput</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>px</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span> <span class='hs-varop'>`ap`</span> <span class='hs-varid'>pipeClose</span> <span class='hs-varid'>px</span><span class='hs-layout'>)</span> <span class='hs-varid'>o</span>
<a name="line-176"></a>    <span class='hs-conid'>NeedInput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>px</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NeedInput</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>p</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>px</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>px</span><span class='hs-layout'>)</span>
<a name="line-177"></a>    <span class='hs-conid'>PipeM</span> <span class='hs-varid'>mp</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>px</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PipeM</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>px</span><span class='hs-layout'>)</span> <span class='hs-varop'>`liftM`</span> <span class='hs-varid'>mp</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span> <span class='hs-varop'>`ap`</span> <span class='hs-varid'>pipeClose</span> <span class='hs-varid'>px</span><span class='hs-layout'>)</span>
<a name="line-178"></a>
<a name="line-179"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Monad</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-180"></a>    <span class='hs-varid'>return</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Done</span> <span class='hs-conid'>Nothing</span>
<a name="line-181"></a>
<a name="line-182"></a>    <span class='hs-conid'>Done</span> <span class='hs-conid'>Nothing</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fp</span> <span class='hs-varid'>x</span>
<a name="line-183"></a>    <span class='hs-conid'>Done</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pipePush</span> <span class='hs-varid'>i</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fp</span> <span class='hs-varid'>x</span>
<a name="line-184"></a>    <span class='hs-conid'>HaveOutput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-varid'>o</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HaveOutput</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>fp</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>pipeClose</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fp</span><span class='hs-layout'>)</span> <span class='hs-varid'>o</span>
<a name="line-185"></a>    <span class='hs-conid'>NeedInput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NeedInput</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varop'>&gt;=&gt;</span> <span class='hs-varid'>fp</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>fp</span><span class='hs-layout'>)</span>
<a name="line-186"></a>    <span class='hs-conid'>PipeM</span> <span class='hs-varid'>mp</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PipeM</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>fp</span><span class='hs-layout'>)</span> <span class='hs-varop'>`liftM`</span> <span class='hs-varid'>mp</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>pipeClose</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fp</span><span class='hs-layout'>)</span>
<a name="line-187"></a>
<a name="line-188"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadBase</span> <span class='hs-varid'>base</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadBase</span> <span class='hs-varid'>base</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-189"></a>    <span class='hs-varid'>liftBase</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lift</span> <span class='hs-varop'>.</span> <span class='hs-varid'>liftBase</span>
<a name="line-190"></a>
<a name="line-191"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadTrans</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-192"></a>    <span class='hs-varid'>lift</span> <span class='hs-varid'>mr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PipeM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-conid'>Nothing</span> <span class='hs-varop'>`liftM`</span> <span class='hs-varid'>mr</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>FinalizeM</span> <span class='hs-varid'>mr</span><span class='hs-layout'>)</span>
<a name="line-193"></a>
<a name="line-194"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadIO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-195"></a>    <span class='hs-varid'>liftIO</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lift</span> <span class='hs-varop'>.</span> <span class='hs-varid'>liftIO</span>
<a name="line-196"></a>
<a name="line-197"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Monoid</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-198"></a>    <span class='hs-varid'>mempty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-199"></a>    <span class='hs-varid'>mappend</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varop'>&gt;&gt;</span><span class='hs-layout'>)</span>
<a name="line-200"></a>
<a name="line-201"></a><a name="pipe"></a><span class='hs-comment'>-- | Compose a left and right pipe together into a complete pipe. The left pipe</span>
<a name="line-202"></a><span class='hs-comment'>-- will be automatically closed when the right pipe finishes, and any leftovers</span>
<a name="line-203"></a><span class='hs-comment'>-- from the right pipe will be discarded.</span>
<a name="line-204"></a><span class='hs-comment'>--</span>
<a name="line-205"></a><span class='hs-comment'>-- This is in fact a wrapper around 'pipeResume'. This function closes the left</span>
<a name="line-206"></a><span class='hs-comment'>-- @Pipe@ returns by @pipeResume@ and returns only the result.</span>
<a name="line-207"></a><span class='hs-comment'>--</span>
<a name="line-208"></a><span class='hs-comment'>-- Since 0.4.0</span>
<a name="line-209"></a><span class='hs-definition'>pipe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>b</span> <span class='hs-varid'>c</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>a</span> <span class='hs-varid'>c</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span>
<a name="line-210"></a><span class='hs-definition'>pipe</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pipeResume</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>l'</span><span class='hs-layout'>,</span> <span class='hs-varid'>res</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>lift</span> <span class='hs-layout'>(</span><span class='hs-varid'>runFinalize</span> <span class='hs-varop'>$</span> <span class='hs-varid'>pipeClose</span> <span class='hs-varid'>l'</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>res</span>
<a name="line-211"></a>
<a name="line-212"></a><a name="pipeResume"></a><span class='hs-comment'>-- | Same as 'pipe', but retain both the new left pipe and the leftovers from</span>
<a name="line-213"></a><span class='hs-comment'>-- the right pipe. The two components are combined together into a single pipe</span>
<a name="line-214"></a><span class='hs-comment'>-- and returned, together with the result of the right pipe.</span>
<a name="line-215"></a><span class='hs-comment'>--</span>
<a name="line-216"></a><span class='hs-comment'>-- Note: we're biased towards checking the right side first to avoid pulling</span>
<a name="line-217"></a><span class='hs-comment'>-- extra data which is not needed. Doing so could cause data loss.</span>
<a name="line-218"></a><span class='hs-comment'>--</span>
<a name="line-219"></a><span class='hs-comment'>-- Since 0.4.0</span>
<a name="line-220"></a><span class='hs-definition'>pipeResume</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>b</span> <span class='hs-varid'>c</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>a</span> <span class='hs-varid'>c</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pipe</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span><span class='hs-layout'>,</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-221"></a><span class='hs-definition'>pipeResume</span> <span class='hs-varid'>left</span> <span class='hs-varid'>right</span> <span class='hs-keyglyph'>=</span>
<a name="line-222"></a>    <span class='hs-comment'>-- We're using a case statement instead of pattern matching in the function</span>
<a name="line-223"></a>    <span class='hs-comment'>-- itself to make the logic explicit. We first check the right pipe, and</span>
<a name="line-224"></a>    <span class='hs-comment'>-- only if the right pipe is asking for more input do we process the left</span>
<a name="line-225"></a>    <span class='hs-comment'>-- pipe.</span>
<a name="line-226"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>right</span> <span class='hs-keyword'>of</span>
<a name="line-227"></a>        <span class='hs-comment'>-- Right pipe is done, grab leftovers and the left pipe</span>
<a name="line-228"></a>        <span class='hs-conid'>Done</span> <span class='hs-varid'>leftoverr</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-229"></a>            <span class='hs-comment'>-- Get any leftovers from the left pipe, the current state of the</span>
<a name="line-230"></a>            <span class='hs-comment'>-- left pipe (sans leftovers), and a close action for the left</span>
<a name="line-231"></a>            <span class='hs-comment'>-- pipe.</span>
<a name="line-232"></a>            <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>leftover</span><span class='hs-layout'>,</span> <span class='hs-varid'>left'</span><span class='hs-layout'>,</span> <span class='hs-varid'>leftClose</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-233"></a>                    <span class='hs-keyword'>case</span> <span class='hs-varid'>left</span> <span class='hs-keyword'>of</span>
<a name="line-234"></a>                        <span class='hs-conid'>Done</span> <span class='hs-varid'>leftoverl</span> <span class='hs-conid'>()</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>leftoverl</span><span class='hs-layout'>,</span> <span class='hs-conid'>Done</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>()</span><span class='hs-layout'>,</span> <span class='hs-conid'>FinalizePure</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-235"></a>                        <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span> <span class='hs-varid'>left</span><span class='hs-layout'>,</span> <span class='hs-varid'>pipeClose</span> <span class='hs-varid'>left</span><span class='hs-layout'>)</span>
<a name="line-236"></a>            <span class='hs-comment'>-- Combine the current state of the left pipe with any leftovers</span>
<a name="line-237"></a>            <span class='hs-comment'>-- from the right pipe.</span>
<a name="line-238"></a>                <span class='hs-varid'>left''</span> <span class='hs-keyglyph'>=</span>
<a name="line-239"></a>                    <span class='hs-keyword'>case</span> <span class='hs-varid'>leftoverr</span> <span class='hs-keyword'>of</span>
<a name="line-240"></a>                        <span class='hs-conid'>Just</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HaveOutput</span> <span class='hs-varid'>left'</span> <span class='hs-varid'>leftClose</span> <span class='hs-varid'>a</span>
<a name="line-241"></a>                        <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>left'</span>
<a name="line-242"></a>            <span class='hs-comment'>-- Return the leftovers, the final left pipe state, and the result.</span>
<a name="line-243"></a>             <span class='hs-keyword'>in</span> <span class='hs-conid'>Done</span> <span class='hs-varid'>leftover</span> <span class='hs-layout'>(</span><span class='hs-varid'>left''</span><span class='hs-layout'>,</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-244"></a>
<a name="line-245"></a>        <span class='hs-comment'>-- Right pipe needs to run a monadic action.</span>
<a name="line-246"></a>        <span class='hs-conid'>PipeM</span> <span class='hs-varid'>mp</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PipeM</span>
<a name="line-247"></a>            <span class='hs-layout'>(</span><span class='hs-varid'>pipeResume</span> <span class='hs-varid'>left</span> <span class='hs-varop'>`liftM`</span> <span class='hs-varid'>mp</span><span class='hs-layout'>)</span>
<a name="line-248"></a>            <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-conid'>(,)</span> <span class='hs-varid'>left</span><span class='hs-layout'>)</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-249"></a>
<a name="line-250"></a>        <span class='hs-comment'>-- Right pipe has some output, provide it downstream and continue.</span>
<a name="line-251"></a>        <span class='hs-conid'>HaveOutput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HaveOutput</span>
<a name="line-252"></a>            <span class='hs-layout'>(</span><span class='hs-varid'>pipeResume</span> <span class='hs-varid'>left</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-253"></a>            <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-conid'>(,)</span> <span class='hs-varid'>left</span><span class='hs-layout'>)</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-254"></a>            <span class='hs-varid'>o</span>
<a name="line-255"></a>
<a name="line-256"></a>        <span class='hs-comment'>-- Right pipe needs input, so let's get it</span>
<a name="line-257"></a>        <span class='hs-conid'>NeedInput</span> <span class='hs-varid'>rp</span> <span class='hs-varid'>rc</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-258"></a>            <span class='hs-keyword'>case</span> <span class='hs-varid'>left</span> <span class='hs-keyword'>of</span>
<a name="line-259"></a>                <span class='hs-comment'>-- Left pipe has output, right pipe wants it.</span>
<a name="line-260"></a>                <span class='hs-conid'>HaveOutput</span> <span class='hs-varid'>lp</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pipeResume</span> <span class='hs-varid'>lp</span> <span class='hs-varop'>$</span> <span class='hs-varid'>rp</span> <span class='hs-varid'>a</span>
<a name="line-261"></a>
<a name="line-262"></a>                <span class='hs-comment'>-- Left pipe needs more input, ask for it.</span>
<a name="line-263"></a>                <span class='hs-conid'>NeedInput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NeedInput</span>
<a name="line-264"></a>                    <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pipeResume</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>right</span><span class='hs-layout'>)</span>
<a name="line-265"></a>                    <span class='hs-layout'>(</span><span class='hs-keyword'>do</span>
<a name="line-266"></a>                        <span class='hs-comment'>-- There is no more input available, so connect the</span>
<a name="line-267"></a>                        <span class='hs-comment'>-- no-more-input record with the right.</span>
<a name="line-268"></a>                        <span class='hs-layout'>(</span><span class='hs-varid'>left'</span><span class='hs-layout'>,</span> <span class='hs-varid'>res</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>pipeResume</span> <span class='hs-varid'>c</span> <span class='hs-varid'>right</span>
<a name="line-269"></a>
<a name="line-270"></a>                        <span class='hs-comment'>-- Theoretically, we could return the left' value as</span>
<a name="line-271"></a>                        <span class='hs-comment'>-- the first element in the tuple. However, it is not</span>
<a name="line-272"></a>                        <span class='hs-comment'>-- recommended to give input to a pipe after it has</span>
<a name="line-273"></a>                        <span class='hs-comment'>-- been told there is no more input. Instead, we close</span>
<a name="line-274"></a>                        <span class='hs-comment'>-- the pipe and return mempty in its place.</span>
<a name="line-275"></a>                        <span class='hs-varid'>lift</span> <span class='hs-varop'>$</span> <span class='hs-varid'>runFinalize</span> <span class='hs-varop'>$</span> <span class='hs-varid'>pipeClose</span> <span class='hs-varid'>left'</span>
<a name="line-276"></a>                        <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mempty</span><span class='hs-layout'>,</span> <span class='hs-varid'>res</span><span class='hs-layout'>)</span>
<a name="line-277"></a>                        <span class='hs-layout'>)</span>
<a name="line-278"></a>
<a name="line-279"></a>                <span class='hs-comment'>-- Left pipe is done, right pipe needs input. In such a case,</span>
<a name="line-280"></a>                <span class='hs-comment'>-- tell the right pipe there is no more input, and eventually</span>
<a name="line-281"></a>                <span class='hs-comment'>-- replace its leftovers with the left pipe's leftover.</span>
<a name="line-282"></a>                <span class='hs-conid'>Done</span> <span class='hs-varid'>l</span> <span class='hs-conid'>()</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>(,)</span> <span class='hs-varid'>mempty</span><span class='hs-layout'>)</span> <span class='hs-varop'>`liftM`</span> <span class='hs-varid'>replaceLeftover</span> <span class='hs-varid'>l</span> <span class='hs-varid'>rc</span>
<a name="line-283"></a>
<a name="line-284"></a>                <span class='hs-comment'>-- Left pipe needs to run a monadic action.</span>
<a name="line-285"></a>                <span class='hs-conid'>PipeM</span> <span class='hs-varid'>mp</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PipeM</span>
<a name="line-286"></a>                    <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>`pipeResume`</span> <span class='hs-varid'>right</span><span class='hs-layout'>)</span> <span class='hs-varop'>`liftM`</span> <span class='hs-varid'>mp</span><span class='hs-layout'>)</span>
<a name="line-287"></a>                    <span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-conid'>(,)</span> <span class='hs-varid'>mempty</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>combineFinalize</span> <span class='hs-varid'>c</span> <span class='hs-varop'>$</span> <span class='hs-varid'>pipeClose</span> <span class='hs-varid'>right</span><span class='hs-layout'>)</span>
<a name="line-288"></a>
<a name="line-289"></a><a name="combineFinalize"></a><span class='hs-comment'>-- | A minor optimization on @&gt;&gt;@ which does not cause any allocations for the</span>
<a name="line-290"></a><span class='hs-comment'>-- common case of missing left actions.</span>
<a name="line-291"></a><span class='hs-comment'>--</span>
<a name="line-292"></a><span class='hs-comment'>-- Since 0.4.1</span>
<a name="line-293"></a><span class='hs-definition'>combineFinalize</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span>
<a name="line-294"></a><span class='hs-definition'>combineFinalize</span> <span class='hs-layout'>(</span><span class='hs-conid'>FinalizePure</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span>
<a name="line-295"></a><span class='hs-definition'>combineFinalize</span> <span class='hs-layout'>(</span><span class='hs-conid'>FinalizeM</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>FinalizeM</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FinalizeM</span> <span class='hs-varop'>$</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>y</span>
<a name="line-296"></a><span class='hs-definition'>combineFinalize</span> <span class='hs-layout'>(</span><span class='hs-conid'>FinalizeM</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>FinalizePure</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FinalizeM</span> <span class='hs-varop'>$</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>y</span>
<a name="line-297"></a>
<a name="line-298"></a><a name="replaceLeftover"></a><span class='hs-definition'>replaceLeftover</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i'</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span>
<a name="line-299"></a><span class='hs-definition'>replaceLeftover</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Done</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span>
<a name="line-300"></a><span class='hs-definition'>replaceLeftover</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-conid'>HaveOutput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HaveOutput</span> <span class='hs-layout'>(</span><span class='hs-varid'>replaceLeftover</span> <span class='hs-varid'>l</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span> <span class='hs-varid'>o</span>
<a name="line-301"></a>
<a name="line-302"></a><span class='hs-comment'>-- This function is only called on pipes when there is no more input available.</span>
<a name="line-303"></a><span class='hs-comment'>-- Therefore, we can ignore the push record.</span>
<a name="line-304"></a><span class='hs-definition'>replaceLeftover</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-conid'>NeedInput</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>replaceLeftover</span> <span class='hs-varid'>l</span> <span class='hs-varid'>c</span>
<a name="line-305"></a>
<a name="line-306"></a><span class='hs-definition'>replaceLeftover</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-conid'>PipeM</span> <span class='hs-varid'>mp</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PipeM</span> <span class='hs-layout'>(</span><span class='hs-varid'>replaceLeftover</span> <span class='hs-varid'>l</span> <span class='hs-varop'>`liftM`</span> <span class='hs-varid'>mp</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span>
<a name="line-307"></a>
<a name="line-308"></a><a name="runPipe"></a><span class='hs-comment'>-- | Run a complete pipeline until processing completes.</span>
<a name="line-309"></a><span class='hs-comment'>--</span>
<a name="line-310"></a><span class='hs-comment'>-- Since 0.4.0</span>
<a name="line-311"></a><span class='hs-definition'>runPipe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-conid'>Void</span> <span class='hs-conid'>Void</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span>
<a name="line-312"></a><span class='hs-definition'>runPipe</span> <span class='hs-layout'>(</span><span class='hs-conid'>HaveOutput</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runFinalize</span> <span class='hs-varid'>c</span>
<a name="line-313"></a><span class='hs-definition'>runPipe</span> <span class='hs-layout'>(</span><span class='hs-conid'>NeedInput</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runPipe</span> <span class='hs-varid'>c</span>
<a name="line-314"></a><span class='hs-definition'>runPipe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>r</span>
<a name="line-315"></a><span class='hs-definition'>runPipe</span> <span class='hs-layout'>(</span><span class='hs-conid'>PipeM</span> <span class='hs-varid'>mp</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mp</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>runPipe</span>
<a name="line-316"></a>
<a name="line-317"></a><a name="runFinalize"></a><span class='hs-comment'>-- | Perform any necessary finalization actions.</span>
<a name="line-318"></a><span class='hs-comment'>--</span>
<a name="line-319"></a><span class='hs-comment'>-- Since 0.4.1</span>
<a name="line-320"></a><span class='hs-definition'>runFinalize</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span>
<a name="line-321"></a><span class='hs-definition'>runFinalize</span> <span class='hs-layout'>(</span><span class='hs-conid'>FinalizePure</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>r</span>
<a name="line-322"></a><span class='hs-definition'>runFinalize</span> <span class='hs-layout'>(</span><span class='hs-conid'>FinalizeM</span> <span class='hs-varid'>mr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mr</span>
<a name="line-323"></a>
<a name="line-324"></a><a name="yield"></a><span class='hs-comment'>-- | Send a single output value downstream.</span>
<a name="line-325"></a><span class='hs-comment'>--</span>
<a name="line-326"></a><span class='hs-comment'>-- Since 0.4.0</span>
<a name="line-327"></a><span class='hs-definition'>yield</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-328"></a><span class='hs-definition'>yield</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HaveOutput</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>FinalizePure</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-329"></a>
<a name="line-330"></a><a name="await"></a><span class='hs-comment'>-- | Wait for a single input value from upstream, and remove it from the</span>
<a name="line-331"></a><span class='hs-comment'>-- stream. Returns @Nothing@ if no more data is available.</span>
<a name="line-332"></a><span class='hs-comment'>--</span>
<a name="line-333"></a><span class='hs-comment'>-- Since 0.4.0</span>
<a name="line-334"></a><span class='hs-definition'>await</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
<a name="line-335"></a><span class='hs-definition'>await</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NeedInput</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-conid'>Nothing</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Just</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-336"></a>
<a name="line-337"></a><a name="hasInput"></a><span class='hs-comment'>-- | Check if input is available from upstream. Will not remove the data from</span>
<a name="line-338"></a><span class='hs-comment'>-- the stream.</span>
<a name="line-339"></a><span class='hs-comment'>--</span>
<a name="line-340"></a><span class='hs-comment'>-- Since 0.4.0</span>
<a name="line-341"></a><span class='hs-definition'>hasInput</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-conid'>Bool</span>
<a name="line-342"></a><span class='hs-definition'>hasInput</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NeedInput</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Done</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-conid'>True</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span>
<a name="line-343"></a>
<a name="line-344"></a><a name="sinkToPipe"></a><span class='hs-comment'>-- | A @Sink@ has a @Void@ type parameter for the output, which makes it</span>
<a name="line-345"></a><span class='hs-comment'>-- difficult to compose with @Source@s and @Conduit@s. This function replaces</span>
<a name="line-346"></a><span class='hs-comment'>-- that parameter with a free variable. This function is essentially @id@; it</span>
<a name="line-347"></a><span class='hs-comment'>-- only modifies the types, not the actions performed.</span>
<a name="line-348"></a><span class='hs-comment'>--</span>
<a name="line-349"></a><span class='hs-comment'>-- Since 0.4.0</span>
<a name="line-350"></a><span class='hs-definition'>sinkToPipe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Sink</span> <span class='hs-varid'>i</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span>
<a name="line-351"></a><span class='hs-definition'>sinkToPipe</span> <span class='hs-layout'>(</span><span class='hs-conid'>HaveOutput</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>absurd</span> <span class='hs-varid'>o</span>
<a name="line-352"></a><span class='hs-definition'>sinkToPipe</span> <span class='hs-layout'>(</span><span class='hs-conid'>NeedInput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NeedInput</span> <span class='hs-layout'>(</span><span class='hs-varid'>sinkToPipe</span> <span class='hs-varop'>.</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>sinkToPipe</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-353"></a><span class='hs-definition'>sinkToPipe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-varid'>i</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Done</span> <span class='hs-varid'>i</span> <span class='hs-varid'>r</span>
<a name="line-354"></a><span class='hs-definition'>sinkToPipe</span> <span class='hs-layout'>(</span><span class='hs-conid'>PipeM</span> <span class='hs-varid'>mp</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PipeM</span> <span class='hs-layout'>(</span><span class='hs-varid'>liftM</span> <span class='hs-varid'>sinkToPipe</span> <span class='hs-varid'>mp</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span>
<a name="line-355"></a>
<a name="line-356"></a><a name="transPipe"></a><span class='hs-comment'>-- | Transform the monad that a @Pipe@ lives in.</span>
<a name="line-357"></a><span class='hs-comment'>--</span>
<a name="line-358"></a><span class='hs-comment'>-- Since 0.4.0</span>
<a name="line-359"></a><span class='hs-definition'>transPipe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>n</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>n</span> <span class='hs-varid'>r</span>
<a name="line-360"></a><span class='hs-definition'>transPipe</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>HaveOutput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HaveOutput</span> <span class='hs-layout'>(</span><span class='hs-varid'>transPipe</span> <span class='hs-varid'>f</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>transFinalize</span> <span class='hs-varid'>f</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-varid'>o</span>
<a name="line-361"></a><span class='hs-definition'>transPipe</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>NeedInput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NeedInput</span> <span class='hs-layout'>(</span><span class='hs-varid'>transPipe</span> <span class='hs-varid'>f</span> <span class='hs-varop'>.</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>transPipe</span> <span class='hs-varid'>f</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-362"></a><span class='hs-definition'>transPipe</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-varid'>i</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Done</span> <span class='hs-varid'>i</span> <span class='hs-varid'>r</span>
<a name="line-363"></a><span class='hs-definition'>transPipe</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PipeM</span> <span class='hs-varid'>mp</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PipeM</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varop'>$</span> <span class='hs-varid'>liftM</span> <span class='hs-layout'>(</span><span class='hs-varid'>transPipe</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varid'>mp</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>transFinalize</span> <span class='hs-varid'>f</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-364"></a>
<a name="line-365"></a><a name="transFinalize"></a><span class='hs-definition'>transFinalize</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>n</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Finalize</span> <span class='hs-varid'>n</span> <span class='hs-varid'>r</span>
<a name="line-366"></a><span class='hs-definition'>transFinalize</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>FinalizePure</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FinalizePure</span> <span class='hs-varid'>r</span>
<a name="line-367"></a><span class='hs-definition'>transFinalize</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>FinalizeM</span> <span class='hs-varid'>mr</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FinalizeM</span> <span class='hs-varop'>$</span> <span class='hs-varid'>f</span> <span class='hs-varid'>mr</span>
<a name="line-368"></a>
<a name="line-369"></a><a name="mapOutput"></a><span class='hs-comment'>-- | Apply a function to all the output values of a `Pipe`.</span>
<a name="line-370"></a><span class='hs-comment'>--</span>
<a name="line-371"></a><span class='hs-comment'>-- This mimics the behavior of `fmap` for a `Source` and `Conduit` in pre-0.4</span>
<a name="line-372"></a><span class='hs-comment'>-- days.</span>
<a name="line-373"></a><span class='hs-comment'>--</span>
<a name="line-374"></a><span class='hs-comment'>-- Since 0.4.1</span>
<a name="line-375"></a><span class='hs-definition'>mapOutput</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>o1</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>o2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o1</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o2</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span>
<a name="line-376"></a><span class='hs-definition'>mapOutput</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>HaveOutput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HaveOutput</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapOutput</span> <span class='hs-varid'>f</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span>
<a name="line-377"></a><span class='hs-definition'>mapOutput</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>NeedInput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NeedInput</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapOutput</span> <span class='hs-varid'>f</span> <span class='hs-varop'>.</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapOutput</span> <span class='hs-varid'>f</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-378"></a><span class='hs-definition'>mapOutput</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-varid'>i</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Done</span> <span class='hs-varid'>i</span> <span class='hs-varid'>r</span>
<a name="line-379"></a><span class='hs-definition'>mapOutput</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>PipeM</span> <span class='hs-varid'>mp</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PipeM</span> <span class='hs-layout'>(</span><span class='hs-varid'>liftM</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapOutput</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varid'>mp</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span>
<a name="line-380"></a>
<a name="line-381"></a><a name="addCleanup"></a><span class='hs-comment'>-- | Add some code to be run when the given @Pipe@ cleans up.</span>
<a name="line-382"></a><span class='hs-comment'>--</span>
<a name="line-383"></a><span class='hs-comment'>-- Since 0.4.1</span>
<a name="line-384"></a><span class='hs-definition'>addCleanup</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span>
<a name="line-385"></a>           <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ @True@ if @Pipe@ ran to completion, @False@ for early termination.</span>
<a name="line-386"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span>
<a name="line-387"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Pipe</span> <span class='hs-varid'>i</span> <span class='hs-varid'>o</span> <span class='hs-varid'>m</span> <span class='hs-varid'>r</span>
<a name="line-388"></a><span class='hs-definition'>addCleanup</span> <span class='hs-varid'>cleanup</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-varid'>leftover</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PipeM</span>
<a name="line-389"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>cleanup</span> <span class='hs-conid'>True</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Done</span> <span class='hs-varid'>leftover</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-390"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>lift</span> <span class='hs-layout'>(</span><span class='hs-varid'>cleanup</span> <span class='hs-conid'>True</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-391"></a><span class='hs-definition'>addCleanup</span> <span class='hs-varid'>cleanup</span> <span class='hs-layout'>(</span><span class='hs-conid'>HaveOutput</span> <span class='hs-varid'>src</span> <span class='hs-varid'>close</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HaveOutput</span>
<a name="line-392"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>addCleanup</span> <span class='hs-varid'>cleanup</span> <span class='hs-varid'>src</span><span class='hs-layout'>)</span>
<a name="line-393"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>lift</span> <span class='hs-layout'>(</span><span class='hs-varid'>cleanup</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>close</span><span class='hs-layout'>)</span>
<a name="line-394"></a>    <span class='hs-varid'>x</span>
<a name="line-395"></a><span class='hs-definition'>addCleanup</span> <span class='hs-varid'>cleanup</span> <span class='hs-layout'>(</span><span class='hs-conid'>PipeM</span> <span class='hs-varid'>msrc</span> <span class='hs-varid'>close</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PipeM</span>
<a name="line-396"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>liftM</span> <span class='hs-layout'>(</span><span class='hs-varid'>addCleanup</span> <span class='hs-varid'>cleanup</span><span class='hs-layout'>)</span> <span class='hs-varid'>msrc</span><span class='hs-layout'>)</span>
<a name="line-397"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>lift</span> <span class='hs-layout'>(</span><span class='hs-varid'>cleanup</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>close</span><span class='hs-layout'>)</span>
<a name="line-398"></a><span class='hs-definition'>addCleanup</span> <span class='hs-varid'>cleanup</span> <span class='hs-layout'>(</span><span class='hs-conid'>NeedInput</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NeedInput</span>
<a name="line-399"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>addCleanup</span> <span class='hs-varid'>cleanup</span> <span class='hs-varop'>.</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-400"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>addCleanup</span> <span class='hs-varid'>cleanup</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
</pre></body>
</html>