module ParseLib.Abstract.Core
(
parseImproved,
parseAndTraceImproved,
parseWithConfig,
parseAndTrace,
parse,
Parser (Parser),
anySymbol,
satisfy,
empty,
failp,
succeed,
pure,
(<|>),
(<<|>),
(<*>),
(<$>),
(>>=),
look,
)
where
import Control.Applicative
import Control.Monad
import Data.Bifunctor (first)
import Data.DifferenceList (DifferenceList)
import Data.List.NonEmpty (NonEmpty)
import ParseLib.Error
( Config,
ErrorsPretty (errorBundlePrettyImproved),
ParseError,
ParseErrorBundle,
defaultConfig,
errorBundlePretty,
traceErrorMessage,
)
import qualified ParseLib.Simple.Core as SP
newtype Parser s r =
Parser {forall s r.
Parser s r -> [s] -> ([(r, [s])], DifferenceList (ParseError [s]))
runParser :: [s] -> ([(r, [s])], DifferenceList (ParseError [s]))}
instance Functor (Parser s) where
fmap :: forall a b. (a -> b) -> Parser s a -> Parser s b
fmap a -> b
f Parser s a
p = ([s] -> ([(b, [s])], DifferenceList (ParseError [s])))
-> Parser s b
forall s r.
([s] -> ([(r, [s])], DifferenceList (ParseError [s])))
-> Parser s r
Parser (a -> b
f (a -> b)
-> Parser s a
-> [s]
-> ([(b, [s])], DifferenceList (ParseError [s]))
forall a b s. (a -> b) -> Parser s a -> Parser s b
SP.<$> Parser s a -> Parser s a
forall s r.
Parser s r -> [s] -> ([(r, [s])], DifferenceList (ParseError [s]))
runParser Parser s a
p)
instance Applicative (Parser s) where
pure :: forall a. a -> Parser s a
pure a
x = ([s] -> ([(a, [s])], DifferenceList (ParseError [s])))
-> Parser s a
forall s r.
([s] -> ([(r, [s])], DifferenceList (ParseError [s])))
-> Parser s r
Parser (a -> [s] -> ([(a, [s])], DifferenceList (ParseError [s]))
forall a s. a -> Parser s a
SP.succeed a
x)
Parser s (a -> b)
p <*> :: forall a b. Parser s (a -> b) -> Parser s a -> Parser s b
<*> Parser s a
q = ([s] -> ([(b, [s])], DifferenceList (ParseError [s])))
-> Parser s b
forall s r.
([s] -> ([(r, [s])], DifferenceList (ParseError [s])))
-> Parser s r
Parser (Parser s (a -> b)
-> [s] -> ([(a -> b, [s])], DifferenceList (ParseError [s]))
forall s r.
Parser s r -> [s] -> ([(r, [s])], DifferenceList (ParseError [s]))
runParser Parser s (a -> b)
p ([s] -> ([(a -> b, [s])], DifferenceList (ParseError [s])))
-> Parser s a
-> [s]
-> ([(b, [s])], DifferenceList (ParseError [s]))
forall s b a. Parser s (b -> a) -> Parser s b -> Parser s a
SP.<*> Parser s a -> Parser s a
forall s r.
Parser s r -> [s] -> ([(r, [s])], DifferenceList (ParseError [s]))
runParser Parser s a
q)
instance Alternative (Parser s) where
empty :: forall a. Parser s a
empty = ([s] -> ([(a, [s])], DifferenceList (ParseError [s])))
-> Parser s a
forall s r.
([s] -> ([(r, [s])], DifferenceList (ParseError [s])))
-> Parser s r
Parser [s] -> ([(a, [s])], DifferenceList (ParseError [s]))
forall s a. Parser s a
SP.empty
Parser s a
p <|> :: forall a. Parser s a -> Parser s a -> Parser s a
<|> Parser s a
q = ([s] -> ([(a, [s])], DifferenceList (ParseError [s])))
-> Parser s a
forall s r.
([s] -> ([(r, [s])], DifferenceList (ParseError [s])))
-> Parser s r
Parser (Parser s a -> [s] -> ([(a, [s])], DifferenceList (ParseError [s]))
forall s r.
Parser s r -> [s] -> ([(r, [s])], DifferenceList (ParseError [s]))
runParser Parser s a
p ([s] -> ([(a, [s])], DifferenceList (ParseError [s])))
-> ([s] -> ([(a, [s])], DifferenceList (ParseError [s])))
-> [s]
-> ([(a, [s])], DifferenceList (ParseError [s]))
forall s a. Parser s a -> Parser s a -> Parser s a
SP.<|> Parser s a -> [s] -> ([(a, [s])], DifferenceList (ParseError [s]))
forall s r.
Parser s r -> [s] -> ([(r, [s])], DifferenceList (ParseError [s]))
runParser Parser s a
q)
infixr 3 <<|>
(<<|>) :: Parser s a -> Parser s a -> Parser s a
Parser s a
p <<|> :: forall s a. Parser s a -> Parser s a -> Parser s a
<<|> Parser s a
q = ([s] -> ([(a, [s])], DifferenceList (ParseError [s])))
-> Parser s a
forall s r.
([s] -> ([(r, [s])], DifferenceList (ParseError [s])))
-> Parser s r
Parser (Parser s a -> [s] -> ([(a, [s])], DifferenceList (ParseError [s]))
forall s r.
Parser s r -> [s] -> ([(r, [s])], DifferenceList (ParseError [s]))
runParser Parser s a
p ([s] -> ([(a, [s])], DifferenceList (ParseError [s])))
-> ([s] -> ([(a, [s])], DifferenceList (ParseError [s])))
-> [s]
-> ([(a, [s])], DifferenceList (ParseError [s]))
forall s a. Parser s a -> Parser s a -> Parser s a
SP.<<|> Parser s a -> [s] -> ([(a, [s])], DifferenceList (ParseError [s]))
forall s r.
Parser s r -> [s] -> ([(r, [s])], DifferenceList (ParseError [s]))
runParser Parser s a
q)
instance Monad (Parser s) where
return :: forall a. a -> Parser s a
return = a -> Parser s a
forall a. a -> Parser s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
Parser s a
p >>= :: forall a b. Parser s a -> (a -> Parser s b) -> Parser s b
>>= a -> Parser s b
f = ([s] -> ([(b, [s])], DifferenceList (ParseError [s])))
-> Parser s b
forall s r.
([s] -> ([(r, [s])], DifferenceList (ParseError [s])))
-> Parser s r
Parser (Parser s a -> [s] -> ([(a, [s])], DifferenceList (ParseError [s]))
forall s r.
Parser s r -> [s] -> ([(r, [s])], DifferenceList (ParseError [s]))
runParser Parser s a
p ([s] -> ([(a, [s])], DifferenceList (ParseError [s])))
-> (a -> [s] -> ([(b, [s])], DifferenceList (ParseError [s])))
-> [s]
-> ([(b, [s])], DifferenceList (ParseError [s]))
forall s a b. Parser s a -> (a -> Parser s b) -> Parser s b
SP.>>= (Parser s b -> [s] -> ([(b, [s])], DifferenceList (ParseError [s]))
forall s r.
Parser s r -> [s] -> ([(r, [s])], DifferenceList (ParseError [s]))
runParser (Parser s b
-> [s] -> ([(b, [s])], DifferenceList (ParseError [s])))
-> (a -> Parser s b)
-> a
-> [s]
-> ([(b, [s])], DifferenceList (ParseError [s]))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Parser s b
f))
instance MonadPlus (Parser s) where
mzero :: forall a. Parser s a
mzero = Parser s a
forall a. Parser s a
forall (f :: * -> *) a. Alternative f => f a
empty
mplus :: forall a. Parser s a -> Parser s a -> Parser s a
mplus = Parser s a -> Parser s a -> Parser s a
forall a. Parser s a -> Parser s a -> Parser s a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>)
anySymbol :: Parser s s
anySymbol :: forall s. Parser s s
anySymbol = ([s] -> ([(s, [s])], DifferenceList (ParseError [s])))
-> Parser s s
forall s r.
([s] -> ([(r, [s])], DifferenceList (ParseError [s])))
-> Parser s r
Parser ([s] -> ([(s, [s])], DifferenceList (ParseError [s]))
forall s. Parser s s
SP.anySymbol)
satisfy :: (s -> Bool) -> Parser s s
satisfy :: forall s. (s -> Bool) -> Parser s s
satisfy s -> Bool
p = ([s] -> ([(s, [s])], DifferenceList (ParseError [s])))
-> Parser s s
forall s r.
([s] -> ([(r, [s])], DifferenceList (ParseError [s])))
-> Parser s r
Parser ((s -> Bool) -> [s] -> ([(s, [s])], DifferenceList (ParseError [s]))
forall s. (s -> Bool) -> Parser s s
SP.satisfy s -> Bool
p)
succeed :: a -> Parser s a
succeed :: forall a s. a -> Parser s a
succeed = a -> Parser s a
forall a. a -> Parser s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
failp :: Parser s a
failp :: forall s a. Parser s a
failp = ([s] -> ([(a, [s])], DifferenceList (ParseError [s])))
-> Parser s a
forall s r.
([s] -> ([(r, [s])], DifferenceList (ParseError [s])))
-> Parser s r
Parser [s] -> ([(a, [s])], DifferenceList (ParseError [s]))
forall s a. Parser s a
SP.failp
look :: Parser s [s]
look :: forall s. Parser s [s]
look = ([s] -> ([([s], [s])], DifferenceList (ParseError [s])))
-> Parser s [s]
forall s r.
([s] -> ([(r, [s])], DifferenceList (ParseError [s])))
-> Parser s r
Parser [s] -> ([([s], [s])], DifferenceList (ParseError [s]))
forall s. Parser s [s]
SP.look
parseImproved :: (ErrorsPretty s, Ord s) => Parser s a -> [s] -> [(a, [s])]
parseImproved :: forall s a.
(ErrorsPretty s, Ord s) =>
Parser s a -> [s] -> [(a, [s])]
parseImproved = Config -> Parser s a -> [s] -> [(a, [s])]
forall s a.
(ErrorsPretty s, Ord s) =>
Config -> Parser s a -> [s] -> [(a, [s])]
parseAndTraceImproved Config
defaultConfig
parseAndTraceImproved ::
(ErrorsPretty s, Ord s) => Config -> Parser s a -> [s] -> [(a, [s])]
parseAndTraceImproved :: forall s a.
(ErrorsPretty s, Ord s) =>
Config -> Parser s a -> [s] -> [(a, [s])]
parseAndTraceImproved Config
config Parser s a
p [s]
input =
Either String (NonEmpty (a, [s])) -> [(a, [s])]
forall a s. Either String (NonEmpty (a, [s])) -> [(a, [s])]
traceErrorMessage (Either String (NonEmpty (a, [s])) -> [(a, [s])])
-> Either String (NonEmpty (a, [s])) -> [(a, [s])]
forall a b. (a -> b) -> a -> b
$
(ParseErrorBundle [s] -> String)
-> Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
-> Either String (NonEmpty (a, [s]))
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (Config -> [s] -> ParseErrorBundle [s] -> String
forall symbol.
ErrorsPretty symbol =>
Config -> [symbol] -> ParseErrorBundle [symbol] -> String
errorBundlePrettyImproved Config
config [s]
input) (Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
-> Either String (NonEmpty (a, [s])))
-> Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
-> Either String (NonEmpty (a, [s]))
forall a b. (a -> b) -> a -> b
$
Config
-> Parser s a
-> [s]
-> Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
forall s a.
Ord s =>
Config
-> Parser s a
-> [s]
-> Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
parseWithConfig Config
config Parser s a
p [s]
input
parseWithConfig ::
(Ord s) =>
Config ->
Parser s a ->
[s] ->
Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
parseWithConfig :: forall s a.
Ord s =>
Config
-> Parser s a
-> [s]
-> Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
parseWithConfig Config
config (Parser [s] -> ([(a, [s])], DifferenceList (ParseError [s]))
p) = Config
-> ([s] -> ([(a, [s])], DifferenceList (ParseError [s])))
-> [s]
-> Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
forall s a.
Ord s =>
Config
-> Parser s a
-> [s]
-> Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
SP.parseWithConfig Config
config [s] -> ([(a, [s])], DifferenceList (ParseError [s]))
p
parseAndTrace ::
(Show s, Ord s) => Config -> Parser s a -> [s] -> [(a, [s])]
parseAndTrace :: forall s a.
(Show s, Ord s) =>
Config -> Parser s a -> [s] -> [(a, [s])]
parseAndTrace Config
config Parser s a
p [s]
input =
Either String (NonEmpty (a, [s])) -> [(a, [s])]
forall a s. Either String (NonEmpty (a, [s])) -> [(a, [s])]
traceErrorMessage (Either String (NonEmpty (a, [s])) -> [(a, [s])])
-> Either String (NonEmpty (a, [s])) -> [(a, [s])]
forall a b. (a -> b) -> a -> b
$
(ParseErrorBundle [s] -> String)
-> Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
-> Either String (NonEmpty (a, [s]))
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (Config -> [s] -> ParseErrorBundle [s] -> String
forall symbol.
(Ord symbol, Show symbol) =>
Config -> [symbol] -> ParseErrorBundle [symbol] -> String
errorBundlePretty Config
config [s]
input) (Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
-> Either String (NonEmpty (a, [s])))
-> Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
-> Either String (NonEmpty (a, [s]))
forall a b. (a -> b) -> a -> b
$
Config
-> Parser s a
-> [s]
-> Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
forall s a.
Ord s =>
Config
-> Parser s a
-> [s]
-> Either (ParseErrorBundle [s]) (NonEmpty (a, [s]))
parseWithConfig Config
config Parser s a
p [s]
input
parse :: (Show s, Ord s) => Parser s a -> [s] -> [(a, [s])]
parse :: forall s a. (Show s, Ord s) => Parser s a -> [s] -> [(a, [s])]
parse = Config -> Parser s a -> [s] -> [(a, [s])]
forall s a.
(Show s, Ord s) =>
Config -> Parser s a -> [s] -> [(a, [s])]
parseAndTrace Config
defaultConfig