<?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'><$></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'>>=></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'>=></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'>=></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'><*></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'>=></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'>>>=</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'>>>=</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'>>>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>=></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'>=></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'>=></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'>-></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'>=></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> <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'>=></span> <span class='hs-varid'>i</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-varid'>r</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-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'>=></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'><$></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'><$></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'>=></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'><*></span> <span class='hs-varid'>px</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varop'><$></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'><*></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'><$></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'><*></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'><*></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'><*></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'>-></span> <span class='hs-varid'>p</span> <span class='hs-varid'>i</span> <span class='hs-varop'><*></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'><*></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'><*></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'><*></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'>=></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'>>>=</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'>>>=</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'>>>=</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'>>>=</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'>>>=</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'>>>=</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'>>=></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'>>>=</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'>>>=</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'>>>=</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'>>>=</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'>=></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'>=></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'>=></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'>>></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'>=></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'>-></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'>-></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'>>>=</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'>-></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'>>></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'>=></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'><-</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'>-></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'>-></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 @>>@ 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'>=></span> <span class='hs-conid'>Finalize</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span> <span class='hs-keyglyph'>-></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'>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'>>></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'>>></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'>=></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>i</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-varid'>r</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-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'>=></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'>-></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'>>>=</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'>=></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-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'>=></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-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'>-></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'>=></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-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'>=></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'>-></span> <span class='hs-varid'>n</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</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-varid'>r</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'>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'>-></span> <span class='hs-varid'>n</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></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'>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'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>o1</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>o2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></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'>-></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'>=></span> <span class='hs-layout'>(</span><span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>>></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'>>></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'>>></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'>>></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>