io-streams- Simple, composable, and easy-to-use stream I/O

Safe HaskellNone




This module provides support for parsing values from Text InputStreams using attoparsec. Since:



parseFromStream :: Parser r -> InputStream Text -> IO r Source #

Supplies an attoparsec Parser with an InputStream, returning the final parsed value or throwing a ParseException if parsing fails.

parseFromStream consumes only as much input as necessary to satisfy the Parser: any unconsumed input is pushed back onto the InputStream.

If the Parser exhausts the InputStream, the end-of-stream signal is sent to attoparsec.


ghci> import Data.Attoparsec.Text
ghci> is <- fromList ["12345xxx" :: Text]
ghci> parseFromStream (takeWhile isDigit) is
ghci> read is
Just "xxx"

parserToInputStream :: Parser (Maybe r) -> InputStream Text -> IO (InputStream r) Source #

Given a Parser yielding values of type Maybe r, transforms an InputStream over byte strings to an InputStream yielding values of type r.

If the parser yields Just x, then x will be passed along downstream, and if the parser yields Nothing, that will be interpreted as end-of-stream.

Upon a parse error, parserToInputStream will throw a ParseException.


ghci> import Control.Applicative
ghci> import Data.Attoparsec.Text
ghci> is <- fromList ["1 2 3 4 5" :: Text]
ghci> let parser = (endOfInput >> pure Nothing) <|> (Just <$> (skipWhile isSpace *> decimal))
ghci> parserToInputStream parser is >>= toList
ghci> is' <- fromList ["1 2xx3 4 5" :: Text] >>= parserToInputStream parser
ghci> read is'
Just 1
ghci> read is'
Just 2
ghci> read is'
*** Exception: Parse exception: Failed reading: takeWhile1