mirror of
https://github.com/mrkkrp/megaparsec.git
synced 2024-12-18 13:51:58 +03:00
fce6c3187c
Close # 27. Backtracking user state can be achieved via combination of ‘StateT’ monad transformer and ‘ParsecT’: StateT StateType (ParsecT s m a) This user state can be more flexible. This fact renders current built-in user state redundant. To help work with this new approach (combining monad transformers more freely) we introduce ‘MonadParsec’ MTL-style type class. All tools that come with Megaparsec library were modified to work smoothly with any instance of ‘MonadParsec’, not only ‘ParsecT’.
48 lines
1.4 KiB
Haskell
48 lines
1.4 KiB
Haskell
-- |
|
|
-- Module : Text.Megaparsec.ByteString
|
|
-- Copyright : © 2015 Megaparsec contributors
|
|
-- © 2007 Paolo Martini
|
|
-- License : BSD3
|
|
--
|
|
-- Maintainer : Mark Karpov <markkarpov@opmbx.org>
|
|
-- Stability : experimental
|
|
-- Portability : portable
|
|
--
|
|
-- Convenience definitions for working with 'C.ByteString'.
|
|
|
|
module Text.Megaparsec.ByteString
|
|
( Parser
|
|
, GenParser
|
|
, parseFromFile )
|
|
where
|
|
|
|
import Text.Megaparsec.Error
|
|
import Text.Megaparsec.Prim
|
|
|
|
import qualified Data.ByteString.Char8 as C
|
|
|
|
-- | Different modules corresponding to various types of streams (@String@,
|
|
-- @Text@, @ByteString@) define it differently, so user can use “abstract”
|
|
-- @Parser@ type and easily change it by importing different “type
|
|
-- modules”. This one is for strict bytestrings.
|
|
|
|
type Parser = Parsec C.ByteString
|
|
|
|
-- | @GenParser@ is similar to @Parser@ but it's parametrized over user
|
|
-- state type.
|
|
|
|
type GenParser t st = Parsec C.ByteString st
|
|
|
|
-- | @parseFromFile p filePath@ runs a strict bytestring parser @p@ on the
|
|
-- input read from @filePath@ using 'ByteString.Char8.readFile'. Returns
|
|
-- either a 'ParseError' ('Left') or a value of type @a@ ('Right').
|
|
--
|
|
-- > main = do
|
|
-- > result <- parseFromFile numbers "digits.txt"
|
|
-- > case result of
|
|
-- > Left err -> print err
|
|
-- > Right xs -> print (sum xs)
|
|
|
|
parseFromFile :: Parser a -> String -> IO (Either ParseError a)
|
|
parseFromFile p fname = runParser p fname <$> C.readFile fname
|