module Parser.Util where
import Control.Monad.Combinators.Expr
import Data.Char (isLetter, isLowerCase, isUpperCase)
import Data.Text qualified as T
import Text.Megaparsec (
MonadParsec (hidden, takeWhile1P, takeWhileP),
between,
match,
(<?>),
)
import Text.Megaparsec.Char (space1)
import Text.Megaparsec.Char.Lexer qualified as L
type Parser = MonadParsec Void Text
sc :: (MonadParsec Void Text m) => m ()
sc :: forall (m :: * -> *). MonadParsec Void Text m => m ()
sc =
m () -> m () -> m () -> m ()
forall e s (m :: * -> *).
MonadParsec e s m =>
m () -> m () -> m () -> m ()
L.space
m ()
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space1
m ()
forall a. m a
forall (f :: * -> *) a. Alternative f => f a
empty
m ()
forall a. m a
forall (f :: * -> *) a. Alternative f => f a
empty
lexeme :: (Parser m) => m a -> m a
lexeme :: forall (m :: * -> *) a. Parser m => m a -> m a
lexeme = m () -> m a -> m a
forall e s (m :: * -> *) a. MonadParsec e s m => m () -> m a -> m a
L.lexeme m ()
forall (m :: * -> *). MonadParsec Void Text m => m ()
sc
symbol :: (Parser m) => Text -> m Text
symbol :: forall (m :: * -> *). Parser m => Text -> m Text
symbol = m () -> Tokens Text -> m (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
m () -> Tokens s -> m (Tokens s)
L.symbol m ()
forall (m :: * -> *). MonadParsec Void Text m => m ()
sc
matchNoSpaces :: (Parser m) => m a -> m (Text, a)
matchNoSpaces :: forall (m :: * -> *) a. Parser m => m a -> m (Text, a)
matchNoSpaces m a
p = (Text -> Text) -> (Text, a) -> (Text, a)
forall a b c. (a -> b) -> (a, c) -> (b, c)
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first Text -> Text
T.strip ((Text, a) -> (Text, a)) -> m (Text, a) -> m (Text, a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a -> m (Tokens Text, a)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> m (Tokens s, a)
match m a
p
pUpperName :: (Parser m) => m Text
pUpperName :: forall (m :: * -> *). Parser m => m Text
pUpperName =
do
start <- Maybe String -> (Token Text -> Bool) -> m (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Maybe String -> (Token s -> Bool) -> m (Tokens s)
takeWhile1P (String -> Maybe String
forall a. a -> Maybe a
Just String
"uppercase") Char -> Bool
Token Text -> Bool
isUpperCase
end <- takeWhileP (Just "letter") isLetter
pure (start <> end)
pLowerName :: (Parser m) => m Text
pLowerName :: forall (m :: * -> *). Parser m => m Text
pLowerName =
do
start <- Maybe String -> (Token Text -> Bool) -> m (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Maybe String -> (Token s -> Bool) -> m (Tokens s)
takeWhile1P (String -> Maybe String
forall a. a -> Maybe a
Just String
"lowercase") Char -> Bool
Token Text -> Bool
isLowerCase
end <- takeWhileP (Just "letter") isLetter
pure (start <> end)
pSymbolicName :: (Parser m) => m Text
pSymbolicName :: forall (m :: * -> *). Parser m => m Text
pSymbolicName =
Maybe String -> (Token Text -> Bool) -> m (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Maybe String -> (Token s -> Bool) -> m (Tokens s)
takeWhile1P (String -> Maybe String
forall a. a -> Maybe a
Just String
"symbolic letter") (Char -> String -> Bool
forall (f :: * -> *) a.
(Foldable f, DisallowElem f, Eq a) =>
a -> f a -> Bool
`notElem` (String
"()" :: String))
m Text -> String -> m Text
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> String
"name"
pText :: (Parser m) => m Text
pText :: forall (m :: * -> *). Parser m => m Text
pText = Maybe String -> (Token Text -> Bool) -> m (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Maybe String -> (Token s -> Bool) -> m (Tokens s)
takeWhileP (String -> Maybe String
forall a. a -> Maybe a
Just String
"text") (Char -> String -> Bool
forall (f :: * -> *) a.
(Foldable f, DisallowElem f, Eq a) =>
a -> f a -> Bool
`notElem` (String
"\28\29\30\31" :: String)) m Text -> String -> m Text
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> String
"text"
comma :: (Parser m) => m Text
comma :: forall (m :: * -> *). Parser m => m Text
comma = Text -> m Text
forall (m :: * -> *). Parser m => Text -> m Text
symbol Text
","
minus :: (Parser m) => m Text
minus :: forall (m :: * -> *). Parser m => m Text
minus = Text -> m Text
forall (m :: * -> *). Parser m => Text -> m Text
symbol Text
"-"
parens :: (Parser m) => m a -> m a
parens :: forall (m :: * -> *) a. Parser m => m a -> m a
parens = m Text -> m Text -> m a -> m a
forall (m :: * -> *) open close a.
Applicative m =>
m open -> m close -> m a -> m a
between (Text -> m Text
forall (m :: * -> *). Parser m => Text -> m Text
symbol Text
"(") (Text -> m Text
forall (m :: * -> *). Parser m => Text -> m Text
symbol Text
")")
brackets :: (Parser m) => m a -> m a
brackets :: forall (m :: * -> *) a. Parser m => m a -> m a
brackets = m Text -> m Text -> m a -> m a
forall (m :: * -> *) open close a.
Applicative m =>
m open -> m close -> m a -> m a
between (Text -> m Text
forall (m :: * -> *). Parser m => Text -> m Text
symbol Text
"[") (Text -> m Text
forall (m :: * -> *). Parser m => Text -> m Text
symbol Text
"]")
binary :: (Parser m) => Text -> (a -> a -> a) -> Operator m a
binary :: forall (m :: * -> *) a.
Parser m =>
Text -> (a -> a -> a) -> Operator m a
binary Text
name a -> a -> a
f = m (a -> a -> a) -> Operator m a
forall (m :: * -> *) a. m (a -> a -> a) -> Operator m a
InfixL (a -> a -> a
f (a -> a -> a) -> m Text -> m (a -> a -> a)
forall a b. a -> m b -> m a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ m Text -> m Text
forall a. m a -> m a
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
hidden (Text -> m Text
forall (m :: * -> *). Parser m => Text -> m Text
symbol Text
name))
prefix :: (Parser m) => Text -> (a -> a) -> Operator m a
prefix :: forall (m :: * -> *) a.
Parser m =>
Text -> (a -> a) -> Operator m a
prefix Text
name a -> a
f = m (a -> a) -> Operator m a
forall (m :: * -> *) a. m (a -> a) -> Operator m a
Prefix (m (a -> a) -> Operator m a) -> m (a -> a) -> Operator m a
forall a b. (a -> b) -> a -> b
$ ((a -> a) -> (a -> a) -> a -> a) -> (a -> a) -> [a -> a] -> a -> a
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) a -> a
forall a. a -> a
id ([a -> a] -> a -> a) -> m [a -> a] -> m (a -> a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (a -> a) -> m [a -> a]
forall a. m a -> m [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
some (a -> a
f (a -> a) -> m Text -> m (a -> a)
forall a b. a -> m b -> m a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ m Text -> m Text
forall a. m a -> m a
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
hidden (Text -> m Text
forall (m :: * -> *). Parser m => Text -> m Text
symbol Text
name))