?]      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\*8A computation that produces values and puts them into a  is called . *A computation that consumes values from a  is called . A  is the write-only end of a  communication channel. ]A  is the read-only end of a  communication channel. ^_`abcdefghijkm represents the type of monadic computations that can be split into co-routining computations using function  . The context7 type parameter delimits the scope of the computation. lm Function 3 lifts a value of the underlying monad type into a  computation.  Function J runs the given computation involving pipes and returns the final result.  The contextF argument ensures that no suspended computation can escape its scope. The < function splits the computation into two concurrent parts, producer and consumer. The producer is  given a  to put values into, and consumer a 7 to get those values from. Once producer and consumer  both complete,  returns their paired results. The  function is same as +, with an additional description argument. nopq  Function  % tries to get a value from the given  argument. The intervening  computations suspend  all the way to the < function invocation that created the source. The result of   is r iff the  argument source is empty. Success continuation  Function  ; tries to put a value into the given sink. The intervening  computations suspend up to the  > invocation that has created the argument sink. The result of  + indicates whether the operation succeded.  Function  = checks if the argument sink accepts values, i.e., whether a   operation would succeed on the  sink.   copies all data from the source argument into the sink0 argument, as long as there is anything to copy  and the sink accepts it.  is similar to  2 except it distributes every input value from the source arguments into both sink1  and sink2.  puts entire list into its sinkB argument, as long as the sink accepts it. The remainder that wasn't + accepted by the sink is the result value. 9 returns the list of all values generated by the source. > consumes the entire source ignoring the values it generates. SA utility function wrapping if-then-else, useful for handling monadic truth values [A utility function, useful for handling monadic list values where empty list means success s    The a type represents computations that distribute data acording to some criteria. A splitter should q distribute only the original input data, and feed it into the sinks in the same order it has been read from the o source. If the two sink arguments of a splitter are the same, the splitter must act as an identity transform. The H type represents computations that transform data and return no result. a A transducer must continue consuming the given source and feeding the sink while there is data.  Function X takes a function that maps one input value to one output value each, and lifts it into  a .  Function N takes a function that maps one input value into a list of output values, and  lifts it into a .  Function W creates a stateful transducer that produces only one output value after consuming the  entire input. Similar to Data.List.foldl  Function  constructs a 2 from a state-transition function and the initial U state. The transition function may produce arbitrary output at any transition step.  Function T takes a function that assigns a Boolean value to each input item and lifts it into  a   Function  > lifts a simple, non-sectioning splitter function into a full  ! Function !2 lifts a sectioning splitter function into a full   ! ! !" Consumer "3 copies the given source into the standard output. #$ Producer $/ feeds the given sink from the standard input. % Producer %B opens the named file and feeds the given sink from its contents. & Producer &) feeds the given sink from the open file handle. ' Consumer '; opens the named file and copies the given source into it. ( Consumer (9 opens the name file and appends the given source to it. ) Consumer ), copies the given source into the open file handle. * Transducer *& passes its input through unmodified. +The +B transducer suppresses all input it receives. It is equivalent to 1 [] ,The ,6 transducer reports an error if any input reaches it. -The -Y transforms all uppercase letters in the input to lowercase, leaving the rest unchanged. .The .Y transforms all lowercase letters in the input to uppercase, leaving the rest unchanged. / Transducer /` passes its input unmodified, except for prepending contents of the given list parameter before  it. 0 Transducer 0[ passes its input unmodified, except for appending contents of the given list parameter to  its end. 1The 17 transducer replaces its whole input by its parameter. 2The 2E transducer counts all its input values and outputs the final tally. 34 Transducer 43 collects all its input values into a single list. 5 Transducer 5P flattens the input stream of lists of values into the output stream of values. 67 Splitter 7+ feeds all white-space characters into its true sink, all others into false. 8 Splitter 8, feeds all alphabetical characters into its true! sink, all other characters into false. 9 Splitter 9 feeds all digits into its true! sink, all other characters into false. : Splitter : feeds line-ends into its false% sink, and all other characters into true. ;The sectioning splitter ; feeds line-ends into its false sink, and line contents into true . A single : line-end can be formed by any of the character sequences "\n", "\r", "\r\n", or "\n\r". < Splitter <! feeds its entire input into its true sink. = Splitter =! feeds its entire input into its false sink. > Splitter > feeds all input values to its true3 sink, treating every value as a separate section. ? Splitter ? feeds to its true@ sink all input parts that match the contents of the given list c argument. If two overlapping parts of the input both match the argument, only the first one wins. @ Splitter @ feeds to its true@ sink all input parts that match the contents of the given list Y argument. If two overlapping parts of the input match the argument, both are considered true. "#$%&'()*+,-./0123456789:;<=>?@%&$(')"#*+,/01<=>?@456-.789;:23"#$%&'()*+,-./0123456789:;<=>?@)tAThe result of combinator AO is a consumer that acts as a composition of the given transducer and consumer  arguments. BThe result of combinator BO is a producer that acts as a composition of the given transducer and producer  arguments. CThe CI combinator composes its argument transducers. The resulting composition  t1 >-> t2 passes its input through the  first transducer t1, the output of t1# is passed to the other transducer t2+, and its output becomes the output of the  composition. DThe Ds combinator arranges the two transducer arguments in parallel. The input of the resulting transducer is replicated  to both component transducers in parallel, and the output of the resulting transducer is a concatenation of the two component  transducers' outputs. EThe ER (streaming not) combinator simply reverses the outputs of the argument splitter. > In other words, data that the argument splitter sends to its true sink goes to the false% sink of the result, and vice versa. FThe F combinator sends the trueO sink output of its left operand to the input of its right operand for further  splitting. Both operands' false sinks are connected to the false. sink of the combined splitter, but any input  value to reach the trueL sink of the combined component data must be deemed true by both splitters. GA G combinator's input value can reach its false3 sink only by going through both argument splitters' false  sinks. H Combinator HW is a pairwise logical conjunction of two splitters run in parallel on the same input. I Combinator IW is a pairwise logical disjunction of two splitters run in parallel on the same input. JThe result of the combinator JH is a transducer that applies one argument transducer to one portion of } the input and the other transducer to the other portion of input, depending on where the splitter argument routes the data. KLMNThe recursive combinator NN feeds the true sink of the argument splitter back to itself, modified by the . argument transducer. Data fed to the splitter'&s false sink is passed on unmodified. OThe recursive combinator OT combines two splitters into a mutually recursive loop acting as a single splitter. z The true sink of one of the argument splitters and false sink of the other become the true and false sinks of the loop. 4 The other two sinks are bound to the other splitter' s source.  The use of O\ makes sense only on hierarchically structured streams. If we gave it some input containing c a flat sequence of values, and assuming both component splitters are deterministic and stateless, @ a value would either not loop at all or it would loop forever. PThe P) combinator is similar to the combinator J9 in that it combines a splitter and two transducers into s another transducer. However, in this case the transducers are re-instantiated for each consecutive portion of the t input as the splitter chunks it up. Each contiguous portion of the input that the splitter sends to one of its two W sinks gets transducered through the appropriate argument transducer as that transducer's whole input. As soon as the A contiguous portion is finished, the transducer gets terminated. QThe Qf combinator combines two pure splitters into a pure splitter. One splitter is used to chunk the input  into contiguous portions. Its false sink is routed directly to the false$ sink of the combined splitter. The a second splitter is instantiated and run on each portion of the input that goes to first splitter's true sink. If 4 the second splitter sends any output at all to its true3 sink, the whole input portion is passed on to the true 9 sink of the combined splitter, otherwise it goes to its false sink. RThe R combinator is analogous to the Q: combinator, but it succeeds and passes each chunk of the  input to its true= sink only if the second splitter sends no part of it to its false sink. SThe result of combinator ST behaves the same as the argument splitter up to and including the first portion of ' the input which goes into the argument's true@ sink. All input following the first true portion goes into the  false sink. TThe result of combinator TO takes all input up to and including the first portion of the input which goes  into the argument's true) sink and feeds it to the result splitter's true& sink. All the rest of the input goes  into the false# sink. The only difference between U and V) combinators is in where they direct the  false* portion of the input preceding the first true part. UThe result of the combinator U. is a splitter which directs all input to its false sink, up to the last 0 portion of the input which goes to its argument's true> sink. That portion of the input is the only one that goes to  the resulting component's true0 sink. The splitter returned by the combinator U has to buffer the previous two w portions of its input, because it cannot know if a true portion of the input is the last one until it sees the end of ; the input or another portion succeeding the previous one. VThe result of the combinator V. is a splitter which directs all input to its false sink, up to the 5 last portion of the input which goes to its argument's true: sink. That portion and the remainder of the input is fed  to the resulting component's true sink. The difference between U and V combinators is where they  feed the false8 portion of the input, if any, remaining after the last true part. WThe W combinator feeds its trueB sink only the prefix of the input that its argument feeds to its true sink. . All the rest of the input is dumped into the false sink of the result. XThe X combinator feeds its trueB sink only the suffix of the input that its argument feeds to its true sink. . All the rest of the input is dumped into the false sink of the result. YThe YH combinator takes every input section that its argument splitters deems true, and feeds even ones into  its true4 sink. The odd sections and parts of input that are false/ according to its argument splitter are fed to  Y splitter's false sink. Z Combinator Z treats its argument 's as patterns components and returns a  that ? matches their concatenation. A section of input is considered true, by the result iff its prefix is considered  true by argument s1+ and the rest of the section is considered true by s2. The splitter s2 is started anew  after every section split to true sink by s1. [ Combinator [ passes to its trueD sink all input that follows a section considered true by its first u argument splitter but not a section considered true by its second argument. The section delimiter pairs can nest to  arbitrary depth. \ Combinator \ is similar to [, except it passes to true! the delimiting sections as well  as all input between them. uvwxyz{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZ[\ABCDEFGHIJKLMNOPQRZYSTWUVX[\ABCDEFGHIJKLMNOPQRSTUVWXYZ[\      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcddefghijk lmnopqrstuvwxyz{|}~scc-0.1!Control.Concurrent.SCC.Foundation%Control.Concurrent.SCC.ComponentTypes!Control.Concurrent.SCC.Components"Control.Concurrent.SCC.CombinatorsProducerConsumerSinkSourcePipeliftPiperunPipespipepipeDget getSuccessputcanPutpourteeputListgetListconsumeAndSuppresscondwhenNullSplittersplit splitSections Transducer transducelift121TransducerliftStatelessTransducerliftFoldTransducerliftStatefulTransducerliftStatelessSplitterliftSimpleSplitterliftSectionSplittertoStdOuttoPrint fromStdInfromFile fromHandletoFile appendFiletoHandleasissuppress erroneous lowercase uppercaseprependappend substitutecounttoStringgroup concatenateconcatSeparate whitespacelettersdigits nonEmptyLinelineallTrueallFalseone substringsubstringMatch->><<->->joinsnot>&>|&&||ifswhereverunlessselectwhilenestedInforeachhaving havingOnlyfirst uptoFirstlast lastAndAfterprefixsuffixeven followedBybetween...SuspendedContinuationCanPutPutGet Suspensionpidclock description continuation PipeStateDoneSuspendproceedreducemergedelaydelay'base Data.MaybeNothingtrackMarkersplitterToMarkersplittersToPairMarkerpairMarkerToMaybePairMarkerzipSplittersWith groupMarks splitConsumersplitConsumerSectionsputQueuegetQueue pourMaybesuppressProducerfst3