Îõ³h&8é0ÊØ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW Safe-Inferred¼streaming-utilsThe result of a parse (Either a ([String], String)#), with the unconsumed byte stream.Ï:set -XOverloadedStrings -- the string literal below is a streaming bytestringÊ(r,rest1) <- AS.parse (A.scientific <* A.many' A.space) "12.3 4.56 78.3"print r Left 12.3=(s,rest2) <- AS.parse (A.scientific <* A.many' A.space) rest1print s Left 4.56=(t,rest3) <- AS.parse (A.scientific <* A.many' A.space) rest2print t Left 78.3Q.putStrLn rest3 streaming-utilsˆApply a parser repeatedly to a stream of bytes, streaming the parsed values, but ending when the parser fails.or the bytes run out.ÊS.print $ AS.parsed (A.scientific <* A.many' A.space) $ "12.3 4.56 78.9"12.34.5678.918.282 streaming-utilsAttoparsec parserstreaming-utils Raw input   Safe-Inferred6ÁÃ×Ü¢"streaming-utilsAn  attoparsec7 error that happened while parsing the raw JSON string.#streaming-utilsAn aeson0 error that happened while trying to convert a  to an    instance, as reported by  .Xstreaming-utils%An error while decoding a JSON value.$streaming-utilsThis instance allows using   with  and 0 instance Error (DecodingError, Producer a m r)Consecutively parse a elements from the given Producer" using the given parser (such as  or .), skipping any leading whitespace each time.This Produceræ runs until it either runs out of input or until a decoding failure occurs, in which case it returns Y with a ! and a Producer! with any leftovers. You can use   to turn the Z return value into an  monad transformer.Like , except it accepts any [ instance, not just \ or \.%streaming-utilsÖGiven a bytestring, parse a top level json entity - returning any leftover bytes. &streaming-utilsàResolve a succession of top-level json items into a corresponding stream of Haskell values. 'streaming-utils(Experimental. Parse a bytestring with a  json-streamsø parser. The function will read through the whole of a single top level json entity, streaming the valid parses as they arise. (It will thus for example parse an infinite json bytestring, though these are rare in practice ...) þIf the parser is fitted to recognize only one thing, then zero or one item will be yielded; if it uses combinators like arrayOf˜, it will stream many values as they arise. See the example at the top of this module, in which values inside a top level array are emitted as they are parsed. Aeson would accumulate the whole bytestring before declaring on the contents of the array. This of course makes sense, since attempt to parse a json array may end with a bad parse, invalidating the json as a whole. With  json-streamsù, a bad parse will also of course emerge in the end, but only after the initial good parses are streamed. This too makes sense though, but in a smaller range of contexts -- for example, where one is folding over the parsed material.+This function is closely modelled on  and  from Data.JsonStream.Parser.!"#$%&'!"#$%&' Safe-Inferred"M,streaming-utils Send an HTTP ] and wait for an HTTP ^-streaming-utils Create a _( from a content length and an effectful `.streaming-utils Create a _ from an effectful `. is more flexible than -Ã, but requires the server to support chunked transfer encoding./streaming-utilsºThis is a quick method - oleg would call it 'unprofessional' - to bring a web page in view. It sparks its own internal manager and closes itself. Thus something like this makes senseÁrunResourceT $ Q.putStrLn $ simpleHttp "http://lpaste.net/raw/12"chunk _ [] = [];chunk n xs = let h = take n xs in h : (chunk n (drop n xs))but if you try something likeÜrest <- runResourceT $ Q.putStrLn $ Q.splitAt 40 $ simpleHTTP "http://lpaste.net/raw/146532"&import Data.ByteString.Streaming.HTTP "it will just be good luck if with runResourceT $ Q.putStrLn restyou get the rest of the file:  ‚import qualified Data.ByteString.Streaming.Char8 as Q main = runResourceT $ Q.putStrLn $ simpleHTTP "http://lpaste.net/raw/146532" rather than  Ê*** Exception: : hGetBuf: illegal operation (handle is closed)ÄSince, of course, the handle was already closed by the first use of  runResourceT6. The same applies of course to the more hygienic ,- above, which permits one to extract an IO (ByteString IO r) , by using splitAt or the like. ÕThe reaction of some streaming-io libraries was simply to forbid operations like splitAtŽ. That this paternalism was not viewed as simply outrageous is a consequence of the opacity of the older iteratee-io libraries. It is obviousê that I can no more run an effectful bytestring after I have made its effects impossible by using  runResourceT (which basically means closeEverythingDown©). I might as well try to run it after tossing my machine into the flames. Similarly, it is obvious that I cannot read from a handle after I have applied hClose6; there is simply no difference between the two cases.,streaming-utilsHandler for responseÊabcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚ_ÛÜÝÞßàáâã]äåæçèéêëìíîïðñòóôõ^ö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œž,-./0 ,0-./ Safe-Inferred×Üg1streaming-utilsÊReceives bytes from a connected socket with a maximum chunk size. The bytestream ends if the remote peer closes its side of the connection or EOF is received. The implementation is as follows: œfromSocket sock nbytes = loop where loop = do bs <- liftIO (NSB.recv sock nbytes) if B.null bs then return () else Q.chunk bs >> loop2streaming-utilsÚConnect a stream of bytes to the remote end. The implementation is again very simple: ”toSocket sock = loop where loop bs = do e <- Q.nextChunk bs case e of Left r -> return r Right (b,rest) -> send sock b >> loop rest1streaming-utilsConnected socket.streaming-utilsØMaximum number of bytes to receive and send dowstream at once. Renzo recommends using 4096% if you don't have a special purpose.2streaming-utilsConnected socket. 1212  Safe-Inferred×Ü*3streaming-utilsConstruct an ordinary pipes Ÿ from a   of elements3runEffect $ fromStream (S.each [1..3]) >-> P.print1234streaming-utils Construct a   of elements from a pipes Ÿ"S.print $ toStream $ P.each [1..3]1235streaming-utilsÆLink the chunks of a producer of bytestrings into a single byte stream6streaming-utils7Successively yield the chunks hidden in a byte stream. 7streaming-utils7 splits a Ÿ into two Ÿ s; the outer Ÿâ is the longest consecutive group of elements that satisfy the predicate. Its inverse is 8streaming-utils8 splits a Ÿ into two Ÿ s; the outer Ÿß is the longest consecutive group of elements that fail the predicate. Its inverse is ;streaming-utils; divides a Ÿ into two Ÿ8s after a fixed number of elements. Its inverse is <streaming-utils< splits a Ÿ into two Ÿ‡s; the second producer begins where we meet an element that is different according to the equality predicate. Its inverse is =streaming-utilsLike <#, where the equality predicate is (¡)>streaming-utils> splits a Ÿ into a   of Ÿ%s of equal items. Its inverse is B?streaming-utils groupsBy' splits a Ÿ into a   of Ÿ7s grouped using the given relation. Its inverse is BThis differs from >è by comparing successive elements instead of comparing each element to the first member of the groupimport Pipes (yield, each)import Pipes.Prelude (toList)let rel c1 c2 = succ c1 == c2Å(toList . intercalates (yield '|') . groupsBy' rel) (each "12233345") "12|23|3|345"Å(toList . intercalates (yield '|') . groupsBy rel) (each "12233345")"122|3|3|34|5"Astreaming-utilsA splits a Ÿ into a   of Ÿ(s of a given length. Its inverse is B.4let listN n = L.purely P.folds L.list . P.chunksOf nÈrunEffect $ listN 3 P.stdinLn >-> P.take 2 >-> P.map unwords >-> P.print123"1 2 3"456"4 5 6"Âlet stylish = P.concats . P.maps (<* P.yield "-*-") . P.chunksOf 2ÑrunEffect $ stylish (P.each $ words "one two three four five six") >-> P.stdoutLn onetwo-*-threefour-*-fivesix-*-Bstreaming-utilsJoin a stream of Ÿs into a single ŸCstreaming-utils Fold each Ÿ in a producer   Öpurely folds :: Monad m => Fold a b -> Stream (Producer a m) m r -> Producer b m rDstreaming-utils Fold each Ÿ in a Ÿ stream, monadically Úimpurely foldsM :: Monad m => FoldM a b -> Stream (Producer a m) m r -> Producer b m rEstreaming-utils (takes' n) only keeps the first n Ÿs of a linked   of  ProducersUnlike , E- is not functor-general - it is aware that a Ÿ can be drainedÈ, as functors cannot generally be. Here, then, we drain the unused ŸÕs in order to preserve the return value. This makes it a suitable argument for .Cstreaming-utils Step functionstreaming-utilsInitial accumulatorstreaming-utilsExtraction functionDstreaming-utils Step functionstreaming-utilsInitial accumulatorstreaming-utilsExtraction function3456789:;<=>?@ABCDE3456A@>?9:BCDE78;=< Safe-Inferred0¨ Fstreaming-utils#How hard should we try to compress?Gstreaming-utils#Decompress a streaming bytestring. ¢ is from Codec.Compression.Zlib G  :: £ m => ` m r -> ` m r Hstreaming-utilsäDecompress a zipped byte stream, returning any leftover input that follows the compressed material.Istreaming-utils;Keep decompressing a compressed bytestream until exhausted.Jstreaming-utilsCompress a byte stream.See the Codec.Compression.Zlib module for details about  and ¢.Ostreaming-utils-A specific compression level between 0 and 9.Qstreaming-utils!Decompress a gzipped byte stream.Rstreaming-utilsãDecompress a gzipped byte stream, returning any leftover input that follows the compressed stream.Sstreaming-utils*Compress a byte stream in the gzip format.¤streaming-utilsProduce values from the given ¥ until exhausted.Gstreaming-utilsCompressed streamstreaming-utilsDecompressed streamHstreaming-utilsCompressed byte streamstreaming-utilsÂDecompressed byte stream, ending with either leftovers or a resultJstreaming-utilsDecompressed streamstreaming-utilsCompressed streamQstreaming-utilsCompressed streamstreaming-utilsDecompressed streamRstreaming-utilsCompressed byte streamstreaming-utils.Decompressed bytes stream, returning either a `< of the leftover input or the return value from the input `.Sstreaming-utilsDecompressed streamstreaming-utilsCompressed streamFGHIJKLMNOPQRSGHIJQRSFKLMNOP¦ !"!#$%&'(&')&'*&'+&',&'-&'.&'/&'0&'1&'2&'3&45&46&47&48&49:;<:=>:=?:=@ABCABDABEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚€ƒ„…†„‡ˆ‰Šˆ‰‹ˆ‰ŒŽˆ‘ˆ’ˆ“ˆ”ˆ•ˆ–ˆ—ˆ˜ˆ™ˆšˆ›ˆœˆžˆŸˆ ˆ¡ˆ¢ˆ£ˆ¤¥ˆ¤¦ˆ¤§ˆ¤¨ˆ¤©ˆ¤ªˆ¤«ˆ¤¬ˆ¤­ˆ¤®ˆ¤¯ˆ¤°ˆ¤±ˆ¤²ˆ¤³ˆ´µˆ´¶ˆ´·ˆ´¸ˆ´¹ˆ´ºˆ´»ˆ´¼ˆ´½ˆ´¾ˆ´¿ˆ´Àˆ´ÁˆÂÈÄÅˆÄÆˆÄLjÄȈÄɈÄʈÄˈÄ̈Ä͈ÄΈÄψÄЈÄшÄÒˆÄÓˆÄÔˆÄÕˆÄÖˆÄ׈ØÙˆØÚˆØÛˆÜ݈ÜÞˆÜ߈‰àˆ‰áˆ‰âˆ‰ãˆ‰äˆ‰åˆ‰æˆ‰çˆ‰èˆ‰éˆ‰êˆ‰ëˆ‰ìˆ‰íˆ‰îˆ‰ïˆ‰ðˆ‰ñˆ‰òˆ‰óˆ‰ôˆ‰õˆ‰öˆ‰÷ˆ‰øˆ‰ùˆ‰úˆ‰ûˆ‰üˆ‰ýˆ‰þˆ‰ÿˆ‰€ˆ‰ˆ‰‚ˆ‰ƒˆ‰„ˆ‰…ˆ‰†ˆ‰‡ˆ‰ˆˆ‰‰ˆ‰Šˆ‰€ˆ‰‹ˆ‰Œˆ‰ˆ‰Žˆ‰ˆ‰ˆ‰ˆ‰‘ˆ‰’ˆ‰“ˆ‰”ˆ‰•ˆ‰–ˆ‰—ˆ‰˜ˆ‰™ˆ‰šˆ‰›ˆ‰œˆ‰ˆ‰žˆ‰Ÿˆ‰nˆ‰ ˆ‰¡ˆ‰¢ˆ‰£ˆ‰¤ˆ‰¥ˆ‰¦ˆ‰§ˆ‰¨ˆ‰ÿˆ‰©ˆ‰ªˆ‰«ˆ‰¬ˆ‰­ˆ‰®ˆ‰¯ˆ‰°ˆ‰±ˆ‰²ˆ‰³ˆ‰´ˆ‰µˆ‰¶ˆ‰·ˆ‰¸ˆ‰¹ˆ‰ºˆ‰»ˆ‰¼ˆ‰½ˆ‰¾ˆ‰¼ˆ‰¿ÀÁÂÀÁÃÀÁÄÀÁÅÀÁÆÀÁÇÀÁÈÀÁÉÀÁÊÀÁËÀÁËÀÁÌÀÁÍÀÁÎÀÁÏÀÁÐÀÁÑÒÓÔABÕÖרFGÙ€ÚÛÜÝÞ–ß.streaming-utils-0.2.4.0-5l5a7ESZ4sS5kvHGJdNu2yStreaming.Network.TCPData.ByteString.Streaming.HTTPStreaming.Pipes Streaming.Zip$Data.Attoparsec.ByteString.StreamingData.ByteString.Streaming.Aeson Data.AesonValueAFromJSONError Pipes.LifterrorP Pipes.AesondecodeddecodedLdecode parseValueControl.Monad.Trans.ErrorErrorTencodeData.JsonStream.ParserparseByteStringparseLazyByteString Control.MonadjoinZCompressionLevel&network-3.1.2.9-7f6vHWwGCL1KE8cemodEqsNetwork.Socket.TypesSocketSockAddrNetwork.Socket.InfoHostName ServiceNameNetwork.Socket.Internal withSocketsDo+network-simple-0.4.5-2w8NK694MSHAhe5nP4Fue6Network.Simple.TCPsendManysendLazysendrecv closeSockbindSock connectSock acceptForkacceptlistenserveconnectNetwork.Simple.InternalHostHostIPv6HostIPv4HostAnyHostPreference&resourcet-1.2.6-GMw9yf9Dx9z1HyVmUaKin4Control.Monad.Trans.Resource runResourceT%Control.Monad.Trans.Resource.Internal liftResourceT MonadResource ResourceT(streaming-0.2.3.1-LcIt6GigeSs2PnZ4j9OOkHStreaming.Internaltakes intercalatesmaps#zlib-0.6.3.0-IpEGS2fxIhA8e2qGpMu8xtCodec.Compression.Zlib.StreamdefaultWindowBitsMessageparseparsed DecodingErrorAttoparsecError FromJSONError streamParse$fExceptionDecodingError$fShowDecodingError$fEqDecodingError$fDataDecodingErrorwithHTTPstreamNstream simpleHTTPhttp fromSockettoSocket fromStreamtoStreamtoStreamingByteStringfromStreamingByteStringspanbreaksplitbreakssplitAtgroupBygroupgroupsBy groupsBy'groupschunksOfconcatsfoldsfoldsMtakes' decompress decompress' decompressAllcompressdefaultCompression noCompression bestSpeedbestCompressioncompressionLevel windowBitsgunzipgunzip'gzip$fShowCompressionLevel$fReadCompressionLevel$fEqCompressionLevel$fOrdCompressionLevel ParsingErrorbase Data.EitherLeftEither$aeson-2.1.2.1-1CP91TiqJNMKhmZsERtItUData.Aeson.Types.ToJSONToJSONData.Aeson.Types.Internal+http-client-0.7.13.1-BqrOjNBrR5L4Hb4pMS8ZZkNetwork.HTTP.Client.TypesRequestResponse RequestBody1streaming-bytestring-0.3.0-FniY4WcSUGSCOPFoeKoN9MStreaming.ByteString.Internal ByteStringNetwork.HTTP.ClientresponseTimeoutDefaultresponseTimeoutNoneresponseTimeoutMicromanagerSetProxymanagerSetSecureProxymanagerSetInsecureProxywithResponseHistoryresponseOpenHistoryHistoriedResponsehrFinalResponse hrRedirectshrFinalRequestNetwork.HTTP.Client.CorewithConnection responseClose responseOpen httpNoBodyhttpLbs withResponseNetwork.HTTP.Client.CookiesgenerateCookieinsertCheckedCookiereceiveSetCookieupdateCookieJarcomputeCookieStringinsertCookiesIntoRequestevictExpiredCookiesisPotentiallyTrustworthyOrigin!removeExistingCookieFromCookieJardestroyCookieJarcreateCookieJar pathMatches defaultPath domainMatches isIpAddressNetwork.HTTP.Client.Manager defaultProxyproxyEnvironmentNamedproxyEnvironmentuseProxySecureWithoutConnectuseProxynoProxyproxyFromRequest withManager closeManager newManagerdefaultManagerSettingsrawConnectionModifySocketSizerawConnectionModifySocketNetwork.HTTP.Client.ResponsegetOriginalRequestNetwork.HTTP.Client.RequestobservedStreamFile streamFilesetQueryStringPartialEscapesetQueryStringsetRequestCheckStatussetRequestIgnoreStatusurlEncodedBodyapplyBasicProxyAuthapplyBearerAuthapplyBasicAuthdefaultRequestgetUrirequestFromURI_requestFromURI parseRequest_ parseRequestthrowErrorStatusCodes parseUrlThrowparseUrlNetwork.HTTP.Client.Body brConsume brReadSomebrReadNetwork.HTTP.Client.ConnectionstrippedHostNamesocketConnectionmakeConnectionequivCookieJarequalCookieJarcompareCookies equivCookie equalCookie BodyReader HttpExceptionHttpExceptionRequestInvalidUrlExceptionHttpExceptionContentInvalidProxySettingsConnectionClosedInvalidProxyEnvironmentVariableHttpZlibExceptionInvalidDestinationHostIncompleteHeadersInvalidChunkHeadersResponseBodyTooShortWrongRequestBodyStreamSizeTlsNotSupportedNoResponseDataReceivedProxyConnectExceptionInternalExceptionInvalidRequestHeaderInvalidStatusLineConnectionFailureConnectionTimeoutOverlongHeadersTooManyRedirectsStatusCodeException InvalidHeaderResponseTimeoutCookiecookie_http_onlycookie_secure_onlycookie_host_onlycookie_persistentcookie_last_access_timecookie_creation_time cookie_path cookie_domaincookie_expiry_time cookie_value cookie_name CookieJarProxy proxyPort proxyHost RequestBodyIORequestBodyStreamChunkedRequestBodyStreamRequestBodyBuilderRequestBodyLBS RequestBodyBSPopper NeedsPopper GivesPopper redactHeadersshouldStripHeaderOnRedirectrequestVersion cookieJarresponseTimeout checkResponse redirectCountproxy requestBodyrequestHeaders queryStringporthostsecurepathmethodresponseCookieJar responseBodyresponseHeadersresponseStatusresponseVersionManagerSettingsmanagerModifyResponsemanagerModifyRequestmanagerIdleConnectionCountmanagerWrapExceptionmanagerRetryableExceptionmanagerResponseTimeoutmanagerTlsConnectionmanagerConnCountmanagerRawConnection ProxyOverrideManagerHasHttpManagergetHttpManagerStreamFileStatus thisChunkSize readSoFarfileSize.http-client-tls-0.3.6.1-10jClF9OIR98ybpRBTyx8gNetwork.HTTP.Client.TLSapplyDigestAuthdisplayDigestAuthExceptionsetGlobalManagergetGlobalManagernewTlsManagerWith newTlsManagertlsManagerSettingsmkManagerSettingsContextmkManagerSettingsDigestAuthExceptionDigestAuthExceptionDetails MissingNonce MissingRealmWWWAuthenticateIsNotDigestUnexpectedStatusCodeMissingWWWAuthenticateHeader#pipes-4.3.16-8o1vgN9DSDXEvcFV9hihU9 Pipes.CoreProducerStreamghc-prim GHC.Classes== WindowBitsControl.Monad.IO.ClassMonadIO fromPopper0streaming-commons-0.2.2.6-18XEqVUfiVI4MVIRn5wgnbData.Streaming.Zlib