{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
{-# OPTIONS_GHC -Wno-missing-signatures #-}
module Nix.Parser
( parseNixFile
, parseNixFileLoc
, parseNixText
, parseNixTextLoc
, parseFromFileEx
, Parser
, parseFromText
, Result(..)
, reservedNames
, OperatorInfo(..)
, NSpecialOp(..)
, NAssoc(..)
, NOperatorDef
, getUnaryOperator
, getBinaryOperator
, getSpecialOperator
, nixToplevelForm
, nixExpr
, nixSet
, nixBinders
, nixSelector
, nixSym
, nixPath
, nixString
, nixUri
, nixSearchPath
, nixFloat
, nixInt
, nixBool
, nixNull
, symbol
, whiteSpace
)
where
import Prelude hiding ( readFile )
import Control.Applicative hiding ( many
, some
)
import Control.DeepSeq
import Control.Monad
import Control.Monad.Combinators.Expr
import Data.Char ( isAlpha
, isDigit
, isSpace
)
import Data.Data ( Data(..) )
import Data.Functor
import Data.Functor.Identity
import Data.HashSet ( HashSet )
import qualified Data.HashSet as HashSet
import Data.List.NonEmpty ( NonEmpty(..) )
import qualified Data.List.NonEmpty as NE
import qualified Data.Map as Map
import Data.Text hiding ( map
, foldr1
, concat
, concatMap
, zipWith
)
import Data.Text.Encoding
import Data.Typeable ( Typeable )
import Data.Void
import GHC.Generics hiding ( Prefix )
import Nix.Expr hiding ( ($>) )
import Nix.Expr.Strings
import Nix.Render
import Prettyprinter ( Doc
, pretty
)
import Text.Megaparsec
import Text.Megaparsec.Char
import qualified Text.Megaparsec.Char.Lexer as L
infixl 3 <+>
(<+>) :: MonadPlus m => m a -> m a -> m a
<+> :: m a -> m a -> m a
(<+>) = m a -> m a -> m a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
mplus
nixExpr :: Parser NExprLoc
nixExpr :: Parser NExprLoc
nixExpr = Parser NExprLoc
-> [[Operator (ParsecT Void Text Identity) NExprLoc]]
-> Parser NExprLoc
forall (m :: * -> *) a.
MonadPlus m =>
m a -> [[Operator m a]] -> m a
makeExprParser Parser NExprLoc
nixTerm ([[Operator (ParsecT Void Text Identity) NExprLoc]]
-> Parser NExprLoc)
-> [[Operator (ParsecT Void Text Identity) NExprLoc]]
-> Parser NExprLoc
forall a b. (a -> b) -> a -> b
$ ([(NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)]
-> [Operator (ParsecT Void Text Identity) NExprLoc])
-> [[(NOperatorDef,
Operator (ParsecT Void Text Identity) NExprLoc)]]
-> [[Operator (ParsecT Void Text Identity) NExprLoc]]
forall a b. (a -> b) -> [a] -> [b]
map (((NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
-> Operator (ParsecT Void Text Identity) NExprLoc)
-> [(NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)]
-> [Operator (ParsecT Void Text Identity) NExprLoc]
forall a b. (a -> b) -> [a] -> [b]
map (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
-> Operator (ParsecT Void Text Identity) NExprLoc
forall a b. (a, b) -> b
snd) (Parser (Ann SrcSpan (NAttrPath NExprLoc))
-> [[(NOperatorDef,
Operator (ParsecT Void Text Identity) NExprLoc)]]
nixOperators Parser (Ann SrcSpan (NAttrPath NExprLoc))
nixSelector)
antiStart :: Parser Text
antiStart :: Parser Text
antiStart = Text -> Parser Text
symbol "${" Parser Text -> String -> Parser Text
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> String -> String
forall a. Show a => a -> String
show ("${" :: String)
nixAntiquoted :: Parser a -> Parser (Antiquoted a NExprLoc)
nixAntiquoted :: Parser a -> Parser (Antiquoted a NExprLoc)
nixAntiquoted p :: Parser a
p =
NExprLoc -> Antiquoted a NExprLoc
forall v r. r -> Antiquoted v r
Antiquoted
(NExprLoc -> Antiquoted a NExprLoc)
-> Parser NExprLoc -> Parser (Antiquoted a NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser Text
antiStart Parser Text -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm Parser NExprLoc -> Parser Text -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Text -> Parser Text
symbol "}")
Parser (Antiquoted a NExprLoc)
-> Parser (Antiquoted a NExprLoc) -> Parser (Antiquoted a NExprLoc)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> a -> Antiquoted a NExprLoc
forall v r. v -> Antiquoted v r
Plain
(a -> Antiquoted a NExprLoc)
-> Parser a -> Parser (Antiquoted a NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser a
p
Parser (Antiquoted a NExprLoc)
-> String -> Parser (Antiquoted a NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "anti-quotation"
selDot :: Parser ()
selDot :: Parser ()
selDot = Parser () -> Parser ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Text -> Parser Text
symbol "." Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc -> Parser ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m ()
notFollowedBy Parser NExprLoc
nixPath) Parser () -> String -> Parser ()
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "."
nixSelect :: Parser NExprLoc -> Parser NExprLoc
nixSelect :: Parser NExprLoc -> Parser NExprLoc
nixSelect term :: Parser NExprLoc
term = do
NExprLoc
res <- NExprLoc
-> Maybe (Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc)
-> NExprLoc
build (NExprLoc
-> Maybe (Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc)
-> NExprLoc)
-> Parser NExprLoc
-> ParsecT
Void
Text
Identity
(Maybe (Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc)
-> NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser NExprLoc
term ParsecT
Void
Text
Identity
(Maybe (Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc)
-> NExprLoc)
-> ParsecT
Void
Text
Identity
(Maybe (Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc))
-> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT
Void
Text
Identity
(Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc)
-> ParsecT
Void
Text
Identity
(Maybe (Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional
((,) (Ann SrcSpan (NAttrPath NExprLoc)
-> Maybe NExprLoc
-> (Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc))
-> Parser (Ann SrcSpan (NAttrPath NExprLoc))
-> ParsecT
Void
Text
Identity
(Maybe NExprLoc
-> (Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser ()
selDot Parser ()
-> Parser (Ann SrcSpan (NAttrPath NExprLoc))
-> Parser (Ann SrcSpan (NAttrPath NExprLoc))
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser (Ann SrcSpan (NAttrPath NExprLoc))
nixSelector) ParsecT
Void
Text
Identity
(Maybe NExprLoc
-> (Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc))
-> ParsecT Void Text Identity (Maybe NExprLoc)
-> ParsecT
Void
Text
Identity
(Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser NExprLoc -> ParsecT Void Text Identity (Maybe NExprLoc)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Text -> Parser ()
reserved "or" Parser () -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixTerm))
Maybe ()
continues <- Parser () -> ParsecT Void Text Identity (Maybe ())
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser () -> ParsecT Void Text Identity (Maybe ()))
-> Parser () -> ParsecT Void Text Identity (Maybe ())
forall a b. (a -> b) -> a -> b
$ Parser () -> Parser ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
lookAhead Parser ()
selDot
case Maybe ()
continues of
Nothing -> NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a. Applicative f => a -> f a
pure NExprLoc
res
Just _ -> Parser NExprLoc -> Parser NExprLoc
nixSelect (NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a. Applicative f => a -> f a
pure NExprLoc
res)
where
build
:: NExprLoc
-> Maybe (Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc)
-> NExprLoc
build :: NExprLoc
-> Maybe (Ann SrcSpan (NAttrPath NExprLoc), Maybe NExprLoc)
-> NExprLoc
build t :: NExprLoc
t Nothing = NExprLoc
t
build t :: NExprLoc
t (Just (s :: Ann SrcSpan (NAttrPath NExprLoc)
s, o :: Maybe NExprLoc
o)) = NExprLoc
-> Ann SrcSpan (NAttrPath NExprLoc) -> Maybe NExprLoc -> NExprLoc
nSelectLoc NExprLoc
t Ann SrcSpan (NAttrPath NExprLoc)
s Maybe NExprLoc
o
nixSelector :: Parser (Ann SrcSpan (NAttrPath NExprLoc))
nixSelector :: Parser (Ann SrcSpan (NAttrPath NExprLoc))
nixSelector = Parser (NAttrPath NExprLoc)
-> Parser (Ann SrcSpan (NAttrPath NExprLoc))
forall a. Parser a -> Parser (Ann SrcSpan a)
annotateLocation (Parser (NAttrPath NExprLoc)
-> Parser (Ann SrcSpan (NAttrPath NExprLoc)))
-> Parser (NAttrPath NExprLoc)
-> Parser (Ann SrcSpan (NAttrPath NExprLoc))
forall a b. (a -> b) -> a -> b
$ do
(x :: NKeyName NExprLoc
x : xs :: [NKeyName NExprLoc]
xs) <- Parser (NKeyName NExprLoc)
keyName Parser (NKeyName NExprLoc)
-> Parser () -> ParsecT Void Text Identity [NKeyName NExprLoc]
forall (m :: * -> *) a sep. MonadPlus m => m a -> m sep -> m [a]
`sepBy1` Parser ()
selDot
NAttrPath NExprLoc -> Parser (NAttrPath NExprLoc)
forall (m :: * -> *) a. Monad m => a -> m a
return (NAttrPath NExprLoc -> Parser (NAttrPath NExprLoc))
-> NAttrPath NExprLoc -> Parser (NAttrPath NExprLoc)
forall a b. (a -> b) -> a -> b
$ NKeyName NExprLoc
x NKeyName NExprLoc -> [NKeyName NExprLoc] -> NAttrPath NExprLoc
forall a. a -> [a] -> NonEmpty a
:| [NKeyName NExprLoc]
xs
nixTerm :: Parser NExprLoc
nixTerm :: Parser NExprLoc
nixTerm = do
Char
c <- ParsecT Void Text Identity Char -> ParsecT Void Text Identity Char
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (ParsecT Void Text Identity Char
-> ParsecT Void Text Identity Char)
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity Char
forall a b. (a -> b) -> a -> b
$ ParsecT Void Text Identity Char -> ParsecT Void Text Identity Char
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
lookAhead (ParsecT Void Text Identity Char
-> ParsecT Void Text Identity Char)
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity Char
forall a b. (a -> b) -> a -> b
$ (Token Text -> Bool) -> ParsecT Void Text Identity Char
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy ((Token Text -> Bool) -> ParsecT Void Text Identity Char)
-> (Token Text -> Bool) -> ParsecT Void Text Identity Char
forall a b. (a -> b) -> a -> b
$ \x :: Token Text
x ->
Char -> Bool
pathChar Char
Token Text
x
Bool -> Bool -> Bool
|| Char
Token Text
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '('
Bool -> Bool -> Bool
|| Char
Token Text
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '{'
Bool -> Bool -> Bool
|| Char
Token Text
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '['
Bool -> Bool -> Bool
|| Char
Token Text
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '<'
Bool -> Bool -> Bool
|| Char
Token Text
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '/'
Bool -> Bool -> Bool
|| Char
Token Text
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '"'
Bool -> Bool -> Bool
|| Char
Token Text
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '\''
Bool -> Bool -> Bool
|| Char
Token Text
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '^'
case Char
c of
'(' -> Parser NExprLoc -> Parser NExprLoc
nixSelect Parser NExprLoc
nixParens
'{' -> Parser NExprLoc -> Parser NExprLoc
nixSelect Parser NExprLoc
nixSet
'[' -> Parser NExprLoc
nixList
'<' -> Parser NExprLoc
nixSearchPath
'/' -> Parser NExprLoc
nixPath
'"' -> Parser NExprLoc
nixString
'\'' -> Parser NExprLoc
nixString
'^' -> Parser NExprLoc
nixSynHole
_ ->
[Parser NExprLoc] -> Parser NExprLoc
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadPlus m) =>
t (m a) -> m a
msum
([Parser NExprLoc] -> Parser NExprLoc)
-> [Parser NExprLoc] -> Parser NExprLoc
forall a b. (a -> b) -> a -> b
$ [ Parser NExprLoc -> Parser NExprLoc
nixSelect Parser NExprLoc
nixSet | Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== 'r' ]
[Parser NExprLoc] -> [Parser NExprLoc] -> [Parser NExprLoc]
forall a. [a] -> [a] -> [a]
++ [ Parser NExprLoc
nixPath | Char -> Bool
pathChar Char
c ]
[Parser NExprLoc] -> [Parser NExprLoc] -> [Parser NExprLoc]
forall a. [a] -> [a] -> [a]
++ if Char -> Bool
isDigit Char
c
then [Parser NExprLoc
nixFloat, Parser NExprLoc
nixInt]
else
[ Parser NExprLoc
nixUri | Char -> Bool
isAlpha Char
c ]
[Parser NExprLoc] -> [Parser NExprLoc] -> [Parser NExprLoc]
forall a. [a] -> [a] -> [a]
++ [ Parser NExprLoc
nixBool | Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== 't' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== 'f' ]
[Parser NExprLoc] -> [Parser NExprLoc] -> [Parser NExprLoc]
forall a. [a] -> [a] -> [a]
++ [ Parser NExprLoc
nixNull | Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== 'n' ]
[Parser NExprLoc] -> [Parser NExprLoc] -> [Parser NExprLoc]
forall a. [a] -> [a] -> [a]
++ [Parser NExprLoc -> Parser NExprLoc
nixSelect Parser NExprLoc
nixSym]
nixToplevelForm :: Parser NExprLoc
nixToplevelForm :: Parser NExprLoc
nixToplevelForm = Parser NExprLoc
keywords Parser NExprLoc -> Parser NExprLoc -> Parser NExprLoc
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> Parser NExprLoc
nixLambda Parser NExprLoc -> Parser NExprLoc -> Parser NExprLoc
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> Parser NExprLoc
nixExpr
where keywords :: Parser NExprLoc
keywords = Parser NExprLoc
nixLet Parser NExprLoc -> Parser NExprLoc -> Parser NExprLoc
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> Parser NExprLoc
nixIf Parser NExprLoc -> Parser NExprLoc -> Parser NExprLoc
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> Parser NExprLoc
nixAssert Parser NExprLoc -> Parser NExprLoc -> Parser NExprLoc
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> Parser NExprLoc
nixWith
nixSym :: Parser NExprLoc
nixSym :: Parser NExprLoc
nixSym = Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1 (Parser (NExprF NExprLoc) -> Parser NExprLoc)
-> Parser (NExprF NExprLoc) -> Parser NExprLoc
forall a b. (a -> b) -> a -> b
$ Text -> NExprF NExprLoc
forall a. Text -> NExprF a
mkSymF (Text -> NExprF NExprLoc)
-> Parser Text -> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text
identifier
nixSynHole :: Parser NExprLoc
nixSynHole :: Parser NExprLoc
nixSynHole = Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1 (Parser (NExprF NExprLoc) -> Parser NExprLoc)
-> Parser (NExprF NExprLoc) -> Parser NExprLoc
forall a b. (a -> b) -> a -> b
$ Text -> NExprF NExprLoc
forall a. Text -> NExprF a
mkSynHoleF (Text -> NExprF NExprLoc)
-> Parser Text -> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'^' ParsecT Void Text Identity Char -> Parser Text -> Parser Text
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Parser Text
identifier)
nixInt :: Parser NExprLoc
nixInt :: Parser NExprLoc
nixInt = Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1 (Integer -> NExprF NExprLoc
forall a. Integer -> NExprF a
mkIntF (Integer -> NExprF NExprLoc)
-> ParsecT Void Text Identity Integer -> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Void Text Identity Integer
integer Parser (NExprF NExprLoc) -> String -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "integer")
nixFloat :: Parser NExprLoc
nixFloat :: Parser NExprLoc
nixFloat =
Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1 (Parser (NExprF NExprLoc) -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Float -> NExprF NExprLoc
forall a. Float -> NExprF a
mkFloatF (Float -> NExprF NExprLoc)
-> (Double -> Float) -> Double -> NExprF NExprLoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> Float
forall a b. (Real a, Fractional b) => a -> b
realToFrac (Double -> NExprF NExprLoc)
-> ParsecT Void Text Identity Double -> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Void Text Identity Double
float) Parser (NExprF NExprLoc) -> String -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "float")
nixBool :: Parser NExprLoc
nixBool :: Parser NExprLoc
nixBool =
Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1 (Text -> Bool -> Parser (NExprF NExprLoc)
forall a. Text -> Bool -> ParsecT Void Text Identity (NExprF a)
bool "true" Bool
True Parser (NExprF NExprLoc)
-> Parser (NExprF NExprLoc) -> Parser (NExprF NExprLoc)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> Text -> Bool -> Parser (NExprF NExprLoc)
forall a. Text -> Bool -> ParsecT Void Text Identity (NExprF a)
bool "false" Bool
False) Parser NExprLoc -> String -> Parser NExprLoc
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "bool"
where bool :: Text -> Bool -> ParsecT Void Text Identity (NExprF a)
bool str :: Text
str b :: Bool
b = Bool -> NExprF a
forall a. Bool -> NExprF a
mkBoolF Bool
b NExprF a -> Parser () -> ParsecT Void Text Identity (NExprF a)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser ()
reserved Text
str
nixNull :: Parser NExprLoc
nixNull :: Parser NExprLoc
nixNull = Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1 (NExprF NExprLoc
forall a. NExprF a
mkNullF NExprF NExprLoc -> Parser () -> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser ()
reserved "null" Parser (NExprF NExprLoc) -> String -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "null")
nixParens :: Parser NExprLoc
nixParens :: Parser NExprLoc
nixParens = Parser NExprLoc -> Parser NExprLoc
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
parens Parser NExprLoc
nixToplevelForm Parser NExprLoc -> String -> Parser NExprLoc
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "parens"
nixList :: Parser NExprLoc
nixList :: Parser NExprLoc
nixList = Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1 (Parser (NExprF NExprLoc) -> Parser (NExprF NExprLoc)
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
brackets ([NExprLoc] -> NExprF NExprLoc
forall r. [r] -> NExprF r
NList ([NExprLoc] -> NExprF NExprLoc)
-> ParsecT Void Text Identity [NExprLoc]
-> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser NExprLoc -> ParsecT Void Text Identity [NExprLoc]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many Parser NExprLoc
nixTerm) Parser (NExprF NExprLoc) -> String -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "list")
pathChar :: Char -> Bool
pathChar :: Char -> Bool
pathChar x :: Char
x =
Char -> Bool
isAlpha Char
x
Bool -> Bool -> Bool
|| Char -> Bool
isDigit Char
x
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '.'
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '_'
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '-'
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '+'
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '~'
slash :: Parser Char
slash :: ParsecT Void Text Identity Char
slash =
ParsecT Void Text Identity Char -> ParsecT Void Text Identity Char
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try
( Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'/'
ParsecT Void Text Identity Char
-> Parser () -> ParsecT Void Text Identity Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Void Text Identity Char -> Parser ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m ()
notFollowedBy ((Token Text -> Bool) -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy (\x :: Token Text
x -> Char
Token Text
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '/' Bool -> Bool -> Bool
|| Char
Token Text
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '*' Bool -> Bool -> Bool
|| Char -> Bool
isSpace Char
Token Text
x))
)
ParsecT Void Text Identity Char
-> String -> ParsecT Void Text Identity Char
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "slash"
nixSearchPath :: Parser NExprLoc
nixSearchPath :: Parser NExprLoc
nixSearchPath = Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1
( Bool -> String -> NExprF NExprLoc
forall a. Bool -> String -> NExprF a
mkPathF Bool
True
(String -> NExprF NExprLoc)
-> ParsecT Void Text Identity String -> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Void Text Identity String
-> ParsecT Void Text Identity String
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'<' ParsecT Void Text Identity Char
-> ParsecT Void Text Identity String
-> ParsecT Void Text Identity String
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity String
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many ((Token Text -> Bool) -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy Char -> Bool
Token Text -> Bool
pathChar ParsecT Void Text Identity Char
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity Char
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> ParsecT Void Text Identity Char
slash) ParsecT Void Text Identity String
-> Parser Text -> ParsecT Void Text Identity String
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Text -> Parser Text
symbol ">")
Parser (NExprF NExprLoc) -> String -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "spath"
)
pathStr :: Parser FilePath
pathStr :: ParsecT Void Text Identity String
pathStr = ParsecT Void Text Identity String
-> ParsecT Void Text Identity String
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
lexeme (ParsecT Void Text Identity String
-> ParsecT Void Text Identity String)
-> ParsecT Void Text Identity String
-> ParsecT Void Text Identity String
forall a b. (a -> b) -> a -> b
$ (String -> String -> String)
-> ParsecT Void Text Identity String
-> ParsecT Void Text Identity String
-> ParsecT Void Text Identity String
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2
String -> String -> String
forall a. [a] -> [a] -> [a]
(++)
(ParsecT Void Text Identity Char
-> ParsecT Void Text Identity String
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many ((Token Text -> Bool) -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy Char -> Bool
Token Text -> Bool
pathChar))
([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
Prelude.concat ([String] -> String)
-> ParsecT Void Text Identity [String]
-> ParsecT Void Text Identity String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Void Text Identity String
-> ParsecT Void Text Identity [String]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
some ((Char -> String -> String)
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity String
-> ParsecT Void Text Identity String
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 (:) ParsecT Void Text Identity Char
slash (ParsecT Void Text Identity Char
-> ParsecT Void Text Identity String
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
some ((Token Text -> Bool) -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy Char -> Bool
Token Text -> Bool
pathChar))))
nixPath :: Parser NExprLoc
nixPath :: Parser NExprLoc
nixPath = Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1 (Parser (NExprF NExprLoc) -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Bool -> String -> NExprF NExprLoc
forall a. Bool -> String -> NExprF a
mkPathF Bool
False (String -> NExprF NExprLoc)
-> ParsecT Void Text Identity String -> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Void Text Identity String
pathStr) Parser (NExprF NExprLoc) -> String -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "path")
nixLet :: Parser NExprLoc
nixLet :: Parser NExprLoc
nixLet = Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1
(Text -> Parser ()
reserved "let" Parser () -> Parser (NExprF NExprLoc) -> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Parser (NExprF NExprLoc)
letBody Parser (NExprF NExprLoc)
-> Parser (NExprF NExprLoc) -> Parser (NExprF NExprLoc)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> Parser (NExprF NExprLoc)
letBinders) Parser (NExprF NExprLoc) -> String -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "let block")
where
letBinders :: Parser (NExprF NExprLoc)
letBinders = [Binding NExprLoc] -> NExprLoc -> NExprF NExprLoc
forall r. [Binding r] -> r -> NExprF r
NLet ([Binding NExprLoc] -> NExprLoc -> NExprF NExprLoc)
-> ParsecT Void Text Identity [Binding NExprLoc]
-> ParsecT Void Text Identity (NExprLoc -> NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Void Text Identity [Binding NExprLoc]
nixBinders ParsecT Void Text Identity (NExprLoc -> NExprF NExprLoc)
-> Parser NExprLoc -> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Text -> Parser ()
reserved "in" Parser () -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm)
letBody :: Parser (NExprF NExprLoc)
letBody = (\x :: NExprLoc
x -> NExprLoc -> NAttrPath NExprLoc -> Maybe NExprLoc -> NExprF NExprLoc
forall r. r -> NAttrPath r -> Maybe r -> NExprF r
NSelect NExprLoc
x (Text -> NKeyName NExprLoc
forall r. Text -> NKeyName r
StaticKey "body" NKeyName NExprLoc -> [NKeyName NExprLoc] -> NAttrPath NExprLoc
forall a. a -> [a] -> NonEmpty a
:| []) Maybe NExprLoc
forall a. Maybe a
Nothing) (NExprLoc -> NExprF NExprLoc)
-> Parser NExprLoc -> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser NExprLoc
aset
aset :: Parser NExprLoc
aset = Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1 (Parser (NExprF NExprLoc) -> Parser NExprLoc)
-> Parser (NExprF NExprLoc) -> Parser NExprLoc
forall a b. (a -> b) -> a -> b
$ NRecordType -> [Binding NExprLoc] -> NExprF NExprLoc
forall r. NRecordType -> [Binding r] -> NExprF r
NSet NRecordType
NRecursive ([Binding NExprLoc] -> NExprF NExprLoc)
-> ParsecT Void Text Identity [Binding NExprLoc]
-> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Void Text Identity [Binding NExprLoc]
-> ParsecT Void Text Identity [Binding NExprLoc]
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
braces ParsecT Void Text Identity [Binding NExprLoc]
nixBinders
nixIf :: Parser NExprLoc
nixIf :: Parser NExprLoc
nixIf = Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1
( NExprLoc -> NExprLoc -> NExprLoc -> NExprF NExprLoc
forall r. r -> r -> r -> NExprF r
NIf
(NExprLoc -> NExprLoc -> NExprLoc -> NExprF NExprLoc)
-> Parser NExprLoc
-> ParsecT
Void Text Identity (NExprLoc -> NExprLoc -> NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser ()
reserved "if" Parser () -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixExpr)
ParsecT
Void Text Identity (NExprLoc -> NExprLoc -> NExprF NExprLoc)
-> Parser NExprLoc
-> ParsecT Void Text Identity (NExprLoc -> NExprF NExprLoc)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Text -> Parser ()
reserved "then" Parser () -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm)
ParsecT Void Text Identity (NExprLoc -> NExprF NExprLoc)
-> Parser NExprLoc -> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Text -> Parser ()
reserved "else" Parser () -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm)
Parser (NExprF NExprLoc) -> String -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "if"
)
nixAssert :: Parser NExprLoc
nixAssert :: Parser NExprLoc
nixAssert = Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1
( NExprLoc -> NExprLoc -> NExprF NExprLoc
forall r. r -> r -> NExprF r
NAssert
(NExprLoc -> NExprLoc -> NExprF NExprLoc)
-> Parser NExprLoc
-> ParsecT Void Text Identity (NExprLoc -> NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser ()
reserved "assert" Parser () -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixExpr)
ParsecT Void Text Identity (NExprLoc -> NExprF NExprLoc)
-> Parser NExprLoc -> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser Text
semi Parser Text -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm)
Parser (NExprF NExprLoc) -> String -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "assert"
)
nixWith :: Parser NExprLoc
nixWith :: Parser NExprLoc
nixWith = Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1
( NExprLoc -> NExprLoc -> NExprF NExprLoc
forall r. r -> r -> NExprF r
NWith
(NExprLoc -> NExprLoc -> NExprF NExprLoc)
-> Parser NExprLoc
-> ParsecT Void Text Identity (NExprLoc -> NExprF NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Text -> Parser ()
reserved "with" Parser () -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm)
ParsecT Void Text Identity (NExprLoc -> NExprF NExprLoc)
-> Parser NExprLoc -> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser Text
semi Parser Text -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm)
Parser (NExprF NExprLoc) -> String -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "with"
)
nixLambda :: Parser NExprLoc
nixLambda :: Parser NExprLoc
nixLambda = Ann SrcSpan (Params NExprLoc) -> NExprLoc -> NExprLoc
nAbs (Ann SrcSpan (Params NExprLoc) -> NExprLoc -> NExprLoc)
-> ParsecT Void Text Identity (Ann SrcSpan (Params NExprLoc))
-> ParsecT Void Text Identity (NExprLoc -> NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser (Params NExprLoc)
-> ParsecT Void Text Identity (Ann SrcSpan (Params NExprLoc))
forall a. Parser a -> Parser (Ann SrcSpan a)
annotateLocation (Parser (Params NExprLoc) -> Parser (Params NExprLoc)
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try Parser (Params NExprLoc)
argExpr) ParsecT Void Text Identity (NExprLoc -> NExprLoc)
-> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser NExprLoc
nixToplevelForm
nixString :: Parser NExprLoc
nixString :: Parser NExprLoc
nixString = Ann SrcSpan (NString NExprLoc) -> NExprLoc
nStr (Ann SrcSpan (NString NExprLoc) -> NExprLoc)
-> ParsecT Void Text Identity (Ann SrcSpan (NString NExprLoc))
-> Parser NExprLoc
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser (NString NExprLoc)
-> ParsecT Void Text Identity (Ann SrcSpan (NString NExprLoc))
forall a. Parser a -> Parser (Ann SrcSpan a)
annotateLocation Parser (NString NExprLoc)
nixString'
nixUri :: Parser NExprLoc
nixUri :: Parser NExprLoc
nixUri = Parser NExprLoc -> Parser NExprLoc
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
lexeme (Parser NExprLoc -> Parser NExprLoc)
-> Parser NExprLoc -> Parser NExprLoc
forall a b. (a -> b) -> a -> b
$ Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1 (Parser (NExprF NExprLoc) -> Parser NExprLoc)
-> Parser (NExprF NExprLoc) -> Parser NExprLoc
forall a b. (a -> b) -> a -> b
$ Parser (NExprF NExprLoc) -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Parser (NExprF NExprLoc) -> Parser (NExprF NExprLoc))
-> Parser (NExprF NExprLoc) -> Parser (NExprF NExprLoc)
forall a b. (a -> b) -> a -> b
$ do
Char
start <- ParsecT Void Text Identity Char
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m (Token s)
letterChar
String
protocol <- ParsecT Void Text Identity Char
-> ParsecT Void Text Identity String
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many (ParsecT Void Text Identity Char
-> ParsecT Void Text Identity String)
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity String
forall a b. (a -> b) -> a -> b
$ (Token Text -> Bool) -> ParsecT Void Text Identity Char
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy ((Token Text -> Bool) -> ParsecT Void Text Identity Char)
-> (Token Text -> Bool) -> ParsecT Void Text Identity Char
forall a b. (a -> b) -> a -> b
$ \x :: Token Text
x ->
Char -> Bool
isAlpha Char
Token Text
x Bool -> Bool -> Bool
|| Char -> Bool
isDigit Char
Token Text
x Bool -> Bool -> Bool
|| Char
Token Text
x Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ("+-." :: String)
Text
_ <- Tokens Text -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string ":"
String
address <- ParsecT Void Text Identity Char
-> ParsecT Void Text Identity String
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
some (ParsecT Void Text Identity Char
-> ParsecT Void Text Identity String)
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity String
forall a b. (a -> b) -> a -> b
$ (Token Text -> Bool) -> ParsecT Void Text Identity Char
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy ((Token Text -> Bool) -> ParsecT Void Text Identity Char)
-> (Token Text -> Bool) -> ParsecT Void Text Identity Char
forall a b. (a -> b) -> a -> b
$ \x :: Token Text
x ->
Char -> Bool
isAlpha Char
Token Text
x Bool -> Bool -> Bool
|| Char -> Bool
isDigit Char
Token Text
x Bool -> Bool -> Bool
|| Char
Token Text
x Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ("%/?:@&=+$,-_.!~*'" :: String)
NExprF NExprLoc -> Parser (NExprF NExprLoc)
forall (m :: * -> *) a. Monad m => a -> m a
return (NExprF NExprLoc -> Parser (NExprF NExprLoc))
-> NExprF NExprLoc -> Parser (NExprF NExprLoc)
forall a b. (a -> b) -> a -> b
$ NString NExprLoc -> NExprF NExprLoc
forall r. NString r -> NExprF r
NStr (NString NExprLoc -> NExprF NExprLoc)
-> NString NExprLoc -> NExprF NExprLoc
forall a b. (a -> b) -> a -> b
$ [Antiquoted Text NExprLoc] -> NString NExprLoc
forall r. [Antiquoted Text r] -> NString r
DoubleQuoted
[Text -> Antiquoted Text NExprLoc
forall v r. v -> Antiquoted v r
Plain (Text -> Antiquoted Text NExprLoc)
-> Text -> Antiquoted Text NExprLoc
forall a b. (a -> b) -> a -> b
$ String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Char
start Char -> String -> String
forall a. a -> [a] -> [a]
: String
protocol String -> String -> String
forall a. [a] -> [a] -> [a]
++ ':' Char -> String -> String
forall a. a -> [a] -> [a]
: String
address]
nixString' :: Parser (NString NExprLoc)
nixString' :: Parser (NString NExprLoc)
nixString' = Parser (NString NExprLoc) -> Parser (NString NExprLoc)
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
lexeme (Parser (NString NExprLoc)
doubleQuoted Parser (NString NExprLoc)
-> Parser (NString NExprLoc) -> Parser (NString NExprLoc)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> Parser (NString NExprLoc)
indented Parser (NString NExprLoc) -> String -> Parser (NString NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "string")
where
doubleQuoted :: Parser (NString NExprLoc)
doubleQuoted :: Parser (NString NExprLoc)
doubleQuoted =
[Antiquoted Text NExprLoc] -> NString NExprLoc
forall r. [Antiquoted Text r] -> NString r
DoubleQuoted
([Antiquoted Text NExprLoc] -> NString NExprLoc)
-> ([Antiquoted Text NExprLoc] -> [Antiquoted Text NExprLoc])
-> [Antiquoted Text NExprLoc]
-> NString NExprLoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Antiquoted Text NExprLoc] -> [Antiquoted Text NExprLoc]
forall r. [Antiquoted Text r] -> [Antiquoted Text r]
removePlainEmpty
([Antiquoted Text NExprLoc] -> [Antiquoted Text NExprLoc])
-> ([Antiquoted Text NExprLoc] -> [Antiquoted Text NExprLoc])
-> [Antiquoted Text NExprLoc]
-> [Antiquoted Text NExprLoc]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Antiquoted Text NExprLoc] -> [Antiquoted Text NExprLoc]
forall r. [Antiquoted Text r] -> [Antiquoted Text r]
mergePlain
([Antiquoted Text NExprLoc] -> NString NExprLoc)
-> ParsecT Void Text Identity [Antiquoted Text NExprLoc]
-> Parser (NString NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ( Parser ()
doubleQ
Parser ()
-> ParsecT Void Text Identity [Antiquoted Text NExprLoc]
-> ParsecT Void Text Identity [Antiquoted Text NExprLoc]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
-> ParsecT Void Text Identity [Antiquoted Text NExprLoc]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many (Parser ()
-> Parser ()
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
stringChar Parser ()
doubleQ (ParsecT Void Text Identity Char -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT Void Text Identity Char -> Parser ())
-> ParsecT Void Text Identity Char -> Parser ()
forall a b. (a -> b) -> a -> b
$ Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'\\') ParsecT Void Text Identity (Antiquoted Text NExprLoc)
forall r. ParsecT Void Text Identity (Antiquoted Text r)
doubleEscape)
ParsecT Void Text Identity [Antiquoted Text NExprLoc]
-> Parser ()
-> ParsecT Void Text Identity [Antiquoted Text NExprLoc]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
doubleQ
)
Parser (NString NExprLoc) -> String -> Parser (NString NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "double quoted string"
doubleQ :: Parser ()
doubleQ = ParsecT Void Text Identity Char -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'"')
doubleEscape :: ParsecT Void Text Identity (Antiquoted Text r)
doubleEscape = Text -> Antiquoted Text r
forall v r. v -> Antiquoted v r
Plain (Text -> Antiquoted Text r)
-> (Char -> Text) -> Char -> Antiquoted Text r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Text
singleton (Char -> Antiquoted Text r)
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity (Antiquoted Text r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'\\' ParsecT Void Text Identity Char
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Void Text Identity Char
escapeCode)
indented :: Parser (NString NExprLoc)
indented :: Parser (NString NExprLoc)
indented =
[Antiquoted Text NExprLoc] -> NString NExprLoc
forall r. [Antiquoted Text r] -> NString r
stripIndent
([Antiquoted Text NExprLoc] -> NString NExprLoc)
-> ParsecT Void Text Identity [Antiquoted Text NExprLoc]
-> Parser (NString NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ( Parser ()
indentedQ
Parser ()
-> ParsecT Void Text Identity [Antiquoted Text NExprLoc]
-> ParsecT Void Text Identity [Antiquoted Text NExprLoc]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
-> ParsecT Void Text Identity [Antiquoted Text NExprLoc]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many (Parser ()
-> Parser ()
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
stringChar Parser ()
indentedQ Parser ()
indentedQ ParsecT Void Text Identity (Antiquoted Text NExprLoc)
forall r. ParsecT Void Text Identity (Antiquoted Text r)
indentedEscape)
ParsecT Void Text Identity [Antiquoted Text NExprLoc]
-> Parser ()
-> ParsecT Void Text Identity [Antiquoted Text NExprLoc]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
indentedQ
)
Parser (NString NExprLoc) -> String -> Parser (NString NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "indented string"
indentedQ :: Parser ()
indentedQ = ParsecT Void Text Identity (Tokens Text) -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Tokens Text -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string "''" ParsecT Void Text Identity (Tokens Text)
-> String -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "\"''\"")
indentedEscape :: ParsecT Void Text Identity (Antiquoted Text r)
indentedEscape = ParsecT Void Text Identity (Antiquoted Text r)
-> ParsecT Void Text Identity (Antiquoted Text r)
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (ParsecT Void Text Identity (Antiquoted Text r)
-> ParsecT Void Text Identity (Antiquoted Text r))
-> ParsecT Void Text Identity (Antiquoted Text r)
-> ParsecT Void Text Identity (Antiquoted Text r)
forall a b. (a -> b) -> a -> b
$ do
Parser ()
indentedQ
(Text -> Antiquoted Text r
forall v r. v -> Antiquoted v r
Plain (Text -> Antiquoted Text r)
-> Parser Text -> ParsecT Void Text Identity (Antiquoted Text r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ("''" Text -> ParsecT Void Text Identity Char -> Parser Text
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'\'' Parser Text -> Parser Text -> Parser Text
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> "$" Text -> ParsecT Void Text Identity Char -> Parser Text
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'$')) ParsecT Void Text Identity (Antiquoted Text r)
-> ParsecT Void Text Identity (Antiquoted Text r)
-> ParsecT Void Text Identity (Antiquoted Text r)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> do
Char
_ <- Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'\\'
Char
c <- ParsecT Void Text Identity Char
escapeCode
Antiquoted Text r -> ParsecT Void Text Identity (Antiquoted Text r)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Antiquoted Text r
-> ParsecT Void Text Identity (Antiquoted Text r))
-> Antiquoted Text r
-> ParsecT Void Text Identity (Antiquoted Text r)
forall a b. (a -> b) -> a -> b
$ if Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '\n' then Antiquoted Text r
forall v r. Antiquoted v r
EscapedNewline else Text -> Antiquoted Text r
forall v r. v -> Antiquoted v r
Plain (Text -> Antiquoted Text r) -> Text -> Antiquoted Text r
forall a b. (a -> b) -> a -> b
$ Char -> Text
singleton Char
c
stringChar :: Parser ()
-> Parser ()
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
stringChar end :: Parser ()
end escStart :: Parser ()
escStart esc :: ParsecT Void Text Identity (Antiquoted Text NExprLoc)
esc =
NExprLoc -> Antiquoted Text NExprLoc
forall v r. r -> Antiquoted v r
Antiquoted
(NExprLoc -> Antiquoted Text NExprLoc)
-> Parser NExprLoc
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser Text
antiStart Parser Text -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm Parser NExprLoc
-> ParsecT Void Text Identity Char -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'}')
ParsecT Void Text Identity (Antiquoted Text NExprLoc)
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> Text -> Antiquoted Text NExprLoc
forall v r. v -> Antiquoted v r
Plain
(Text -> Antiquoted Text NExprLoc)
-> (Char -> Text) -> Char -> Antiquoted Text NExprLoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Text
singleton
(Char -> Antiquoted Text NExprLoc)
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'$'
ParsecT Void Text Identity (Antiquoted Text NExprLoc)
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
esc
ParsecT Void Text Identity (Antiquoted Text NExprLoc)
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> Text -> Antiquoted Text NExprLoc
forall v r. v -> Antiquoted v r
Plain
(Text -> Antiquoted Text NExprLoc)
-> (String -> Text) -> String -> Antiquoted Text NExprLoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
pack
(String -> Antiquoted Text NExprLoc)
-> ParsecT Void Text Identity String
-> ParsecT Void Text Identity (Antiquoted Text NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity String
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
some ParsecT Void Text Identity Char
plainChar
where
plainChar :: ParsecT Void Text Identity Char
plainChar =
Parser () -> Parser ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m ()
notFollowedBy (Parser ()
end Parser () -> Parser () -> Parser ()
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> ParsecT Void Text Identity Char -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'$') Parser () -> Parser () -> Parser ()
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> Parser ()
escStart) Parser ()
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Void Text Identity Char
forall e s (m :: * -> *). MonadParsec e s m => m (Token s)
anySingle
escapeCode :: ParsecT Void Text Identity Char
escapeCode = [ParsecT Void Text Identity Char]
-> ParsecT Void Text Identity Char
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadPlus m) =>
t (m a) -> m a
msum [ Char
c Char
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity Char
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token Text
e | (c :: Char
c, e :: Char
e) <- [(Char, Char)]
escapeCodes ] ParsecT Void Text Identity Char
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity Char
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> ParsecT Void Text Identity Char
forall e s (m :: * -> *). MonadParsec e s m => m (Token s)
anySingle
argExpr :: Parser (Params NExprLoc)
argExpr :: Parser (Params NExprLoc)
argExpr = [Parser (Params NExprLoc)] -> Parser (Params NExprLoc)
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadPlus m) =>
t (m a) -> m a
msum [Parser (Params NExprLoc)
atLeft, Parser (Params NExprLoc)
forall r. ParsecT Void Text Identity (Params r)
onlyname, Parser (Params NExprLoc)
atRight] Parser (Params NExprLoc) -> Parser Text -> Parser (Params NExprLoc)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Text -> Parser Text
symbol ":" where
onlyname :: ParsecT Void Text Identity (Params r)
onlyname =
[ParsecT Void Text Identity (Params r)]
-> ParsecT Void Text Identity (Params r)
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, MonadPlus m) =>
t (m a) -> m a
msum
[ Parser NExprLoc
nixUri Parser NExprLoc
-> ParsecT Void Text Identity (Params r)
-> ParsecT Void Text Identity (Params r)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ErrorItem (Token Text) -> ParsecT Void Text Identity (Params r)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
ErrorItem (Token s) -> m a
unexpected (NonEmpty Char -> ErrorItem Char
forall t. NonEmpty Char -> ErrorItem t
Label ('v' Char -> String -> NonEmpty Char
forall a. a -> [a] -> NonEmpty a
NE.:| "alid uri"))
, Text -> Params r
forall r. Text -> Params r
Param (Text -> Params r)
-> Parser Text -> ParsecT Void Text Identity (Params r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text
identifier
]
atLeft :: Parser (Params NExprLoc)
atLeft = Parser (Params NExprLoc) -> Parser (Params NExprLoc)
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Parser (Params NExprLoc) -> Parser (Params NExprLoc))
-> Parser (Params NExprLoc) -> Parser (Params NExprLoc)
forall a b. (a -> b) -> a -> b
$ do
Text
name <- Parser Text
identifier Parser Text -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Text -> Parser Text
symbol "@"
(variadic :: Bool
variadic, params :: [(Text, Maybe NExprLoc)]
params) <- ParsecT Void Text Identity (Bool, [(Text, Maybe NExprLoc)])
params
Params NExprLoc -> Parser (Params NExprLoc)
forall (m :: * -> *) a. Monad m => a -> m a
return (Params NExprLoc -> Parser (Params NExprLoc))
-> Params NExprLoc -> Parser (Params NExprLoc)
forall a b. (a -> b) -> a -> b
$ [(Text, Maybe NExprLoc)] -> Bool -> Maybe Text -> Params NExprLoc
forall r. ParamSet r -> Bool -> Maybe Text -> Params r
ParamSet [(Text, Maybe NExprLoc)]
params Bool
variadic (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
name)
atRight :: Parser (Params NExprLoc)
atRight = do
(variadic :: Bool
variadic, params :: [(Text, Maybe NExprLoc)]
params) <- ParsecT Void Text Identity (Bool, [(Text, Maybe NExprLoc)])
params
Maybe Text
name <- Parser Text -> ParsecT Void Text Identity (Maybe Text)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser Text -> ParsecT Void Text Identity (Maybe Text))
-> Parser Text -> ParsecT Void Text Identity (Maybe Text)
forall a b. (a -> b) -> a -> b
$ Text -> Parser Text
symbol "@" Parser Text -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text
identifier
Params NExprLoc -> Parser (Params NExprLoc)
forall (m :: * -> *) a. Monad m => a -> m a
return (Params NExprLoc -> Parser (Params NExprLoc))
-> Params NExprLoc -> Parser (Params NExprLoc)
forall a b. (a -> b) -> a -> b
$ [(Text, Maybe NExprLoc)] -> Bool -> Maybe Text -> Params NExprLoc
forall r. ParamSet r -> Bool -> Maybe Text -> Params r
ParamSet [(Text, Maybe NExprLoc)]
params Bool
variadic Maybe Text
name
params :: ParsecT Void Text Identity (Bool, [(Text, Maybe NExprLoc)])
params = do
(args :: [(Text, Maybe NExprLoc)]
args, dotdots :: Bool
dotdots) <- ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
braces ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
getParams
(Bool, [(Text, Maybe NExprLoc)])
-> ParsecT Void Text Identity (Bool, [(Text, Maybe NExprLoc)])
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
dotdots, [(Text, Maybe NExprLoc)]
args)
getParams :: Parser ([(Text, Maybe NExprLoc)], Bool)
getParams :: ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
getParams = [(Text, Maybe NExprLoc)]
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
go [] where
go :: [(Text, Maybe NExprLoc)]
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
go acc :: [(Text, Maybe NExprLoc)]
acc = (([(Text, Maybe NExprLoc)]
acc, Bool
True) ([(Text, Maybe NExprLoc)], Bool)
-> Parser Text
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
symbol "...") ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> [(Text, Maybe NExprLoc)]
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
getMore [(Text, Maybe NExprLoc)]
acc
getMore :: [(Text, Maybe NExprLoc)]
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
getMore acc :: [(Text, Maybe NExprLoc)]
acc =
([(Text, Maybe NExprLoc)], Bool)
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
forall (m :: * -> *) a. Alternative m => a -> m a -> m a
option ([(Text, Maybe NExprLoc)]
acc, Bool
False) (ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool))
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
forall a b. (a -> b) -> a -> b
$ do
(Text, Maybe NExprLoc)
pair <- (Text -> Maybe NExprLoc -> (Text, Maybe NExprLoc))
-> Parser Text
-> ParsecT Void Text Identity (Maybe NExprLoc)
-> ParsecT Void Text Identity (Text, Maybe NExprLoc)
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 (,) Parser Text
identifier (Parser NExprLoc -> ParsecT Void Text Identity (Maybe NExprLoc)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Parser NExprLoc -> ParsecT Void Text Identity (Maybe NExprLoc))
-> Parser NExprLoc -> ParsecT Void Text Identity (Maybe NExprLoc)
forall a b. (a -> b) -> a -> b
$ Parser Text
question Parser Text -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm)
([(Text, Maybe NExprLoc)], Bool)
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
forall (m :: * -> *) a. Alternative m => a -> m a -> m a
option ([(Text, Maybe NExprLoc)]
acc [(Text, Maybe NExprLoc)]
-> [(Text, Maybe NExprLoc)] -> [(Text, Maybe NExprLoc)]
forall a. [a] -> [a] -> [a]
++ [(Text, Maybe NExprLoc)
pair], Bool
False) (ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool))
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
forall a b. (a -> b) -> a -> b
$ Parser Text
comma Parser Text
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> [(Text, Maybe NExprLoc)]
-> ParsecT Void Text Identity ([(Text, Maybe NExprLoc)], Bool)
go ([(Text, Maybe NExprLoc)]
acc [(Text, Maybe NExprLoc)]
-> [(Text, Maybe NExprLoc)] -> [(Text, Maybe NExprLoc)]
forall a. [a] -> [a] -> [a]
++ [(Text, Maybe NExprLoc)
pair])
nixBinders :: Parser [Binding NExprLoc]
nixBinders :: ParsecT Void Text Identity [Binding NExprLoc]
nixBinders = (ParsecT Void Text Identity (Binding NExprLoc)
inherit ParsecT Void Text Identity (Binding NExprLoc)
-> ParsecT Void Text Identity (Binding NExprLoc)
-> ParsecT Void Text Identity (Binding NExprLoc)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> ParsecT Void Text Identity (Binding NExprLoc)
namedVar) ParsecT Void Text Identity (Binding NExprLoc)
-> Parser Text -> ParsecT Void Text Identity [Binding NExprLoc]
forall (m :: * -> *) a sep. MonadPlus m => m a -> m sep -> m [a]
`endBy` Parser Text
semi where
inherit :: ParsecT Void Text Identity (Binding NExprLoc)
inherit = do
Parser () -> Parser ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Tokens Text -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string "inherit" Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser () -> Parser ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
lookAhead (ParsecT Void Text Identity Char -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ((Token Text -> Bool) -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy Char -> Bool
Token Text -> Bool
reservedEnd))
SourcePos
p <- ParsecT Void Text Identity SourcePos
forall e s (m :: * -> *). MonadParsec e s m => m SourcePos
getSourcePos
Maybe NExprLoc
x <- Parser ()
whiteSpace Parser ()
-> ParsecT Void Text Identity (Maybe NExprLoc)
-> ParsecT Void Text Identity (Maybe NExprLoc)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc -> ParsecT Void Text Identity (Maybe NExprLoc)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional Parser NExprLoc
scope
Maybe NExprLoc
-> [NKeyName NExprLoc] -> SourcePos -> Binding NExprLoc
forall r. Maybe r -> [NKeyName r] -> SourcePos -> Binding r
Inherit Maybe NExprLoc
x ([NKeyName NExprLoc] -> SourcePos -> Binding NExprLoc)
-> ParsecT Void Text Identity [NKeyName NExprLoc]
-> ParsecT Void Text Identity (SourcePos -> Binding NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser (NKeyName NExprLoc)
-> ParsecT Void Text Identity [NKeyName NExprLoc]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many Parser (NKeyName NExprLoc)
keyName ParsecT Void Text Identity (SourcePos -> Binding NExprLoc)
-> ParsecT Void Text Identity SourcePos
-> ParsecT Void Text Identity (Binding NExprLoc)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> SourcePos -> ParsecT Void Text Identity SourcePos
forall (f :: * -> *) a. Applicative f => a -> f a
pure SourcePos
p ParsecT Void Text Identity (Binding NExprLoc)
-> String -> ParsecT Void Text Identity (Binding NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "inherited binding"
namedVar :: ParsecT Void Text Identity (Binding NExprLoc)
namedVar = do
SourcePos
p <- ParsecT Void Text Identity SourcePos
forall e s (m :: * -> *). MonadParsec e s m => m SourcePos
getSourcePos
NAttrPath NExprLoc -> NExprLoc -> SourcePos -> Binding NExprLoc
forall r. NAttrPath r -> r -> SourcePos -> Binding r
NamedVar
(NAttrPath NExprLoc -> NExprLoc -> SourcePos -> Binding NExprLoc)
-> Parser (NAttrPath NExprLoc)
-> ParsecT
Void Text Identity (NExprLoc -> SourcePos -> Binding NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Ann SrcSpan (NAttrPath NExprLoc) -> NAttrPath NExprLoc
forall ann a. Ann ann a -> a
annotated (Ann SrcSpan (NAttrPath NExprLoc) -> NAttrPath NExprLoc)
-> Parser (Ann SrcSpan (NAttrPath NExprLoc))
-> Parser (NAttrPath NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser (Ann SrcSpan (NAttrPath NExprLoc))
nixSelector)
ParsecT
Void Text Identity (NExprLoc -> SourcePos -> Binding NExprLoc)
-> Parser NExprLoc
-> ParsecT Void Text Identity (SourcePos -> Binding NExprLoc)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser Text
equals Parser Text -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm)
ParsecT Void Text Identity (SourcePos -> Binding NExprLoc)
-> ParsecT Void Text Identity SourcePos
-> ParsecT Void Text Identity (Binding NExprLoc)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> SourcePos -> ParsecT Void Text Identity SourcePos
forall (f :: * -> *) a. Applicative f => a -> f a
pure SourcePos
p
ParsecT Void Text Identity (Binding NExprLoc)
-> String -> ParsecT Void Text Identity (Binding NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "variable binding"
scope :: Parser NExprLoc
scope = Parser NExprLoc -> Parser NExprLoc
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
parens Parser NExprLoc
nixToplevelForm Parser NExprLoc -> String -> Parser NExprLoc
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "inherit scope"
keyName :: Parser (NKeyName NExprLoc)
keyName :: Parser (NKeyName NExprLoc)
keyName = Parser (NKeyName NExprLoc)
dynamicKey Parser (NKeyName NExprLoc)
-> Parser (NKeyName NExprLoc) -> Parser (NKeyName NExprLoc)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> Parser (NKeyName NExprLoc)
forall r. ParsecT Void Text Identity (NKeyName r)
staticKey where
staticKey :: ParsecT Void Text Identity (NKeyName r)
staticKey = Text -> NKeyName r
forall r. Text -> NKeyName r
StaticKey (Text -> NKeyName r)
-> Parser Text -> ParsecT Void Text Identity (NKeyName r)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text
identifier
dynamicKey :: Parser (NKeyName NExprLoc)
dynamicKey = Antiquoted (NString NExprLoc) NExprLoc -> NKeyName NExprLoc
forall r. Antiquoted (NString r) r -> NKeyName r
DynamicKey (Antiquoted (NString NExprLoc) NExprLoc -> NKeyName NExprLoc)
-> ParsecT
Void Text Identity (Antiquoted (NString NExprLoc) NExprLoc)
-> Parser (NKeyName NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser (NString NExprLoc)
-> ParsecT
Void Text Identity (Antiquoted (NString NExprLoc) NExprLoc)
forall a. Parser a -> Parser (Antiquoted a NExprLoc)
nixAntiquoted Parser (NString NExprLoc)
nixString'
nixSet :: Parser NExprLoc
nixSet :: Parser NExprLoc
nixSet = Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1 ((ParsecT Void Text Identity ([Binding NExprLoc] -> NExprF NExprLoc)
forall r. ParsecT Void Text Identity ([Binding r] -> NExprF r)
isRec ParsecT Void Text Identity ([Binding NExprLoc] -> NExprF NExprLoc)
-> ParsecT Void Text Identity [Binding NExprLoc]
-> Parser (NExprF NExprLoc)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT Void Text Identity [Binding NExprLoc]
-> ParsecT Void Text Identity [Binding NExprLoc]
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
braces ParsecT Void Text Identity [Binding NExprLoc]
nixBinders) Parser (NExprF NExprLoc) -> String -> Parser (NExprF NExprLoc)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "set")
where isRec :: ParsecT Void Text Identity ([Binding r] -> NExprF r)
isRec = (Text -> Parser ()
reserved "rec" Parser ()
-> ([Binding r] -> NExprF r)
-> ParsecT Void Text Identity ([Binding r] -> NExprF r)
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> NRecordType -> [Binding r] -> NExprF r
forall r. NRecordType -> [Binding r] -> NExprF r
NSet NRecordType
NRecursive ParsecT Void Text Identity ([Binding r] -> NExprF r)
-> String -> ParsecT Void Text Identity ([Binding r] -> NExprF r)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> String -> m a
<?> "recursive set") ParsecT Void Text Identity ([Binding r] -> NExprF r)
-> ParsecT Void Text Identity ([Binding r] -> NExprF r)
-> ParsecT Void Text Identity ([Binding r] -> NExprF r)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
<+> ([Binding r] -> NExprF r)
-> ParsecT Void Text Identity ([Binding r] -> NExprF r)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (NRecordType -> [Binding r] -> NExprF r
forall r. NRecordType -> [Binding r] -> NExprF r
NSet NRecordType
NNonRecursive)
parseNixFile :: MonadFile m => FilePath -> m (Result NExpr)
parseNixFile :: String -> m (Result NExpr)
parseNixFile =
Parser NExpr -> String -> m (Result NExpr)
forall (m :: * -> *) a.
MonadFile m =>
Parser a -> String -> m (Result a)
parseFromFileEx (Parser NExpr -> String -> m (Result NExpr))
-> Parser NExpr -> String -> m (Result NExpr)
forall a b. (a -> b) -> a -> b
$ NExprLoc -> NExpr
forall (f :: * -> *) ann. Functor f => Fix (AnnF ann f) -> Fix f
stripAnnotation (NExprLoc -> NExpr) -> Parser NExprLoc -> Parser NExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser ()
whiteSpace Parser () -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm Parser NExprLoc -> Parser () -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall e s (m :: * -> *). MonadParsec e s m => m ()
eof)
parseNixFileLoc :: MonadFile m => FilePath -> m (Result NExprLoc)
parseNixFileLoc :: String -> m (Result NExprLoc)
parseNixFileLoc = Parser NExprLoc -> String -> m (Result NExprLoc)
forall (m :: * -> *) a.
MonadFile m =>
Parser a -> String -> m (Result a)
parseFromFileEx (Parser ()
whiteSpace Parser () -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm Parser NExprLoc -> Parser () -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall e s (m :: * -> *). MonadParsec e s m => m ()
eof)
parseNixText :: Text -> Result NExpr
parseNixText :: Text -> Result NExpr
parseNixText =
Parser NExpr -> Text -> Result NExpr
forall a. Parser a -> Text -> Result a
parseFromText (Parser NExpr -> Text -> Result NExpr)
-> Parser NExpr -> Text -> Result NExpr
forall a b. (a -> b) -> a -> b
$ NExprLoc -> NExpr
forall (f :: * -> *) ann. Functor f => Fix (AnnF ann f) -> Fix f
stripAnnotation (NExprLoc -> NExpr) -> Parser NExprLoc -> Parser NExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Parser ()
whiteSpace Parser () -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm Parser NExprLoc -> Parser () -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall e s (m :: * -> *). MonadParsec e s m => m ()
eof)
parseNixTextLoc :: Text -> Result NExprLoc
parseNixTextLoc :: Text -> Result NExprLoc
parseNixTextLoc = Parser NExprLoc -> Text -> Result NExprLoc
forall a. Parser a -> Text -> Result a
parseFromText (Parser ()
whiteSpace Parser () -> Parser NExprLoc -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser NExprLoc
nixToplevelForm Parser NExprLoc -> Parser () -> Parser NExprLoc
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
forall e s (m :: * -> *). MonadParsec e s m => m ()
eof)
skipLineComment' :: Tokens Text -> Parser ()
prefix :: Tokens Text
prefix = Tokens Text -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Tokens Text
prefix
Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Maybe String
-> (Token Text -> Bool) -> ParsecT Void Text Identity (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 "character") (\x :: Token Text
x -> Char
Token Text
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= '\n' Bool -> Bool -> Bool
&& Char
Token Text
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= '\r'))
whiteSpace :: Parser ()
whiteSpace :: Parser ()
whiteSpace = Parser () -> Parser () -> Parser () -> Parser ()
forall e s (m :: * -> *).
MonadParsec e s m =>
m () -> m () -> m () -> m ()
L.space Parser ()
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space1 Parser ()
lineCmnt Parser ()
blockCmnt
where
lineCmnt :: Parser ()
lineCmnt = Tokens Text -> Parser ()
skipLineComment' "#"
blockCmnt :: Parser ()
blockCmnt = Tokens Text -> Tokens Text -> Parser ()
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Tokens s -> Tokens s -> m ()
L.skipBlockComment "/*" "*/"
lexeme :: Parser a -> Parser a
lexeme :: Parser a -> Parser a
lexeme p :: Parser a
p = Parser a
p Parser a -> Parser () -> Parser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ()
whiteSpace
symbol :: Text -> Parser Text
symbol :: Text -> Parser Text
symbol = Parser Text -> Parser Text
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
lexeme (Parser Text -> Parser Text)
-> (Text -> Parser Text) -> Text -> Parser Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Parser Text
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string
reservedEnd :: Char -> Bool
reservedEnd :: Char -> Bool
reservedEnd x :: Char
x =
Char -> Bool
isSpace Char
x
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '{'
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '('
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '['
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '}'
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== ')'
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== ']'
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== ';'
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== ':'
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '.'
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '"'
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '\''
Bool -> Bool -> Bool
|| Char
x
Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== ','
reserved :: Text -> Parser ()
reserved :: Text -> Parser ()
reserved n :: Text
n =
Parser () -> Parser ()
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
lexeme (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Parser () -> Parser ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ Tokens Text -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string Text
Tokens Text
n Parser Text -> Parser () -> Parser ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser () -> Parser ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
lookAhead (ParsecT Void Text Identity Char -> Parser ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ((Token Text -> Bool) -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy Char -> Bool
Token Text -> Bool
reservedEnd) Parser () -> Parser () -> Parser ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ()
forall e s (m :: * -> *). MonadParsec e s m => m ()
eof)
identifier :: Parser Text
identifier = Parser Text -> Parser Text
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
lexeme (Parser Text -> Parser Text) -> Parser Text -> Parser Text
forall a b. (a -> b) -> a -> b
$ Parser Text -> Parser Text
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Parser Text -> Parser Text) -> Parser Text -> Parser Text
forall a b. (a -> b) -> a -> b
$ do
Text
ident <-
Char -> Text -> Text
cons
(Char -> Text -> Text)
-> ParsecT Void Text Identity Char
-> ParsecT Void Text Identity (Text -> Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Token Text -> Bool) -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy (\x :: Token Text
x -> Char -> Bool
isAlpha Char
Token Text
x Bool -> Bool -> Bool
|| Char
Token Text
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '_')
ParsecT Void Text Identity (Text -> Text)
-> Parser Text -> Parser Text
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe String
-> (Token Text -> Bool) -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Maybe String -> (Token s -> Bool) -> m (Tokens s)
takeWhileP Maybe String
forall a. Maybe a
Nothing Char -> Bool
Token Text -> Bool
identLetter
Bool -> Parser ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Bool
not (Text
ident Text -> HashSet Text -> Bool
forall a. (Eq a, Hashable a) => a -> HashSet a -> Bool
`HashSet.member` HashSet Text
reservedNames))
Text -> Parser Text
forall (m :: * -> *) a. Monad m => a -> m a
return Text
ident
where
identLetter :: Char -> Bool
identLetter x :: Char
x = Char -> Bool
isAlpha Char
x Bool -> Bool -> Bool
|| Char -> Bool
isDigit Char
x Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '_' Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '\'' Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '-'
parens :: ParsecT Void Text Identity a -> ParsecT Void Text Identity a
parens = Parser Text
-> Parser Text
-> ParsecT Void Text Identity a
-> ParsecT Void Text Identity a
forall (m :: * -> *) open close a.
Applicative m =>
m open -> m close -> m a -> m a
between (Text -> Parser Text
symbol "(") (Text -> Parser Text
symbol ")")
braces :: ParsecT Void Text Identity a -> ParsecT Void Text Identity a
braces = Parser Text
-> Parser Text
-> ParsecT Void Text Identity a
-> ParsecT Void Text Identity a
forall (m :: * -> *) open close a.
Applicative m =>
m open -> m close -> m a -> m a
between (Text -> Parser Text
symbol "{") (Text -> Parser Text
symbol "}")
brackets :: ParsecT Void Text Identity a -> ParsecT Void Text Identity a
brackets = Parser Text
-> Parser Text
-> ParsecT Void Text Identity a
-> ParsecT Void Text Identity a
forall (m :: * -> *) open close a.
Applicative m =>
m open -> m close -> m a -> m a
between (Text -> Parser Text
symbol "[") (Text -> Parser Text
symbol "]")
semi :: Parser Text
semi = Text -> Parser Text
symbol ";"
comma :: Parser Text
comma = Text -> Parser Text
symbol ","
equals :: Parser Text
equals = Text -> Parser Text
symbol "="
question :: Parser Text
question = Text -> Parser Text
symbol "?"
integer :: Parser Integer
integer :: ParsecT Void Text Identity Integer
integer = ParsecT Void Text Identity Integer
-> ParsecT Void Text Identity Integer
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
lexeme ParsecT Void Text Identity Integer
forall e s (m :: * -> *) a.
(MonadParsec e s m, Token s ~ Char, Num a) =>
m a
L.decimal
float :: Parser Double
float :: ParsecT Void Text Identity Double
float = ParsecT Void Text Identity Double
-> ParsecT Void Text Identity Double
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
lexeme ParsecT Void Text Identity Double
forall e s (m :: * -> *) a.
(MonadParsec e s m, Token s ~ Char, RealFloat a) =>
m a
L.float
reservedNames :: HashSet Text
reservedNames :: HashSet Text
reservedNames = [Text] -> HashSet Text
forall a. (Eq a, Hashable a) => [a] -> HashSet a
HashSet.fromList
["let", "in", "if", "then", "else", "assert", "with", "rec", "inherit"]
type Parser = ParsecT Void Text Identity
data Result a = Success a | Failure (Doc Void) deriving (Int -> Result a -> String -> String
[Result a] -> String -> String
Result a -> String
(Int -> Result a -> String -> String)
-> (Result a -> String)
-> ([Result a] -> String -> String)
-> Show (Result a)
forall a. Show a => Int -> Result a -> String -> String
forall a. Show a => [Result a] -> String -> String
forall a. Show a => Result a -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [Result a] -> String -> String
$cshowList :: forall a. Show a => [Result a] -> String -> String
show :: Result a -> String
$cshow :: forall a. Show a => Result a -> String
showsPrec :: Int -> Result a -> String -> String
$cshowsPrec :: forall a. Show a => Int -> Result a -> String -> String
Show, a -> Result b -> Result a
(a -> b) -> Result a -> Result b
(forall a b. (a -> b) -> Result a -> Result b)
-> (forall a b. a -> Result b -> Result a) -> Functor Result
forall a b. a -> Result b -> Result a
forall a b. (a -> b) -> Result a -> Result b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Result b -> Result a
$c<$ :: forall a b. a -> Result b -> Result a
fmap :: (a -> b) -> Result a -> Result b
$cfmap :: forall a b. (a -> b) -> Result a -> Result b
Functor)
parseFromFileEx :: MonadFile m => Parser a -> FilePath -> m (Result a)
parseFromFileEx :: Parser a -> String -> m (Result a)
parseFromFileEx p :: Parser a
p path :: String
path = do
Text
txt <- ByteString -> Text
decodeUtf8 (ByteString -> Text) -> m ByteString -> m Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> m ByteString
forall (m :: * -> *). MonadFile m => String -> m ByteString
readFile String
path
Result a -> m (Result a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Result a -> m (Result a)) -> Result a -> m (Result a)
forall a b. (a -> b) -> a -> b
$ (ParseErrorBundle Text Void -> Result a)
-> (a -> Result a)
-> Either (ParseErrorBundle Text Void) a
-> Result a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Doc Void -> Result a
forall a. Doc Void -> Result a
Failure (Doc Void -> Result a)
-> (ParseErrorBundle Text Void -> Doc Void)
-> ParseErrorBundle Text Void
-> Result a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc Void
forall a ann. Pretty a => a -> Doc ann
pretty (String -> Doc Void)
-> (ParseErrorBundle Text Void -> String)
-> ParseErrorBundle Text Void
-> Doc Void
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseErrorBundle Text Void -> String
forall s e.
(Stream s, ShowErrorComponent e) =>
ParseErrorBundle s e -> String
errorBundlePretty) a -> Result a
forall a. a -> Result a
Success (Either (ParseErrorBundle Text Void) a -> Result a)
-> Either (ParseErrorBundle Text Void) a -> Result a
forall a b. (a -> b) -> a -> b
$ Parser a -> String -> Text -> Either (ParseErrorBundle Text Void) a
forall e s a.
Parsec e s a -> String -> s -> Either (ParseErrorBundle s e) a
parse Parser a
p
String
path
Text
txt
parseFromText :: Parser a -> Text -> Result a
parseFromText :: Parser a -> Text -> Result a
parseFromText p :: Parser a
p txt :: Text
txt =
(ParseErrorBundle Text Void -> Result a)
-> (a -> Result a)
-> Either (ParseErrorBundle Text Void) a
-> Result a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Doc Void -> Result a
forall a. Doc Void -> Result a
Failure (Doc Void -> Result a)
-> (ParseErrorBundle Text Void -> Doc Void)
-> ParseErrorBundle Text Void
-> Result a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc Void
forall a ann. Pretty a => a -> Doc ann
pretty (String -> Doc Void)
-> (ParseErrorBundle Text Void -> String)
-> ParseErrorBundle Text Void
-> Doc Void
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseErrorBundle Text Void -> String
forall s e.
(Stream s, ShowErrorComponent e) =>
ParseErrorBundle s e -> String
errorBundlePretty) a -> Result a
forall a. a -> Result a
Success (Either (ParseErrorBundle Text Void) a -> Result a)
-> Either (ParseErrorBundle Text Void) a -> Result a
forall a b. (a -> b) -> a -> b
$ Parser a -> String -> Text -> Either (ParseErrorBundle Text Void) a
forall e s a.
Parsec e s a -> String -> s -> Either (ParseErrorBundle s e) a
parse Parser a
p "<string>" Text
txt
data NSpecialOp = NHasAttrOp | NSelectOp
deriving (NSpecialOp -> NSpecialOp -> Bool
(NSpecialOp -> NSpecialOp -> Bool)
-> (NSpecialOp -> NSpecialOp -> Bool) -> Eq NSpecialOp
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NSpecialOp -> NSpecialOp -> Bool
$c/= :: NSpecialOp -> NSpecialOp -> Bool
== :: NSpecialOp -> NSpecialOp -> Bool
$c== :: NSpecialOp -> NSpecialOp -> Bool
Eq, Eq NSpecialOp
Eq NSpecialOp =>
(NSpecialOp -> NSpecialOp -> Ordering)
-> (NSpecialOp -> NSpecialOp -> Bool)
-> (NSpecialOp -> NSpecialOp -> Bool)
-> (NSpecialOp -> NSpecialOp -> Bool)
-> (NSpecialOp -> NSpecialOp -> Bool)
-> (NSpecialOp -> NSpecialOp -> NSpecialOp)
-> (NSpecialOp -> NSpecialOp -> NSpecialOp)
-> Ord NSpecialOp
NSpecialOp -> NSpecialOp -> Bool
NSpecialOp -> NSpecialOp -> Ordering
NSpecialOp -> NSpecialOp -> NSpecialOp
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: NSpecialOp -> NSpecialOp -> NSpecialOp
$cmin :: NSpecialOp -> NSpecialOp -> NSpecialOp
max :: NSpecialOp -> NSpecialOp -> NSpecialOp
$cmax :: NSpecialOp -> NSpecialOp -> NSpecialOp
>= :: NSpecialOp -> NSpecialOp -> Bool
$c>= :: NSpecialOp -> NSpecialOp -> Bool
> :: NSpecialOp -> NSpecialOp -> Bool
$c> :: NSpecialOp -> NSpecialOp -> Bool
<= :: NSpecialOp -> NSpecialOp -> Bool
$c<= :: NSpecialOp -> NSpecialOp -> Bool
< :: NSpecialOp -> NSpecialOp -> Bool
$c< :: NSpecialOp -> NSpecialOp -> Bool
compare :: NSpecialOp -> NSpecialOp -> Ordering
$ccompare :: NSpecialOp -> NSpecialOp -> Ordering
$cp1Ord :: Eq NSpecialOp
Ord, (forall x. NSpecialOp -> Rep NSpecialOp x)
-> (forall x. Rep NSpecialOp x -> NSpecialOp) -> Generic NSpecialOp
forall x. Rep NSpecialOp x -> NSpecialOp
forall x. NSpecialOp -> Rep NSpecialOp x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep NSpecialOp x -> NSpecialOp
$cfrom :: forall x. NSpecialOp -> Rep NSpecialOp x
Generic, Typeable, Typeable NSpecialOp
DataType
Constr
Typeable NSpecialOp =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NSpecialOp -> c NSpecialOp)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NSpecialOp)
-> (NSpecialOp -> Constr)
-> (NSpecialOp -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c NSpecialOp))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c NSpecialOp))
-> ((forall b. Data b => b -> b) -> NSpecialOp -> NSpecialOp)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> NSpecialOp -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> NSpecialOp -> r)
-> (forall u. (forall d. Data d => d -> u) -> NSpecialOp -> [u])
-> (forall u.
Int -> (forall d. Data d => d -> u) -> NSpecialOp -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> NSpecialOp -> m NSpecialOp)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NSpecialOp -> m NSpecialOp)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NSpecialOp -> m NSpecialOp)
-> Data NSpecialOp
NSpecialOp -> DataType
NSpecialOp -> Constr
(forall b. Data b => b -> b) -> NSpecialOp -> NSpecialOp
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NSpecialOp -> c NSpecialOp
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NSpecialOp
forall a.
Typeable a =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> NSpecialOp -> u
forall u. (forall d. Data d => d -> u) -> NSpecialOp -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> NSpecialOp -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> NSpecialOp -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> NSpecialOp -> m NSpecialOp
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NSpecialOp -> m NSpecialOp
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NSpecialOp
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NSpecialOp -> c NSpecialOp
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c NSpecialOp)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c NSpecialOp)
$cNSelectOp :: Constr
$cNHasAttrOp :: Constr
$tNSpecialOp :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> NSpecialOp -> m NSpecialOp
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NSpecialOp -> m NSpecialOp
gmapMp :: (forall d. Data d => d -> m d) -> NSpecialOp -> m NSpecialOp
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NSpecialOp -> m NSpecialOp
gmapM :: (forall d. Data d => d -> m d) -> NSpecialOp -> m NSpecialOp
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> NSpecialOp -> m NSpecialOp
gmapQi :: Int -> (forall d. Data d => d -> u) -> NSpecialOp -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> NSpecialOp -> u
gmapQ :: (forall d. Data d => d -> u) -> NSpecialOp -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> NSpecialOp -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> NSpecialOp -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> NSpecialOp -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> NSpecialOp -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> NSpecialOp -> r
gmapT :: (forall b. Data b => b -> b) -> NSpecialOp -> NSpecialOp
$cgmapT :: (forall b. Data b => b -> b) -> NSpecialOp -> NSpecialOp
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c NSpecialOp)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c NSpecialOp)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c NSpecialOp)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c NSpecialOp)
dataTypeOf :: NSpecialOp -> DataType
$cdataTypeOf :: NSpecialOp -> DataType
toConstr :: NSpecialOp -> Constr
$ctoConstr :: NSpecialOp -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NSpecialOp
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NSpecialOp
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NSpecialOp -> c NSpecialOp
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NSpecialOp -> c NSpecialOp
$cp1Data :: Typeable NSpecialOp
Data, Int -> NSpecialOp -> String -> String
[NSpecialOp] -> String -> String
NSpecialOp -> String
(Int -> NSpecialOp -> String -> String)
-> (NSpecialOp -> String)
-> ([NSpecialOp] -> String -> String)
-> Show NSpecialOp
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [NSpecialOp] -> String -> String
$cshowList :: [NSpecialOp] -> String -> String
show :: NSpecialOp -> String
$cshow :: NSpecialOp -> String
showsPrec :: Int -> NSpecialOp -> String -> String
$cshowsPrec :: Int -> NSpecialOp -> String -> String
Show, NSpecialOp -> ()
(NSpecialOp -> ()) -> NFData NSpecialOp
forall a. (a -> ()) -> NFData a
rnf :: NSpecialOp -> ()
$crnf :: NSpecialOp -> ()
NFData)
data NAssoc = NAssocNone | NAssocLeft | NAssocRight
deriving (NAssoc -> NAssoc -> Bool
(NAssoc -> NAssoc -> Bool)
-> (NAssoc -> NAssoc -> Bool) -> Eq NAssoc
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NAssoc -> NAssoc -> Bool
$c/= :: NAssoc -> NAssoc -> Bool
== :: NAssoc -> NAssoc -> Bool
$c== :: NAssoc -> NAssoc -> Bool
Eq, Eq NAssoc
Eq NAssoc =>
(NAssoc -> NAssoc -> Ordering)
-> (NAssoc -> NAssoc -> Bool)
-> (NAssoc -> NAssoc -> Bool)
-> (NAssoc -> NAssoc -> Bool)
-> (NAssoc -> NAssoc -> Bool)
-> (NAssoc -> NAssoc -> NAssoc)
-> (NAssoc -> NAssoc -> NAssoc)
-> Ord NAssoc
NAssoc -> NAssoc -> Bool
NAssoc -> NAssoc -> Ordering
NAssoc -> NAssoc -> NAssoc
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: NAssoc -> NAssoc -> NAssoc
$cmin :: NAssoc -> NAssoc -> NAssoc
max :: NAssoc -> NAssoc -> NAssoc
$cmax :: NAssoc -> NAssoc -> NAssoc
>= :: NAssoc -> NAssoc -> Bool
$c>= :: NAssoc -> NAssoc -> Bool
> :: NAssoc -> NAssoc -> Bool
$c> :: NAssoc -> NAssoc -> Bool
<= :: NAssoc -> NAssoc -> Bool
$c<= :: NAssoc -> NAssoc -> Bool
< :: NAssoc -> NAssoc -> Bool
$c< :: NAssoc -> NAssoc -> Bool
compare :: NAssoc -> NAssoc -> Ordering
$ccompare :: NAssoc -> NAssoc -> Ordering
$cp1Ord :: Eq NAssoc
Ord, (forall x. NAssoc -> Rep NAssoc x)
-> (forall x. Rep NAssoc x -> NAssoc) -> Generic NAssoc
forall x. Rep NAssoc x -> NAssoc
forall x. NAssoc -> Rep NAssoc x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep NAssoc x -> NAssoc
$cfrom :: forall x. NAssoc -> Rep NAssoc x
Generic, Typeable, Typeable NAssoc
DataType
Constr
Typeable NAssoc =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NAssoc -> c NAssoc)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NAssoc)
-> (NAssoc -> Constr)
-> (NAssoc -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c NAssoc))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c NAssoc))
-> ((forall b. Data b => b -> b) -> NAssoc -> NAssoc)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> NAssoc -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> NAssoc -> r)
-> (forall u. (forall d. Data d => d -> u) -> NAssoc -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> NAssoc -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> NAssoc -> m NAssoc)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NAssoc -> m NAssoc)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NAssoc -> m NAssoc)
-> Data NAssoc
NAssoc -> DataType
NAssoc -> Constr
(forall b. Data b => b -> b) -> NAssoc -> NAssoc
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NAssoc -> c NAssoc
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NAssoc
forall a.
Typeable a =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> NAssoc -> u
forall u. (forall d. Data d => d -> u) -> NAssoc -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> NAssoc -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> NAssoc -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> NAssoc -> m NAssoc
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NAssoc -> m NAssoc
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NAssoc
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NAssoc -> c NAssoc
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c NAssoc)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c NAssoc)
$cNAssocRight :: Constr
$cNAssocLeft :: Constr
$cNAssocNone :: Constr
$tNAssoc :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> NAssoc -> m NAssoc
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NAssoc -> m NAssoc
gmapMp :: (forall d. Data d => d -> m d) -> NAssoc -> m NAssoc
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NAssoc -> m NAssoc
gmapM :: (forall d. Data d => d -> m d) -> NAssoc -> m NAssoc
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> NAssoc -> m NAssoc
gmapQi :: Int -> (forall d. Data d => d -> u) -> NAssoc -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> NAssoc -> u
gmapQ :: (forall d. Data d => d -> u) -> NAssoc -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> NAssoc -> [u]
gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> NAssoc -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> NAssoc -> r
gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> NAssoc -> r
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> NAssoc -> r
gmapT :: (forall b. Data b => b -> b) -> NAssoc -> NAssoc
$cgmapT :: (forall b. Data b => b -> b) -> NAssoc -> NAssoc
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c NAssoc)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c NAssoc)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c NAssoc)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c NAssoc)
dataTypeOf :: NAssoc -> DataType
$cdataTypeOf :: NAssoc -> DataType
toConstr :: NAssoc -> Constr
$ctoConstr :: NAssoc -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NAssoc
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NAssoc
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NAssoc -> c NAssoc
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NAssoc -> c NAssoc
$cp1Data :: Typeable NAssoc
Data, Int -> NAssoc -> String -> String
[NAssoc] -> String -> String
NAssoc -> String
(Int -> NAssoc -> String -> String)
-> (NAssoc -> String)
-> ([NAssoc] -> String -> String)
-> Show NAssoc
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [NAssoc] -> String -> String
$cshowList :: [NAssoc] -> String -> String
show :: NAssoc -> String
$cshow :: NAssoc -> String
showsPrec :: Int -> NAssoc -> String -> String
$cshowsPrec :: Int -> NAssoc -> String -> String
Show, NAssoc -> ()
(NAssoc -> ()) -> NFData NAssoc
forall a. (a -> ()) -> NFData a
rnf :: NAssoc -> ()
$crnf :: NAssoc -> ()
NFData)
data NOperatorDef
= NUnaryDef Text NUnaryOp
| NBinaryDef Text NBinaryOp NAssoc
| NSpecialDef Text NSpecialOp NAssoc
deriving (NOperatorDef -> NOperatorDef -> Bool
(NOperatorDef -> NOperatorDef -> Bool)
-> (NOperatorDef -> NOperatorDef -> Bool) -> Eq NOperatorDef
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NOperatorDef -> NOperatorDef -> Bool
$c/= :: NOperatorDef -> NOperatorDef -> Bool
== :: NOperatorDef -> NOperatorDef -> Bool
$c== :: NOperatorDef -> NOperatorDef -> Bool
Eq, Eq NOperatorDef
Eq NOperatorDef =>
(NOperatorDef -> NOperatorDef -> Ordering)
-> (NOperatorDef -> NOperatorDef -> Bool)
-> (NOperatorDef -> NOperatorDef -> Bool)
-> (NOperatorDef -> NOperatorDef -> Bool)
-> (NOperatorDef -> NOperatorDef -> Bool)
-> (NOperatorDef -> NOperatorDef -> NOperatorDef)
-> (NOperatorDef -> NOperatorDef -> NOperatorDef)
-> Ord NOperatorDef
NOperatorDef -> NOperatorDef -> Bool
NOperatorDef -> NOperatorDef -> Ordering
NOperatorDef -> NOperatorDef -> NOperatorDef
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: NOperatorDef -> NOperatorDef -> NOperatorDef
$cmin :: NOperatorDef -> NOperatorDef -> NOperatorDef
max :: NOperatorDef -> NOperatorDef -> NOperatorDef
$cmax :: NOperatorDef -> NOperatorDef -> NOperatorDef
>= :: NOperatorDef -> NOperatorDef -> Bool
$c>= :: NOperatorDef -> NOperatorDef -> Bool
> :: NOperatorDef -> NOperatorDef -> Bool
$c> :: NOperatorDef -> NOperatorDef -> Bool
<= :: NOperatorDef -> NOperatorDef -> Bool
$c<= :: NOperatorDef -> NOperatorDef -> Bool
< :: NOperatorDef -> NOperatorDef -> Bool
$c< :: NOperatorDef -> NOperatorDef -> Bool
compare :: NOperatorDef -> NOperatorDef -> Ordering
$ccompare :: NOperatorDef -> NOperatorDef -> Ordering
$cp1Ord :: Eq NOperatorDef
Ord, (forall x. NOperatorDef -> Rep NOperatorDef x)
-> (forall x. Rep NOperatorDef x -> NOperatorDef)
-> Generic NOperatorDef
forall x. Rep NOperatorDef x -> NOperatorDef
forall x. NOperatorDef -> Rep NOperatorDef x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep NOperatorDef x -> NOperatorDef
$cfrom :: forall x. NOperatorDef -> Rep NOperatorDef x
Generic, Typeable, Typeable NOperatorDef
DataType
Constr
Typeable NOperatorDef =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NOperatorDef -> c NOperatorDef)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NOperatorDef)
-> (NOperatorDef -> Constr)
-> (NOperatorDef -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c NOperatorDef))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c NOperatorDef))
-> ((forall b. Data b => b -> b) -> NOperatorDef -> NOperatorDef)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> NOperatorDef -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> NOperatorDef -> r)
-> (forall u. (forall d. Data d => d -> u) -> NOperatorDef -> [u])
-> (forall u.
Int -> (forall d. Data d => d -> u) -> NOperatorDef -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> NOperatorDef -> m NOperatorDef)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NOperatorDef -> m NOperatorDef)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NOperatorDef -> m NOperatorDef)
-> Data NOperatorDef
NOperatorDef -> DataType
NOperatorDef -> Constr
(forall b. Data b => b -> b) -> NOperatorDef -> NOperatorDef
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NOperatorDef -> c NOperatorDef
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NOperatorDef
forall a.
Typeable a =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> NOperatorDef -> u
forall u. (forall d. Data d => d -> u) -> NOperatorDef -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> NOperatorDef -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> NOperatorDef -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> NOperatorDef -> m NOperatorDef
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NOperatorDef -> m NOperatorDef
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NOperatorDef
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NOperatorDef -> c NOperatorDef
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c NOperatorDef)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c NOperatorDef)
$cNSpecialDef :: Constr
$cNBinaryDef :: Constr
$cNUnaryDef :: Constr
$tNOperatorDef :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> NOperatorDef -> m NOperatorDef
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NOperatorDef -> m NOperatorDef
gmapMp :: (forall d. Data d => d -> m d) -> NOperatorDef -> m NOperatorDef
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> NOperatorDef -> m NOperatorDef
gmapM :: (forall d. Data d => d -> m d) -> NOperatorDef -> m NOperatorDef
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> NOperatorDef -> m NOperatorDef
gmapQi :: Int -> (forall d. Data d => d -> u) -> NOperatorDef -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> NOperatorDef -> u
gmapQ :: (forall d. Data d => d -> u) -> NOperatorDef -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> NOperatorDef -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> NOperatorDef -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> NOperatorDef -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> NOperatorDef -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> NOperatorDef -> r
gmapT :: (forall b. Data b => b -> b) -> NOperatorDef -> NOperatorDef
$cgmapT :: (forall b. Data b => b -> b) -> NOperatorDef -> NOperatorDef
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c NOperatorDef)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c NOperatorDef)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c NOperatorDef)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c NOperatorDef)
dataTypeOf :: NOperatorDef -> DataType
$cdataTypeOf :: NOperatorDef -> DataType
toConstr :: NOperatorDef -> Constr
$ctoConstr :: NOperatorDef -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NOperatorDef
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c NOperatorDef
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NOperatorDef -> c NOperatorDef
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> NOperatorDef -> c NOperatorDef
$cp1Data :: Typeable NOperatorDef
Data, Int -> NOperatorDef -> String -> String
[NOperatorDef] -> String -> String
NOperatorDef -> String
(Int -> NOperatorDef -> String -> String)
-> (NOperatorDef -> String)
-> ([NOperatorDef] -> String -> String)
-> Show NOperatorDef
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [NOperatorDef] -> String -> String
$cshowList :: [NOperatorDef] -> String -> String
show :: NOperatorDef -> String
$cshow :: NOperatorDef -> String
showsPrec :: Int -> NOperatorDef -> String -> String
$cshowsPrec :: Int -> NOperatorDef -> String -> String
Show, NOperatorDef -> ()
(NOperatorDef -> ()) -> NFData NOperatorDef
forall a. (a -> ()) -> NFData a
rnf :: NOperatorDef -> ()
$crnf :: NOperatorDef -> ()
NFData)
annotateLocation :: Parser a -> Parser (Ann SrcSpan a)
annotateLocation :: Parser a -> Parser (Ann SrcSpan a)
annotateLocation p :: Parser a
p = do
SourcePos
begin <- ParsecT Void Text Identity SourcePos
forall e s (m :: * -> *). MonadParsec e s m => m SourcePos
getSourcePos
a
res <- Parser a
p
SourcePos
end <- ParsecT Void Text Identity SourcePos
forall e s (m :: * -> *). MonadParsec e s m => m SourcePos
getSourcePos
Ann SrcSpan a -> Parser (Ann SrcSpan a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Ann SrcSpan a -> Parser (Ann SrcSpan a))
-> Ann SrcSpan a -> Parser (Ann SrcSpan a)
forall a b. (a -> b) -> a -> b
$ SrcSpan -> a -> Ann SrcSpan a
forall ann a. ann -> a -> Ann ann a
Ann (SourcePos -> SourcePos -> SrcSpan
SrcSpan SourcePos
begin SourcePos
end) a
res
annotateLocation1 :: Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1 :: Parser (NExprF NExprLoc) -> Parser NExprLoc
annotateLocation1 = (Ann SrcSpan (NExprF NExprLoc) -> NExprLoc)
-> ParsecT Void Text Identity (Ann SrcSpan (NExprF NExprLoc))
-> Parser NExprLoc
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Ann SrcSpan (NExprF NExprLoc) -> NExprLoc
forall ann (f :: * -> *).
Ann ann (f (Fix (AnnF ann f))) -> Fix (AnnF ann f)
annToAnnF (ParsecT Void Text Identity (Ann SrcSpan (NExprF NExprLoc))
-> Parser NExprLoc)
-> (Parser (NExprF NExprLoc)
-> ParsecT Void Text Identity (Ann SrcSpan (NExprF NExprLoc)))
-> Parser (NExprF NExprLoc)
-> Parser NExprLoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser (NExprF NExprLoc)
-> ParsecT Void Text Identity (Ann SrcSpan (NExprF NExprLoc))
forall a. Parser a -> Parser (Ann SrcSpan a)
annotateLocation
manyUnaryOp :: f (a -> a) -> f (a -> a)
manyUnaryOp f :: f (a -> a)
f = ((a -> a) -> (a -> a) -> a -> a) -> [a -> a] -> a -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) ([a -> a] -> a -> a) -> f [a -> a] -> f (a -> a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f (a -> a) -> f [a -> a]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
some f (a -> a)
f
operator :: Text -> Parser Text
operator "-" = Parser Text -> Parser Text
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
lexeme (Parser Text -> Parser Text)
-> (Parser Text -> Parser Text) -> Parser Text -> Parser Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser Text -> Parser Text
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Parser Text -> Parser Text) -> Parser Text -> Parser Text
forall a b. (a -> b) -> a -> b
$ Tokens Text -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string "-" Parser Text -> Parser () -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Void Text Identity Char -> Parser ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m ()
notFollowedBy (Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'>')
operator "/" = Parser Text -> Parser Text
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
lexeme (Parser Text -> Parser Text)
-> (Parser Text -> Parser Text) -> Parser Text -> Parser Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser Text -> Parser Text
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Parser Text -> Parser Text) -> Parser Text -> Parser Text
forall a b. (a -> b) -> a -> b
$ Tokens Text -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string "/" Parser Text -> Parser () -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Void Text Identity Char -> Parser ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m ()
notFollowedBy (Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'/')
operator "<" = Parser Text -> Parser Text
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
lexeme (Parser Text -> Parser Text)
-> (Parser Text -> Parser Text) -> Parser Text -> Parser Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser Text -> Parser Text
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Parser Text -> Parser Text) -> Parser Text -> Parser Text
forall a b. (a -> b) -> a -> b
$ Tokens Text -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string "<" Parser Text -> Parser () -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Void Text Identity Char -> Parser ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m ()
notFollowedBy (Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'=')
operator ">" = Parser Text -> Parser Text
forall a.
ParsecT Void Text Identity a -> ParsecT Void Text Identity a
lexeme (Parser Text -> Parser Text)
-> (Parser Text -> Parser Text) -> Parser Text -> Parser Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser Text -> Parser Text
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try (Parser Text -> Parser Text) -> Parser Text -> Parser Text
forall a b. (a -> b) -> a -> b
$ Tokens Text -> ParsecT Void Text Identity (Tokens Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
Tokens s -> m (Tokens s)
string ">" Parser Text -> Parser () -> Parser Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT Void Text Identity Char -> Parser ()
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m ()
notFollowedBy (Token Text -> ParsecT Void Text Identity (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Token Text
'=')
operator n :: Text
n = Text -> Parser Text
symbol Text
n
opWithLoc :: Text -> o -> (Ann SrcSpan o -> a) -> Parser a
opWithLoc :: Text -> o -> (Ann SrcSpan o -> a) -> Parser a
opWithLoc name :: Text
name op :: o
op f :: Ann SrcSpan o -> a
f = do
Ann ann :: SrcSpan
ann _ <- Parser Text -> Parser (Ann SrcSpan Text)
forall a. Parser a -> Parser (Ann SrcSpan a)
annotateLocation (Parser Text -> Parser (Ann SrcSpan Text))
-> Parser Text -> Parser (Ann SrcSpan Text)
forall a b. (a -> b) -> a -> b
$
Text -> Parser Text
operator Text
name
a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> Parser a) -> a -> Parser a
forall a b. (a -> b) -> a -> b
$ Ann SrcSpan o -> a
f (SrcSpan -> o -> Ann SrcSpan o
forall ann a. ann -> a -> Ann ann a
Ann SrcSpan
ann o
op)
binaryN :: Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryN name :: Text
name op :: NBinaryOp
op =
(Text -> NBinaryOp -> NAssoc -> NOperatorDef
NBinaryDef Text
name NBinaryOp
op NAssoc
NAssocNone, ParsecT Void Text Identity (NExprLoc -> NExprLoc -> NExprLoc)
-> Operator (ParsecT Void Text Identity) NExprLoc
forall (m :: * -> *) a. m (a -> a -> a) -> Operator m a
InfixN (Text
-> NBinaryOp
-> (Ann SrcSpan NBinaryOp -> NExprLoc -> NExprLoc -> NExprLoc)
-> ParsecT Void Text Identity (NExprLoc -> NExprLoc -> NExprLoc)
forall o a. Text -> o -> (Ann SrcSpan o -> a) -> Parser a
opWithLoc Text
name NBinaryOp
op Ann SrcSpan NBinaryOp -> NExprLoc -> NExprLoc -> NExprLoc
nBinary))
binaryL :: Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryL name :: Text
name op :: NBinaryOp
op =
(Text -> NBinaryOp -> NAssoc -> NOperatorDef
NBinaryDef Text
name NBinaryOp
op NAssoc
NAssocLeft, ParsecT Void Text Identity (NExprLoc -> NExprLoc -> NExprLoc)
-> Operator (ParsecT Void Text Identity) NExprLoc
forall (m :: * -> *) a. m (a -> a -> a) -> Operator m a
InfixL (Text
-> NBinaryOp
-> (Ann SrcSpan NBinaryOp -> NExprLoc -> NExprLoc -> NExprLoc)
-> ParsecT Void Text Identity (NExprLoc -> NExprLoc -> NExprLoc)
forall o a. Text -> o -> (Ann SrcSpan o -> a) -> Parser a
opWithLoc Text
name NBinaryOp
op Ann SrcSpan NBinaryOp -> NExprLoc -> NExprLoc -> NExprLoc
nBinary))
binaryR :: Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryR name :: Text
name op :: NBinaryOp
op =
(Text -> NBinaryOp -> NAssoc -> NOperatorDef
NBinaryDef Text
name NBinaryOp
op NAssoc
NAssocRight, ParsecT Void Text Identity (NExprLoc -> NExprLoc -> NExprLoc)
-> Operator (ParsecT Void Text Identity) NExprLoc
forall (m :: * -> *) a. m (a -> a -> a) -> Operator m a
InfixR (Text
-> NBinaryOp
-> (Ann SrcSpan NBinaryOp -> NExprLoc -> NExprLoc -> NExprLoc)
-> ParsecT Void Text Identity (NExprLoc -> NExprLoc -> NExprLoc)
forall o a. Text -> o -> (Ann SrcSpan o -> a) -> Parser a
opWithLoc Text
name NBinaryOp
op Ann SrcSpan NBinaryOp -> NExprLoc -> NExprLoc -> NExprLoc
nBinary))
prefix :: Text
-> NUnaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
prefix name :: Text
name op :: NUnaryOp
op =
(Text -> NUnaryOp -> NOperatorDef
NUnaryDef Text
name NUnaryOp
op, ParsecT Void Text Identity (NExprLoc -> NExprLoc)
-> Operator (ParsecT Void Text Identity) NExprLoc
forall (m :: * -> *) a. m (a -> a) -> Operator m a
Prefix (ParsecT Void Text Identity (NExprLoc -> NExprLoc)
-> ParsecT Void Text Identity (NExprLoc -> NExprLoc)
forall (f :: * -> *) a. MonadPlus f => f (a -> a) -> f (a -> a)
manyUnaryOp (Text
-> NUnaryOp
-> (Ann SrcSpan NUnaryOp -> NExprLoc -> NExprLoc)
-> ParsecT Void Text Identity (NExprLoc -> NExprLoc)
forall o a. Text -> o -> (Ann SrcSpan o -> a) -> Parser a
opWithLoc Text
name NUnaryOp
op Ann SrcSpan NUnaryOp -> NExprLoc -> NExprLoc
nUnary)))
nixOperators
:: Parser (Ann SrcSpan (NAttrPath NExprLoc))
-> [[(NOperatorDef, Operator Parser NExprLoc)]]
nixOperators :: Parser (Ann SrcSpan (NAttrPath NExprLoc))
-> [[(NOperatorDef,
Operator (ParsecT Void Text Identity) NExprLoc)]]
nixOperators selector :: Parser (Ann SrcSpan (NAttrPath NExprLoc))
selector =
[
[ ( Text -> NBinaryOp -> NAssoc -> NOperatorDef
NBinaryDef " " NBinaryOp
NApp NAssoc
NAssocLeft
,
ParsecT Void Text Identity (NExprLoc -> NExprLoc -> NExprLoc)
-> Operator (ParsecT Void Text Identity) NExprLoc
forall (m :: * -> *) a. m (a -> a -> a) -> Operator m a
InfixL (ParsecT Void Text Identity (NExprLoc -> NExprLoc -> NExprLoc)
-> Operator (ParsecT Void Text Identity) NExprLoc)
-> ParsecT Void Text Identity (NExprLoc -> NExprLoc -> NExprLoc)
-> Operator (ParsecT Void Text Identity) NExprLoc
forall a b. (a -> b) -> a -> b
$ NExprLoc -> NExprLoc -> NExprLoc
nApp (NExprLoc -> NExprLoc -> NExprLoc)
-> Parser Text
-> ParsecT Void Text Identity (NExprLoc -> NExprLoc -> NExprLoc)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Text -> Parser Text
symbol ""
)
]
,
[Text
-> NUnaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
prefix "-" NUnaryOp
NNeg]
,
[ ( Text -> NSpecialOp -> NAssoc -> NOperatorDef
NSpecialDef "?" NSpecialOp
NHasAttrOp NAssoc
NAssocLeft
, ParsecT Void Text Identity (NExprLoc -> NExprLoc)
-> Operator (ParsecT Void Text Identity) NExprLoc
forall (m :: * -> *) a. m (a -> a) -> Operator m a
Postfix (ParsecT Void Text Identity (NExprLoc -> NExprLoc)
-> Operator (ParsecT Void Text Identity) NExprLoc)
-> ParsecT Void Text Identity (NExprLoc -> NExprLoc)
-> Operator (ParsecT Void Text Identity) NExprLoc
forall a b. (a -> b) -> a -> b
$ Text -> Parser Text
symbol "?" Parser Text
-> ParsecT Void Text Identity (NExprLoc -> NExprLoc)
-> ParsecT Void Text Identity (NExprLoc -> NExprLoc)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ((NExprLoc -> Ann SrcSpan (NAttrPath NExprLoc) -> NExprLoc)
-> Ann SrcSpan (NAttrPath NExprLoc) -> NExprLoc -> NExprLoc
forall a b c. (a -> b -> c) -> b -> a -> c
flip NExprLoc -> Ann SrcSpan (NAttrPath NExprLoc) -> NExprLoc
nHasAttr (Ann SrcSpan (NAttrPath NExprLoc) -> NExprLoc -> NExprLoc)
-> Parser (Ann SrcSpan (NAttrPath NExprLoc))
-> ParsecT Void Text Identity (NExprLoc -> NExprLoc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser (Ann SrcSpan (NAttrPath NExprLoc))
selector)
)
]
,
[Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryR "++" NBinaryOp
NConcat]
,
[Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryL "*" NBinaryOp
NMult, Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryL "/" NBinaryOp
NDiv]
,
[Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryL "+" NBinaryOp
NPlus, Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryL "-" NBinaryOp
NMinus]
,
[Text
-> NUnaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
prefix "!" NUnaryOp
NNot]
,
[Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryR "//" NBinaryOp
NUpdate]
,
[Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryL "<" NBinaryOp
NLt, Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryL ">" NBinaryOp
NGt, Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryL "<=" NBinaryOp
NLte, Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryL ">=" NBinaryOp
NGte]
,
[Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryN "==" NBinaryOp
NEq, Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryN "!=" NBinaryOp
NNEq]
,
[Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryL "&&" NBinaryOp
NAnd]
,
[Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryL "||" NBinaryOp
NOr]
,
[Text
-> NBinaryOp
-> (NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)
binaryN "->" NBinaryOp
NImpl]
]
data OperatorInfo = OperatorInfo
{ OperatorInfo -> Int
precedence :: Int
, OperatorInfo -> NAssoc
associativity :: NAssoc
, OperatorInfo -> Text
operatorName :: Text
} deriving (OperatorInfo -> OperatorInfo -> Bool
(OperatorInfo -> OperatorInfo -> Bool)
-> (OperatorInfo -> OperatorInfo -> Bool) -> Eq OperatorInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: OperatorInfo -> OperatorInfo -> Bool
$c/= :: OperatorInfo -> OperatorInfo -> Bool
== :: OperatorInfo -> OperatorInfo -> Bool
$c== :: OperatorInfo -> OperatorInfo -> Bool
Eq, Eq OperatorInfo
Eq OperatorInfo =>
(OperatorInfo -> OperatorInfo -> Ordering)
-> (OperatorInfo -> OperatorInfo -> Bool)
-> (OperatorInfo -> OperatorInfo -> Bool)
-> (OperatorInfo -> OperatorInfo -> Bool)
-> (OperatorInfo -> OperatorInfo -> Bool)
-> (OperatorInfo -> OperatorInfo -> OperatorInfo)
-> (OperatorInfo -> OperatorInfo -> OperatorInfo)
-> Ord OperatorInfo
OperatorInfo -> OperatorInfo -> Bool
OperatorInfo -> OperatorInfo -> Ordering
OperatorInfo -> OperatorInfo -> OperatorInfo
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: OperatorInfo -> OperatorInfo -> OperatorInfo
$cmin :: OperatorInfo -> OperatorInfo -> OperatorInfo
max :: OperatorInfo -> OperatorInfo -> OperatorInfo
$cmax :: OperatorInfo -> OperatorInfo -> OperatorInfo
>= :: OperatorInfo -> OperatorInfo -> Bool
$c>= :: OperatorInfo -> OperatorInfo -> Bool
> :: OperatorInfo -> OperatorInfo -> Bool
$c> :: OperatorInfo -> OperatorInfo -> Bool
<= :: OperatorInfo -> OperatorInfo -> Bool
$c<= :: OperatorInfo -> OperatorInfo -> Bool
< :: OperatorInfo -> OperatorInfo -> Bool
$c< :: OperatorInfo -> OperatorInfo -> Bool
compare :: OperatorInfo -> OperatorInfo -> Ordering
$ccompare :: OperatorInfo -> OperatorInfo -> Ordering
$cp1Ord :: Eq OperatorInfo
Ord, (forall x. OperatorInfo -> Rep OperatorInfo x)
-> (forall x. Rep OperatorInfo x -> OperatorInfo)
-> Generic OperatorInfo
forall x. Rep OperatorInfo x -> OperatorInfo
forall x. OperatorInfo -> Rep OperatorInfo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep OperatorInfo x -> OperatorInfo
$cfrom :: forall x. OperatorInfo -> Rep OperatorInfo x
Generic, Typeable, Typeable OperatorInfo
DataType
Constr
Typeable OperatorInfo =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> OperatorInfo -> c OperatorInfo)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c OperatorInfo)
-> (OperatorInfo -> Constr)
-> (OperatorInfo -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c OperatorInfo))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c OperatorInfo))
-> ((forall b. Data b => b -> b) -> OperatorInfo -> OperatorInfo)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> OperatorInfo -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> OperatorInfo -> r)
-> (forall u. (forall d. Data d => d -> u) -> OperatorInfo -> [u])
-> (forall u.
Int -> (forall d. Data d => d -> u) -> OperatorInfo -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> OperatorInfo -> m OperatorInfo)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> OperatorInfo -> m OperatorInfo)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> OperatorInfo -> m OperatorInfo)
-> Data OperatorInfo
OperatorInfo -> DataType
OperatorInfo -> Constr
(forall b. Data b => b -> b) -> OperatorInfo -> OperatorInfo
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> OperatorInfo -> c OperatorInfo
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c OperatorInfo
forall a.
Typeable a =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> OperatorInfo -> u
forall u. (forall d. Data d => d -> u) -> OperatorInfo -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> OperatorInfo -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> OperatorInfo -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> OperatorInfo -> m OperatorInfo
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> OperatorInfo -> m OperatorInfo
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c OperatorInfo
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> OperatorInfo -> c OperatorInfo
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c OperatorInfo)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c OperatorInfo)
$cOperatorInfo :: Constr
$tOperatorInfo :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> OperatorInfo -> m OperatorInfo
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> OperatorInfo -> m OperatorInfo
gmapMp :: (forall d. Data d => d -> m d) -> OperatorInfo -> m OperatorInfo
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> OperatorInfo -> m OperatorInfo
gmapM :: (forall d. Data d => d -> m d) -> OperatorInfo -> m OperatorInfo
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> OperatorInfo -> m OperatorInfo
gmapQi :: Int -> (forall d. Data d => d -> u) -> OperatorInfo -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> OperatorInfo -> u
gmapQ :: (forall d. Data d => d -> u) -> OperatorInfo -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> OperatorInfo -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> OperatorInfo -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> OperatorInfo -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> OperatorInfo -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> OperatorInfo -> r
gmapT :: (forall b. Data b => b -> b) -> OperatorInfo -> OperatorInfo
$cgmapT :: (forall b. Data b => b -> b) -> OperatorInfo -> OperatorInfo
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c OperatorInfo)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c OperatorInfo)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c OperatorInfo)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c OperatorInfo)
dataTypeOf :: OperatorInfo -> DataType
$cdataTypeOf :: OperatorInfo -> DataType
toConstr :: OperatorInfo -> Constr
$ctoConstr :: OperatorInfo -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c OperatorInfo
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c OperatorInfo
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> OperatorInfo -> c OperatorInfo
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> OperatorInfo -> c OperatorInfo
$cp1Data :: Typeable OperatorInfo
Data, Int -> OperatorInfo -> String -> String
[OperatorInfo] -> String -> String
OperatorInfo -> String
(Int -> OperatorInfo -> String -> String)
-> (OperatorInfo -> String)
-> ([OperatorInfo] -> String -> String)
-> Show OperatorInfo
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
showList :: [OperatorInfo] -> String -> String
$cshowList :: [OperatorInfo] -> String -> String
show :: OperatorInfo -> String
$cshow :: OperatorInfo -> String
showsPrec :: Int -> OperatorInfo -> String -> String
$cshowsPrec :: Int -> OperatorInfo -> String -> String
Show)
getUnaryOperator :: NUnaryOp -> OperatorInfo
getUnaryOperator :: NUnaryOp -> OperatorInfo
getUnaryOperator = (Map NUnaryOp OperatorInfo
m Map NUnaryOp OperatorInfo -> NUnaryOp -> OperatorInfo
forall k a. Ord k => Map k a -> k -> a
Map.!) where
m :: Map NUnaryOp OperatorInfo
m = [(NUnaryOp, OperatorInfo)] -> Map NUnaryOp OperatorInfo
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(NUnaryOp, OperatorInfo)] -> Map NUnaryOp OperatorInfo)
-> [(NUnaryOp, OperatorInfo)] -> Map NUnaryOp OperatorInfo
forall a b. (a -> b) -> a -> b
$ [[(NUnaryOp, OperatorInfo)]] -> [(NUnaryOp, OperatorInfo)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[(NUnaryOp, OperatorInfo)]] -> [(NUnaryOp, OperatorInfo)])
-> [[(NUnaryOp, OperatorInfo)]] -> [(NUnaryOp, OperatorInfo)]
forall a b. (a -> b) -> a -> b
$ (Int
-> [(NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)]
-> [(NUnaryOp, OperatorInfo)])
-> [Int]
-> [[(NOperatorDef,
Operator (ParsecT Void Text Identity) NExprLoc)]]
-> [[(NUnaryOp, OperatorInfo)]]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Int
-> [(NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)]
-> [(NUnaryOp, OperatorInfo)]
forall (t :: * -> *) b.
Foldable t =>
Int -> t (NOperatorDef, b) -> [(NUnaryOp, OperatorInfo)]
buildEntry
[1 ..]
(Parser (Ann SrcSpan (NAttrPath NExprLoc))
-> [[(NOperatorDef,
Operator (ParsecT Void Text Identity) NExprLoc)]]
nixOperators (String -> Parser (Ann SrcSpan (NAttrPath NExprLoc))
forall a. HasCallStack => String -> a
error "unused"))
buildEntry :: Int -> t (NOperatorDef, b) -> [(NUnaryOp, OperatorInfo)]
buildEntry i :: Int
i = ((NOperatorDef, b) -> [(NUnaryOp, OperatorInfo)])
-> t (NOperatorDef, b) -> [(NUnaryOp, OperatorInfo)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (((NOperatorDef, b) -> [(NUnaryOp, OperatorInfo)])
-> t (NOperatorDef, b) -> [(NUnaryOp, OperatorInfo)])
-> ((NOperatorDef, b) -> [(NUnaryOp, OperatorInfo)])
-> t (NOperatorDef, b)
-> [(NUnaryOp, OperatorInfo)]
forall a b. (a -> b) -> a -> b
$ \case
(NUnaryDef name :: Text
name op :: NUnaryOp
op, _) -> [(NUnaryOp
op, Int -> NAssoc -> Text -> OperatorInfo
OperatorInfo Int
i NAssoc
NAssocNone Text
name)]
_ -> []
getBinaryOperator :: NBinaryOp -> OperatorInfo
getBinaryOperator :: NBinaryOp -> OperatorInfo
getBinaryOperator = (Map NBinaryOp OperatorInfo
m Map NBinaryOp OperatorInfo -> NBinaryOp -> OperatorInfo
forall k a. Ord k => Map k a -> k -> a
Map.!) where
m :: Map NBinaryOp OperatorInfo
m = [(NBinaryOp, OperatorInfo)] -> Map NBinaryOp OperatorInfo
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(NBinaryOp, OperatorInfo)] -> Map NBinaryOp OperatorInfo)
-> [(NBinaryOp, OperatorInfo)] -> Map NBinaryOp OperatorInfo
forall a b. (a -> b) -> a -> b
$ [[(NBinaryOp, OperatorInfo)]] -> [(NBinaryOp, OperatorInfo)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[(NBinaryOp, OperatorInfo)]] -> [(NBinaryOp, OperatorInfo)])
-> [[(NBinaryOp, OperatorInfo)]] -> [(NBinaryOp, OperatorInfo)]
forall a b. (a -> b) -> a -> b
$ (Int
-> [(NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)]
-> [(NBinaryOp, OperatorInfo)])
-> [Int]
-> [[(NOperatorDef,
Operator (ParsecT Void Text Identity) NExprLoc)]]
-> [[(NBinaryOp, OperatorInfo)]]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Int
-> [(NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)]
-> [(NBinaryOp, OperatorInfo)]
forall (t :: * -> *) b.
Foldable t =>
Int -> t (NOperatorDef, b) -> [(NBinaryOp, OperatorInfo)]
buildEntry
[1 ..]
(Parser (Ann SrcSpan (NAttrPath NExprLoc))
-> [[(NOperatorDef,
Operator (ParsecT Void Text Identity) NExprLoc)]]
nixOperators (String -> Parser (Ann SrcSpan (NAttrPath NExprLoc))
forall a. HasCallStack => String -> a
error "unused"))
buildEntry :: Int -> t (NOperatorDef, b) -> [(NBinaryOp, OperatorInfo)]
buildEntry i :: Int
i = ((NOperatorDef, b) -> [(NBinaryOp, OperatorInfo)])
-> t (NOperatorDef, b) -> [(NBinaryOp, OperatorInfo)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (((NOperatorDef, b) -> [(NBinaryOp, OperatorInfo)])
-> t (NOperatorDef, b) -> [(NBinaryOp, OperatorInfo)])
-> ((NOperatorDef, b) -> [(NBinaryOp, OperatorInfo)])
-> t (NOperatorDef, b)
-> [(NBinaryOp, OperatorInfo)]
forall a b. (a -> b) -> a -> b
$ \case
(NBinaryDef name :: Text
name op :: NBinaryOp
op assoc :: NAssoc
assoc, _) -> [(NBinaryOp
op, Int -> NAssoc -> Text -> OperatorInfo
OperatorInfo Int
i NAssoc
assoc Text
name)]
_ -> []
getSpecialOperator :: NSpecialOp -> OperatorInfo
getSpecialOperator :: NSpecialOp -> OperatorInfo
getSpecialOperator NSelectOp = Int -> NAssoc -> Text -> OperatorInfo
OperatorInfo 1 NAssoc
NAssocLeft "."
getSpecialOperator o :: NSpecialOp
o = Map NSpecialOp OperatorInfo
m Map NSpecialOp OperatorInfo -> NSpecialOp -> OperatorInfo
forall k a. Ord k => Map k a -> k -> a
Map.! NSpecialOp
o where
m :: Map NSpecialOp OperatorInfo
m = [(NSpecialOp, OperatorInfo)] -> Map NSpecialOp OperatorInfo
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(NSpecialOp, OperatorInfo)] -> Map NSpecialOp OperatorInfo)
-> [(NSpecialOp, OperatorInfo)] -> Map NSpecialOp OperatorInfo
forall a b. (a -> b) -> a -> b
$ [[(NSpecialOp, OperatorInfo)]] -> [(NSpecialOp, OperatorInfo)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[(NSpecialOp, OperatorInfo)]] -> [(NSpecialOp, OperatorInfo)])
-> [[(NSpecialOp, OperatorInfo)]] -> [(NSpecialOp, OperatorInfo)]
forall a b. (a -> b) -> a -> b
$ (Int
-> [(NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)]
-> [(NSpecialOp, OperatorInfo)])
-> [Int]
-> [[(NOperatorDef,
Operator (ParsecT Void Text Identity) NExprLoc)]]
-> [[(NSpecialOp, OperatorInfo)]]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Int
-> [(NOperatorDef, Operator (ParsecT Void Text Identity) NExprLoc)]
-> [(NSpecialOp, OperatorInfo)]
forall (t :: * -> *) b.
Foldable t =>
Int -> t (NOperatorDef, b) -> [(NSpecialOp, OperatorInfo)]
buildEntry
[1 ..]
(Parser (Ann SrcSpan (NAttrPath NExprLoc))
-> [[(NOperatorDef,
Operator (ParsecT Void Text Identity) NExprLoc)]]
nixOperators (String -> Parser (Ann SrcSpan (NAttrPath NExprLoc))
forall a. HasCallStack => String -> a
error "unused"))
buildEntry :: Int -> t (NOperatorDef, b) -> [(NSpecialOp, OperatorInfo)]
buildEntry i :: Int
i = ((NOperatorDef, b) -> [(NSpecialOp, OperatorInfo)])
-> t (NOperatorDef, b) -> [(NSpecialOp, OperatorInfo)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (((NOperatorDef, b) -> [(NSpecialOp, OperatorInfo)])
-> t (NOperatorDef, b) -> [(NSpecialOp, OperatorInfo)])
-> ((NOperatorDef, b) -> [(NSpecialOp, OperatorInfo)])
-> t (NOperatorDef, b)
-> [(NSpecialOp, OperatorInfo)]
forall a b. (a -> b) -> a -> b
$ \case
(NSpecialDef name :: Text
name op :: NSpecialOp
op assoc :: NAssoc
assoc, _) -> [(NSpecialOp
op, Int -> NAssoc -> Text -> OperatorInfo
OperatorInfo Int
i NAssoc
assoc Text
name)]
_ -> []