{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TemplateHaskell #-}

module Text.Heterocephalus.Parse.Control where

#if MIN_VERSION_base(4,9,0)
#else
import Control.Applicative ((<$>), (*>), (<*), pure)
#endif
import Control.Monad (guard, void)
import Control.Monad.Reader (Reader, runReaderT)
import Data.Char (isUpper)
import Data.Data (Data)
import Data.Functor (($>))
import Data.Functor.Identity (runIdentity)
import Data.Typeable (Typeable)
import Text.Parsec
       (Parsec, ParsecT, (<?>), (<|>), alphaNum, between, char, choice,
        eof, many, many1, manyTill, mkPT, noneOf, oneOf, option, optional,
        runParsecT, runParserT, sepBy, skipMany, spaces, string,
        try)
import Text.Shakespeare.Base
       (Ident(Ident), Deref, parseDeref, parseVar)

import Text.Hamlet.Parse
import Text.Heterocephalus.Parse.Option
       (ParseOptions, getControlPrefix, getVariablePrefix)

data Control
  = ControlForall Deref Binding
  | ControlEndForall
  | ControlIf Deref
  | ControlElse
  | ControlElseIf Deref
  | ControlEndIf
  | ControlCase Deref
  | ControlCaseOf Binding
  | ControlEndCase
  | NoControl Content
  deriving (Typeable Control
Constr
DataType
Typeable Control =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> Control -> c Control)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c Control)
-> (Control -> Constr)
-> (Control -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c Control))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Control))
-> ((forall b. Data b => b -> b) -> Control -> Control)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> Control -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> Control -> r)
-> (forall u. (forall d. Data d => d -> u) -> Control -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Control -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Control -> m Control)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Control -> m Control)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Control -> m Control)
-> Data Control
Control -> Constr
Control -> DataType
(forall b. Data b => b -> b) -> Control -> Control
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Control -> c Control
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Control
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) -> Control -> u
forall u. (forall d. Data d => d -> u) -> Control -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Control -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Control -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Control -> m Control
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Control -> m Control
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Control
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Control -> c Control
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Control)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Control)
$cNoControl :: Constr
$cControlEndCase :: Constr
$cControlCaseOf :: Constr
$cControlCase :: Constr
$cControlEndIf :: Constr
$cControlElseIf :: Constr
$cControlElse :: Constr
$cControlIf :: Constr
$cControlEndForall :: Constr
$cControlForall :: Constr
$tControl :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Control -> m Control
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Control -> m Control
gmapMp :: (forall d. Data d => d -> m d) -> Control -> m Control
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Control -> m Control
gmapM :: (forall d. Data d => d -> m d) -> Control -> m Control
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Control -> m Control
gmapQi :: Int -> (forall d. Data d => d -> u) -> Control -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Control -> u
gmapQ :: (forall d. Data d => d -> u) -> Control -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Control -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Control -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Control -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Control -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Control -> r
gmapT :: (forall b. Data b => b -> b) -> Control -> Control
$cgmapT :: (forall b. Data b => b -> b) -> Control -> Control
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Control)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Control)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Control)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Control)
dataTypeOf :: Control -> DataType
$cdataTypeOf :: Control -> DataType
toConstr :: Control -> Constr
$ctoConstr :: Control -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Control
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Control
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Control -> c Control
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Control -> c Control
$cp1Data :: Typeable Control
Data, Control -> Control -> Bool
(Control -> Control -> Bool)
-> (Control -> Control -> Bool) -> Eq Control
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Control -> Control -> Bool
$c/= :: Control -> Control -> Bool
== :: Control -> Control -> Bool
$c== :: Control -> Control -> Bool
Eq, ReadPrec [Control]
ReadPrec Control
Int -> ReadS Control
ReadS [Control]
(Int -> ReadS Control)
-> ReadS [Control]
-> ReadPrec Control
-> ReadPrec [Control]
-> Read Control
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Control]
$creadListPrec :: ReadPrec [Control]
readPrec :: ReadPrec Control
$creadPrec :: ReadPrec Control
readList :: ReadS [Control]
$creadList :: ReadS [Control]
readsPrec :: Int -> ReadS Control
$creadsPrec :: Int -> ReadS Control
Read, Int -> Control -> ShowS
[Control] -> ShowS
Control -> String
(Int -> Control -> ShowS)
-> (Control -> String) -> ([Control] -> ShowS) -> Show Control
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Control] -> ShowS
$cshowList :: [Control] -> ShowS
show :: Control -> String
$cshow :: Control -> String
showsPrec :: Int -> Control -> ShowS
$cshowsPrec :: Int -> Control -> ShowS
Show, Typeable)

data Content = ContentRaw String
             | ContentVar Deref
    deriving (Typeable Content
Constr
DataType
Typeable Content =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> Content -> c Content)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c Content)
-> (Content -> Constr)
-> (Content -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c Content))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Content))
-> ((forall b. Data b => b -> b) -> Content -> Content)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> Content -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> Content -> r)
-> (forall u. (forall d. Data d => d -> u) -> Content -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Content -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Content -> m Content)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Content -> m Content)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Content -> m Content)
-> Data Content
Content -> Constr
Content -> DataType
(forall b. Data b => b -> b) -> Content -> Content
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Content -> c Content
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Content
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) -> Content -> u
forall u. (forall d. Data d => d -> u) -> Content -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Content -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Content -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Content -> m Content
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Content -> m Content
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Content
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Content -> c Content
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Content)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Content)
$cContentVar :: Constr
$cContentRaw :: Constr
$tContent :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Content -> m Content
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Content -> m Content
gmapMp :: (forall d. Data d => d -> m d) -> Content -> m Content
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Content -> m Content
gmapM :: (forall d. Data d => d -> m d) -> Content -> m Content
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Content -> m Content
gmapQi :: Int -> (forall d. Data d => d -> u) -> Content -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Content -> u
gmapQ :: (forall d. Data d => d -> u) -> Content -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Content -> [u]
gmapQr :: (r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Content -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Content -> r
gmapQl :: (r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Content -> r
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Content -> r
gmapT :: (forall b. Data b => b -> b) -> Content -> Content
$cgmapT :: (forall b. Data b => b -> b) -> Content -> Content
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Content)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Content)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Content)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Content)
dataTypeOf :: Content -> DataType
$cdataTypeOf :: Content -> DataType
toConstr :: Content -> Constr
$ctoConstr :: Content -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Content
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Content
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Content -> c Content
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Content -> c Content
$cp1Data :: Typeable Content
Data, Content -> Content -> Bool
(Content -> Content -> Bool)
-> (Content -> Content -> Bool) -> Eq Content
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Content -> Content -> Bool
$c/= :: Content -> Content -> Bool
== :: Content -> Content -> Bool
$c== :: Content -> Content -> Bool
Eq, ReadPrec [Content]
ReadPrec Content
Int -> ReadS Content
ReadS [Content]
(Int -> ReadS Content)
-> ReadS [Content]
-> ReadPrec Content
-> ReadPrec [Content]
-> Read Content
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Content]
$creadListPrec :: ReadPrec [Content]
readPrec :: ReadPrec Content
$creadPrec :: ReadPrec Content
readList :: ReadS [Content]
$creadList :: ReadS [Content]
readsPrec :: Int -> ReadS Content
$creadsPrec :: Int -> ReadS Content
Read, Int -> Content -> ShowS
[Content] -> ShowS
Content -> String
(Int -> Content -> ShowS)
-> (Content -> String) -> ([Content] -> ShowS) -> Show Content
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Content] -> ShowS
$cshowList :: [Content] -> ShowS
show :: Content -> String
$cshow :: Content -> String
showsPrec :: Int -> Content -> ShowS
$cshowsPrec :: Int -> Content -> ShowS
Show, Typeable)

type UserParser = ParsecT String () (Reader ParseOptions)

parseLineControl :: ParseOptions -> String -> Either String [Control]
parseLineControl :: ParseOptions -> String -> Either String [Control]
parseLineControl opts :: ParseOptions
opts s :: String
s =
  let readerT :: Reader ParseOptions (Either ParseError [Control])
readerT = ParsecT String () (Reader ParseOptions) [Control]
-> ()
-> String
-> String
-> Reader ParseOptions (Either ParseError [Control])
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> u -> String -> s -> m (Either ParseError a)
runParserT ParsecT String () (Reader ParseOptions) [Control]
lineControl () "" String
s
      res :: Either ParseError [Control]
res = Identity (Either ParseError [Control])
-> Either ParseError [Control]
forall a. Identity a -> a
runIdentity (Identity (Either ParseError [Control])
 -> Either ParseError [Control])
-> Identity (Either ParseError [Control])
-> Either ParseError [Control]
forall a b. (a -> b) -> a -> b
$ Reader ParseOptions (Either ParseError [Control])
-> ParseOptions -> Identity (Either ParseError [Control])
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT Reader ParseOptions (Either ParseError [Control])
readerT ParseOptions
opts
  in case Either ParseError [Control]
res of
       Left e :: ParseError
e -> String -> Either String [Control]
forall a b. a -> Either a b
Left (String -> Either String [Control])
-> String -> Either String [Control]
forall a b. (a -> b) -> a -> b
$ ParseError -> String
forall a. Show a => a -> String
show ParseError
e
       Right x :: [Control]
x -> [Control] -> Either String [Control]
forall a b. b -> Either a b
Right [Control]
x

lineControl :: UserParser [Control]
lineControl :: ParsecT String () (Reader ParseOptions) [Control]
lineControl = ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) [Control]
forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
manyTill ParsecT String () (Reader ParseOptions) Control
control (ParsecT String () (Reader ParseOptions) ()
 -> ParsecT String () (Reader ParseOptions) [Control])
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) [Control]
forall a b. (a -> b) -> a -> b
$ ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String () (Reader ParseOptions) ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> ParsecT String () (Reader ParseOptions) ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

control :: UserParser Control
control :: ParsecT String () (Reader ParseOptions) Control
control = ParsecT String () (Reader ParseOptions) Control
noControlVariable ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String () (Reader ParseOptions) Control
controlStatement ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String () (Reader ParseOptions) Control
noControlRaw
  where
    controlStatement :: UserParser Control
    controlStatement :: ParsecT String () (Reader ParseOptions) Control
controlStatement = do
      Either String Control
x <- UserParser (Either String Control)
parseControlStatement
      case Either String Control
x of
        Left str :: String
str -> Control -> ParsecT String () (Reader ParseOptions) Control
forall (m :: * -> *) a. Monad m => a -> m a
return (Content -> Control
NoControl (Content -> Control) -> Content -> Control
forall a b. (a -> b) -> a -> b
$ String -> Content
ContentRaw String
str)
        Right ctrl :: Control
ctrl -> Control -> ParsecT String () (Reader ParseOptions) Control
forall (m :: * -> *) a. Monad m => a -> m a
return Control
ctrl

    noControlVariable :: UserParser Control
    noControlVariable :: ParsecT String () (Reader ParseOptions) Control
noControlVariable = do
      Char
variablePrefix <- ParsecT String () (Reader ParseOptions) Char
forall (m :: * -> *). MonadReader ParseOptions m => m Char
getVariablePrefix
      Either String Deref
x <- Parsec String () (Either String Deref)
-> UserParser (Either String Deref)
forall a. Parsec String () a -> UserParser a
identityToReader (Parsec String () (Either String Deref)
 -> UserParser (Either String Deref))
-> Parsec String () (Either String Deref)
-> UserParser (Either String Deref)
forall a b. (a -> b) -> a -> b
$ Char -> Parsec String () (Either String Deref)
forall a. Char -> UserParser a (Either String Deref)
parseVar Char
variablePrefix
      Control -> ParsecT String () (Reader ParseOptions) Control
forall (m :: * -> *) a. Monad m => a -> m a
return (Control -> ParsecT String () (Reader ParseOptions) Control)
-> (Content -> Control)
-> Content
-> ParsecT String () (Reader ParseOptions) Control
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Content -> Control
NoControl (Content -> ParsecT String () (Reader ParseOptions) Control)
-> Content -> ParsecT String () (Reader ParseOptions) Control
forall a b. (a -> b) -> a -> b
$
        case Either String Deref
x of
          Left str :: String
str -> String -> Content
ContentRaw String
str
          Right deref :: Deref
deref -> Deref -> Content
ContentVar Deref
deref

    noControlRaw :: UserParser Control
    noControlRaw :: ParsecT String () (Reader ParseOptions) Control
noControlRaw = do
      Char
controlPrefix <- ParsecT String () (Reader ParseOptions) Char
forall (m :: * -> *). MonadReader ParseOptions m => m Char
getControlPrefix
      Char
variablePrefix <- ParsecT String () (Reader ParseOptions) Char
forall (m :: * -> *). MonadReader ParseOptions m => m Char
getVariablePrefix
      (Content -> Control
NoControl (Content -> Control) -> (String -> Content) -> String -> Control
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Content
ContentRaw) (String -> Control)
-> ParsecT String () (Reader ParseOptions) String
-> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
        ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (String -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
noneOf [Char
controlPrefix, Char
variablePrefix])

parseControlStatement :: UserParser (Either String Control)
parseControlStatement :: UserParser (Either String Control)
parseControlStatement = do
  Either String Control
a <- UserParser (Either String Control)
parseControl
  ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m ()
optional ParsecT String () (Reader ParseOptions) ()
eol
  Either String Control -> UserParser (Either String Control)
forall (m :: * -> *) a. Monad m => a -> m a
return Either String Control
a
 where
  eol :: UserParser ()
  eol :: ParsecT String () (Reader ParseOptions) ()
eol = ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\n') ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String () (Reader ParseOptions) String
-> ParsecT String () (Reader ParseOptions) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (String -> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "\r\n")

parseControl :: UserParser (Either String Control)
parseControl :: UserParser (Either String Control)
parseControl = do
  Char
controlPrefix <- ParsecT String () (Reader ParseOptions) Char
forall (m :: * -> *). MonadReader ParseOptions m => m Char
getControlPrefix
  ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT String () (Reader ParseOptions) Char
 -> ParsecT String () (Reader ParseOptions) ())
-> ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
controlPrefix
  let escape :: ParsecT String u (Reader ParseOptions) (Either String b)
escape = Char -> ParsecT String u (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\\' ParsecT String u (Reader ParseOptions) Char
-> Either String b
-> ParsecT String u (Reader ParseOptions) (Either String b)
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> String -> Either String b
forall a b. a -> Either a b
Left [Char
controlPrefix]
  UserParser (Either String Control)
forall u b.
ParsecT String u (Reader ParseOptions) (Either String b)
escape UserParser (Either String Control)
-> UserParser (Either String Control)
-> UserParser (Either String Control)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    (Control -> Either String Control
forall a b. b -> Either a b
Right (Control -> Either String Control)
-> ParsecT String () (Reader ParseOptions) Control
-> UserParser (Either String Control)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String () (Reader ParseOptions) Control
parseControlBetweenBrackets) UserParser (Either String Control)
-> UserParser (Either String Control)
-> UserParser (Either String Control)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
    Either String Control -> UserParser (Either String Control)
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> Either String Control
forall a b. a -> Either a b
Left [Char
controlPrefix])

parseControlBetweenBrackets :: UserParser Control
parseControlBetweenBrackets :: ParsecT String () (Reader ParseOptions) Control
parseControlBetweenBrackets =
  ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '{') (Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}') (ParsecT String () (Reader ParseOptions) Control
 -> ParsecT String () (Reader ParseOptions) Control)
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall a b. (a -> b) -> a -> b
$ ParsecT String () (Reader ParseOptions) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT String () (Reader ParseOptions) Control
parseControl' ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT String () (Reader ParseOptions) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces

parseControl' :: UserParser Control
parseControl' :: ParsecT String () (Reader ParseOptions) Control
parseControl' =
  ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String () (Reader ParseOptions) Control
parseForall ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String () (Reader ParseOptions) Control
parseEndForall ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String () (Reader ParseOptions) Control
parseIf ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String () (Reader ParseOptions) Control
parseElseIf ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
  ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String () (Reader ParseOptions) Control
parseElse ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
  ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String () (Reader ParseOptions) Control
parseEndIf ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
  ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String () (Reader ParseOptions) Control
parseCase ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
  ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String () (Reader ParseOptions) Control
parseCaseOf ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
  ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String () (Reader ParseOptions) Control
parseEndCase
  where
    parseForall :: UserParser Control
    parseForall :: ParsecT String () (Reader ParseOptions) Control
parseForall = do
      String -> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "forall" ParsecT String () (Reader ParseOptions) String
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT String () (Reader ParseOptions) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
      (x :: Deref
x, y :: Binding
y) <- UserParser (Deref, Binding)
binding
      Control -> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Control -> ParsecT String () (Reader ParseOptions) Control)
-> Control -> ParsecT String () (Reader ParseOptions) Control
forall a b. (a -> b) -> a -> b
$ Deref -> Binding -> Control
ControlForall Deref
x Binding
y

    parseEndForall :: UserParser Control
    parseEndForall :: ParsecT String () (Reader ParseOptions) Control
parseEndForall = String -> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "endforall" ParsecT String () (Reader ParseOptions) String
-> Control -> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Control
ControlEndForall

    parseIf :: UserParser Control
    parseIf :: ParsecT String () (Reader ParseOptions) Control
parseIf =
      String -> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "if" ParsecT String () (Reader ParseOptions) String
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT String () (Reader ParseOptions) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Deref -> Control)
-> ParsecT String () (Reader ParseOptions) Deref
-> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Deref -> Control
ControlIf (Parsec String () Deref
-> ParsecT String () (Reader ParseOptions) Deref
forall a. Parsec String () a -> UserParser a
identityToReader Parsec String () Deref
forall a. UserParser a Deref
parseDeref)

    parseElseIf :: UserParser Control
    parseElseIf :: ParsecT String () (Reader ParseOptions) Control
parseElseIf =
      String -> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "elseif" ParsecT String () (Reader ParseOptions) String
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>
      ParsecT String () (Reader ParseOptions) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>
      (Deref -> Control)
-> ParsecT String () (Reader ParseOptions) Deref
-> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Deref -> Control
ControlElseIf (Parsec String () Deref
-> ParsecT String () (Reader ParseOptions) Deref
forall a. Parsec String () a -> UserParser a
identityToReader Parsec String () Deref
forall a. UserParser a Deref
parseDeref)

    parseElse :: UserParser Control
    parseElse :: ParsecT String () (Reader ParseOptions) Control
parseElse = String -> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "else" ParsecT String () (Reader ParseOptions) String
-> Control -> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Control
ControlElse

    parseEndIf :: UserParser Control
    parseEndIf :: ParsecT String () (Reader ParseOptions) Control
parseEndIf = String -> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "endif" ParsecT String () (Reader ParseOptions) String
-> Control -> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Control
ControlEndIf

    parseCase :: UserParser Control
    parseCase :: ParsecT String () (Reader ParseOptions) Control
parseCase =
      String -> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "case" ParsecT String () (Reader ParseOptions) String
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>
      ParsecT String () (Reader ParseOptions) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*>
      (Deref -> Control)
-> ParsecT String () (Reader ParseOptions) Deref
-> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Deref -> Control
ControlCase (Parsec String () Deref
-> ParsecT String () (Reader ParseOptions) Deref
forall a. Parsec String () a -> UserParser a
identityToReader Parsec String () Deref
forall a. UserParser a Deref
parseDeref)

    parseCaseOf :: UserParser Control
    parseCaseOf :: ParsecT String () (Reader ParseOptions) Control
parseCaseOf = String -> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "of" ParsecT String () (Reader ParseOptions) String
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT String () (Reader ParseOptions) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) Control
-> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Binding -> Control)
-> ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Binding -> Control
ControlCaseOf ParsecT String () (Reader ParseOptions) Binding
identPattern

    parseEndCase :: UserParser Control
    parseEndCase :: ParsecT String () (Reader ParseOptions) Control
parseEndCase = String -> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "endcase" ParsecT String () (Reader ParseOptions) String
-> Control -> ParsecT String () (Reader ParseOptions) Control
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> Control
ControlEndCase

    binding :: UserParser (Deref, Binding)
    binding :: UserParser (Deref, Binding)
binding = do
      Binding
y <- ParsecT String () (Reader ParseOptions) Binding
identPattern
      ParsecT String () (Reader ParseOptions) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
      String
_ <- String -> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string "<-"
      ParsecT String () (Reader ParseOptions) ()
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m ()
spaces
      Deref
x <- Parsec String () Deref
-> ParsecT String () (Reader ParseOptions) Deref
forall a. Parsec String () a -> UserParser a
identityToReader Parsec String () Deref
forall a. UserParser a Deref
parseDeref
      String
_ <- ParsecT String () (Reader ParseOptions) String
spaceTabs
      (Deref, Binding) -> UserParser (Deref, Binding)
forall (m :: * -> *) a. Monad m => a -> m a
return (Deref
x, Binding
y)

    spaceTabs :: UserParser String
    spaceTabs :: ParsecT String () (Reader ParseOptions) String
spaceTabs = ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many (ParsecT String () (Reader ParseOptions) Char
 -> ParsecT String () (Reader ParseOptions) String)
-> ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf " \t"

    -- | Parse an indentifier.  This is an sequence of alphanumeric characters,
    -- or an operator.
    ident :: UserParser Ident
    ident :: UserParser Ident
ident = do
      String
i <- (ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
alphaNum ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '_' ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '\'')) ParsecT String () (Reader ParseOptions) String
-> ParsecT String () (Reader ParseOptions) String
-> ParsecT String () (Reader ParseOptions) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String () (Reader ParseOptions) String
-> ParsecT String () (Reader ParseOptions) String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String () (Reader ParseOptions) String
operator
      ParsecT String () (Reader ParseOptions) ()
white
      Ident -> UserParser Ident
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> Ident
Ident String
i) UserParser Ident -> String -> UserParser Ident
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "identifier"

    -- | Parse an operator.  An operator is a sequence of characters in
    -- 'operatorList' in between parenthesis.
    operator :: UserParser String
    operator :: ParsecT String () (Reader ParseOptions) String
operator = do
      String
oper <- ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) String
-> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '(') (Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')') (ParsecT String () (Reader ParseOptions) String
 -> ParsecT String () (Reader ParseOptions) String)
-> (ParsecT String () (Reader ParseOptions) Char
    -> ParsecT String () (Reader ParseOptions) String)
-> ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (ParsecT String () (Reader ParseOptions) Char
 -> ParsecT String () (Reader ParseOptions) String)
-> ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) String
forall a b. (a -> b) -> a -> b
$ String -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
operatorList
      String -> ParsecT String () (Reader ParseOptions) String
forall (f :: * -> *) a. Applicative f => a -> f a
pure (String -> ParsecT String () (Reader ParseOptions) String)
-> String -> ParsecT String () (Reader ParseOptions) String
forall a b. (a -> b) -> a -> b
$ String
oper

    operatorList :: String
    operatorList :: String
operatorList = "!#$%&*+./<=>?@\\^|-~:"

    parens :: UserParser a -> UserParser a
    parens :: UserParser a -> UserParser a
parens = ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
-> UserParser a
-> UserParser a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '(' ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () (Reader ParseOptions) ()
white) (Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ')' ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () (Reader ParseOptions) ()
white)

    brackets :: UserParser a -> UserParser a
    brackets :: UserParser a -> UserParser a
brackets = ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
-> UserParser a
-> UserParser a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '[' ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () (Reader ParseOptions) ()
white) (Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ']' ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () (Reader ParseOptions) ()
white)

    braces :: UserParser a -> UserParser a
    braces :: UserParser a -> UserParser a
braces = ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
-> UserParser a
-> UserParser a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
between (Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '{' ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () (Reader ParseOptions) ()
white) (Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '}' ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () (Reader ParseOptions) ()
white)

    comma :: UserParser ()
    comma :: ParsecT String () (Reader ParseOptions) ()
comma = Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ',' ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () (Reader ParseOptions) ()
white

    atsign :: UserParser ()
    atsign :: ParsecT String () (Reader ParseOptions) ()
atsign = Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '@' ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () (Reader ParseOptions) ()
white

    equals :: UserParser ()
    equals :: ParsecT String () (Reader ParseOptions) ()
equals = Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '=' ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () (Reader ParseOptions) ()
white

    white :: UserParser ()
    white :: ParsecT String () (Reader ParseOptions) ()
white = ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany (ParsecT String () (Reader ParseOptions) Char
 -> ParsecT String () (Reader ParseOptions) ())
-> ParsecT String () (Reader ParseOptions) Char
-> ParsecT String () (Reader ParseOptions) ()
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char ' '

    wildDots :: UserParser ()
    wildDots :: ParsecT String () (Reader ParseOptions) ()
wildDots = String -> ParsecT String () (Reader ParseOptions) String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string ".." ParsecT String () (Reader ParseOptions) String
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () (Reader ParseOptions) ()
white

    -- | Return 'True' if 'Ident' is a variable.  Variables are defined as
    -- starting with a lowercase letter.
    isVariable :: Ident -> Bool
    isVariable :: Ident -> Bool
isVariable (Ident (x :: Char
x:_)) = Bool -> Bool
not (Char -> Bool
isUpper Char
x)
    isVariable (Ident []) = String -> Bool
forall a. HasCallStack => String -> a
error "isVariable: bad identifier"

    -- | Return 'True' if an 'Ident' is a constructor.  Constructors are
    -- defined as either starting with an uppercase letter, or being an
    -- operator.
    isConstructor :: Ident -> Bool
    isConstructor :: Ident -> Bool
isConstructor (Ident (x :: Char
x:_)) = Char -> Bool
isUpper Char
x Bool -> Bool -> Bool
|| Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Char
x String
operatorList
    isConstructor (Ident []) = String -> Bool
forall a. HasCallStack => String -> a
error "isConstructor: bad identifier"

    -- | This function tries to parse an entire pattern binding with either
    -- @'gcon' True@ or 'apat'.  For instance, in the pattern
    -- @let Foo a b = ...@, this function tries to parse @Foo a b@ with 'gcon'.
    -- In the pattern @let n = ...@, this function tries to parse @n@ with
    -- 'apat'.
    identPattern :: UserParser Binding
    identPattern :: ParsecT String () (Reader ParseOptions) Binding
identPattern = Bool -> ParsecT String () (Reader ParseOptions) Binding
gcon Bool
True ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) Binding
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT String () (Reader ParseOptions) Binding
apat
      where
        apat :: UserParser Binding
        apat :: ParsecT String () (Reader ParseOptions) Binding
apat = [ParsecT String () (Reader ParseOptions) Binding]
-> ParsecT String () (Reader ParseOptions) Binding
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice [ParsecT String () (Reader ParseOptions) Binding
varpat, Bool -> ParsecT String () (Reader ParseOptions) Binding
gcon Bool
False, ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) Binding
forall a. UserParser a -> UserParser a
parens ParsecT String () (Reader ParseOptions) Binding
tuplepat, ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) Binding
forall a. UserParser a -> UserParser a
brackets ParsecT String () (Reader ParseOptions) Binding
listpat]

        -- | Parse a variable in a pattern.  For instance in, in a pattern like
        -- @let Just n = ...@, this function would be what is used to parse the
        -- @n@.  This function also handles aliases with @\@@.
        varpat :: UserParser Binding
        varpat :: ParsecT String () (Reader ParseOptions) Binding
varpat = do
          Ident
v <-
            UserParser Ident -> UserParser Ident
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (UserParser Ident -> UserParser Ident)
-> UserParser Ident -> UserParser Ident
forall a b. (a -> b) -> a -> b
$ do
              Ident
v <- UserParser Ident
ident
              Bool -> ParsecT String () (Reader ParseOptions) ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Ident -> Bool
isVariable Ident
v)
              Ident -> UserParser Ident
forall (m :: * -> *) a. Monad m => a -> m a
return Ident
v
          Binding
-> ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) Binding
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option (Ident -> Binding
BindVar Ident
v) (ParsecT String () (Reader ParseOptions) Binding
 -> ParsecT String () (Reader ParseOptions) Binding)
-> ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) Binding
forall a b. (a -> b) -> a -> b
$ do
            ParsecT String () (Reader ParseOptions) ()
atsign
            Binding
b <- ParsecT String () (Reader ParseOptions) Binding
apat
            Binding -> ParsecT String () (Reader ParseOptions) Binding
forall (m :: * -> *) a. Monad m => a -> m a
return (Ident -> Binding -> Binding
BindAs Ident
v Binding
b) ParsecT String () (Reader ParseOptions) Binding
-> String -> ParsecT String () (Reader ParseOptions) Binding
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> "variable"

        -- | This function tries to parse an entire pattern binding.  For
        -- instance, in the pattern @let Foo a b = ...@, this function tries to
        -- parse @Foo a b@.
        --
        -- This function first tries to parse a data contructor (using
        -- 'dataConstr').  In the example above, that would be like parsing
        -- @Foo@.
        --
        -- Then, the function tries to do two different things.
        --
        -- 1. It tries to parse record syntax with 'record'.  In a pattern like
        -- @let Foo{foo1 = 3, foo2 = "hello"} = ...@, it would parse the
        -- @{foo1 = 3, foo2 = "hello"}@ part.
        --
        -- 2. If parsing the record syntax fails, it then tries to parse
        -- many normal patterns with 'apat'.  In a pattern like
        -- @let Foo a b = ...@, it would be like parsing the @a b@ part.
        --
        -- If that fails, then it just returns the original data contructor
        -- with no arguments.
        --
        -- The 'Bool' argument determines whether or not it tries to parse
        -- normal patterns in 2.  If the boolean argument is 'True', then it
        -- tries parsing normal patterns in 2.  If the boolean argument is
        -- 'False', then 2 is skipped altogether.
        gcon :: Bool -> UserParser Binding
        gcon :: Bool -> ParsecT String () (Reader ParseOptions) Binding
gcon allowArgs :: Bool
allowArgs = do
          DataConstr
c <- ParsecT String () (Reader ParseOptions) DataConstr
-> ParsecT String () (Reader ParseOptions) DataConstr
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT String () (Reader ParseOptions) DataConstr
dataConstr
          [ParsecT String () (Reader ParseOptions) Binding]
-> ParsecT String () (Reader ParseOptions) Binding
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice
            [ DataConstr -> ParsecT String () (Reader ParseOptions) Binding
record DataConstr
c
            , ([Binding] -> Binding)
-> ParsecT String () (Reader ParseOptions) [Binding]
-> ParsecT String () (Reader ParseOptions) Binding
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (DataConstr -> [Binding] -> Binding
BindConstr DataConstr
c) (Bool -> ParsecT String () (Reader ParseOptions) ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard Bool
allowArgs ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) [Binding]
-> ParsecT String () (Reader ParseOptions) [Binding]
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) [Binding]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String () (Reader ParseOptions) Binding
apat)
            , Binding -> ParsecT String () (Reader ParseOptions) Binding
forall (m :: * -> *) a. Monad m => a -> m a
return (DataConstr -> [Binding] -> Binding
BindConstr DataConstr
c [])
            ] ParsecT String () (Reader ParseOptions) Binding
-> String -> ParsecT String () (Reader ParseOptions) Binding
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?>
            "constructor"

        -- | Parse a possibly qualified identifier using 'ident'.
        dataConstr :: UserParser DataConstr
        dataConstr :: ParsecT String () (Reader ParseOptions) DataConstr
dataConstr = do
          String
p <- ParsecT String () (Reader ParseOptions) String
dcPiece
          [String]
ps <- ParsecT String () (Reader ParseOptions) String
-> ParsecT String () (Reader ParseOptions) [String]
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
many ParsecT String () (Reader ParseOptions) String
dcPieces
          DataConstr -> ParsecT String () (Reader ParseOptions) DataConstr
forall (m :: * -> *) a. Monad m => a -> m a
return (DataConstr -> ParsecT String () (Reader ParseOptions) DataConstr)
-> DataConstr -> ParsecT String () (Reader ParseOptions) DataConstr
forall a b. (a -> b) -> a -> b
$ String -> [String] -> DataConstr
toDataConstr String
p [String]
ps

        dcPiece :: UserParser String
        dcPiece :: ParsecT String () (Reader ParseOptions) String
dcPiece = do
          x :: Ident
x@(Ident y :: String
y) <- UserParser Ident
ident
          Bool -> ParsecT String () (Reader ParseOptions) ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> ParsecT String () (Reader ParseOptions) ())
-> Bool -> ParsecT String () (Reader ParseOptions) ()
forall a b. (a -> b) -> a -> b
$ Ident -> Bool
isConstructor Ident
x
          String -> ParsecT String () (Reader ParseOptions) String
forall (m :: * -> *) a. Monad m => a -> m a
return String
y

        dcPieces :: UserParser String
        dcPieces :: ParsecT String () (Reader ParseOptions) String
dcPieces = do
          Char
_ <- Char -> ParsecT String () (Reader ParseOptions) Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char '.'
          ParsecT String () (Reader ParseOptions) String
dcPiece

        toDataConstr :: String -> [String] -> DataConstr
        toDataConstr :: String -> [String] -> DataConstr
toDataConstr x :: String
x [] = Ident -> DataConstr
DCUnqualified (Ident -> DataConstr) -> Ident -> DataConstr
forall a b. (a -> b) -> a -> b
$ String -> Ident
Ident String
x
        toDataConstr x :: String
x (y :: String
y:ys :: [String]
ys) = ([String] -> [String]) -> String -> [String] -> DataConstr
go (String
x String -> [String] -> [String]
forall a. a -> [a] -> [a]
:) String
y [String]
ys
          where
            go :: ([String] -> [String]) -> String -> [String] -> DataConstr
            go :: ([String] -> [String]) -> String -> [String] -> DataConstr
go front :: [String] -> [String]
front next :: String
next [] = Module -> Ident -> DataConstr
DCQualified ([String] -> Module
Module ([String] -> Module) -> [String] -> Module
forall a b. (a -> b) -> a -> b
$ [String] -> [String]
front []) (String -> Ident
Ident String
next)
            go front :: [String] -> [String]
front next :: String
next (rest :: String
rest:rests :: [String]
rests) = ([String] -> [String]) -> String -> [String] -> DataConstr
go ([String] -> [String]
front ([String] -> [String])
-> ([String] -> [String]) -> [String] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
next String -> [String] -> [String]
forall a. a -> [a] -> [a]
:)) String
rest [String]
rests

        record :: DataConstr -> UserParser Binding
        record :: DataConstr -> ParsecT String () (Reader ParseOptions) Binding
record c :: DataConstr
c =
          ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) Binding
forall a. UserParser a -> UserParser a
braces (ParsecT String () (Reader ParseOptions) Binding
 -> ParsecT String () (Reader ParseOptions) Binding)
-> ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) Binding
forall a b. (a -> b) -> a -> b
$ do
            (fields :: [(Ident, Binding)]
fields, wild :: Bool
wild) <- ([(Ident, Binding)], Bool)
-> ParsecT
     String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
-> ParsecT
     String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option ([], Bool
False) ParsecT String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
go
            Binding -> ParsecT String () (Reader ParseOptions) Binding
forall (m :: * -> *) a. Monad m => a -> m a
return (DataConstr -> [(Ident, Binding)] -> Bool -> Binding
BindRecord DataConstr
c [(Ident, Binding)]
fields Bool
wild)
          where
            go :: UserParser ([(Ident, Binding)], Bool)
            go :: ParsecT String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
go =
              (ParsecT String () (Reader ParseOptions) ()
wildDots ParsecT String () (Reader ParseOptions) ()
-> ParsecT
     String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
-> ParsecT
     String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ([(Ident, Binding)], Bool)
-> ParsecT
     String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return ([], Bool
True)) ParsecT String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
-> ParsecT
     String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
-> ParsecT
     String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|>
              (do (Ident, Binding)
x <- UserParser (Ident, Binding)
recordField
                  (xs :: [(Ident, Binding)]
xs, wild :: Bool
wild) <- ([(Ident, Binding)], Bool)
-> ParsecT
     String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
-> ParsecT
     String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option ([], Bool
False) (ParsecT String () (Reader ParseOptions) ()
comma ParsecT String () (Reader ParseOptions) ()
-> ParsecT
     String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
-> ParsecT
     String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
go)
                  ([(Ident, Binding)], Bool)
-> ParsecT
     String () (Reader ParseOptions) ([(Ident, Binding)], Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Ident, Binding)
x (Ident, Binding) -> [(Ident, Binding)] -> [(Ident, Binding)]
forall a. a -> [a] -> [a]
: [(Ident, Binding)]
xs, Bool
wild))

        recordField :: UserParser (Ident, Binding)
        recordField :: UserParser (Ident, Binding)
recordField = do
          Ident
field <- UserParser Ident
ident
          Binding
p <-
            Binding
-> ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) Binding
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option
              (Ident -> Binding
BindVar Ident
field) -- support punning
              (ParsecT String () (Reader ParseOptions) ()
equals ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) Binding
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ParsecT String () (Reader ParseOptions) Binding
identPattern)
          (Ident, Binding) -> UserParser (Ident, Binding)
forall (m :: * -> *) a. Monad m => a -> m a
return (Ident
field, Binding
p)

        tuplepat :: UserParser Binding
        tuplepat :: ParsecT String () (Reader ParseOptions) Binding
tuplepat = do
          [Binding]
xs <- ParsecT String () (Reader ParseOptions) Binding
identPattern ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) [Binding]
forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
`sepBy` ParsecT String () (Reader ParseOptions) ()
comma
          Binding -> ParsecT String () (Reader ParseOptions) Binding
forall (m :: * -> *) a. Monad m => a -> m a
return (Binding -> ParsecT String () (Reader ParseOptions) Binding)
-> Binding -> ParsecT String () (Reader ParseOptions) Binding
forall a b. (a -> b) -> a -> b
$
            case [Binding]
xs of
              [x :: Binding
x] -> Binding
x
              _ -> [Binding] -> Binding
BindTuple [Binding]
xs

        listpat :: UserParser Binding
        listpat :: ParsecT String () (Reader ParseOptions) Binding
listpat = [Binding] -> Binding
BindList ([Binding] -> Binding)
-> ParsecT String () (Reader ParseOptions) [Binding]
-> ParsecT String () (Reader ParseOptions) Binding
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String () (Reader ParseOptions) Binding
identPattern ParsecT String () (Reader ParseOptions) Binding
-> ParsecT String () (Reader ParseOptions) ()
-> ParsecT String () (Reader ParseOptions) [Binding]
forall s (m :: * -> *) t u a end.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
`sepBy` ParsecT String () (Reader ParseOptions) ()
comma

identityToReader :: Parsec String () a -> UserParser a
identityToReader :: Parsec String () a -> UserParser a
identityToReader p :: Parsec String () a
p =
  (State String ()
 -> Reader
      ParseOptions (Consumed (Reader ParseOptions (Reply String () a))))
-> UserParser a
forall (m :: * -> *) s u a.
Monad m =>
(State s u -> m (Consumed (m (Reply s u a)))) -> ParsecT s u m a
mkPT ((State String ()
  -> Reader
       ParseOptions (Consumed (Reader ParseOptions (Reply String () a))))
 -> UserParser a)
-> (State String ()
    -> Reader
         ParseOptions (Consumed (Reader ParseOptions (Reply String () a))))
-> UserParser a
forall a b. (a -> b) -> a -> b
$ Consumed (Reader ParseOptions (Reply String () a))
-> Reader
     ParseOptions (Consumed (Reader ParseOptions (Reply String () a)))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Consumed (Reader ParseOptions (Reply String () a))
 -> Reader
      ParseOptions (Consumed (Reader ParseOptions (Reply String () a))))
-> (State String ()
    -> Consumed (Reader ParseOptions (Reply String () a)))
-> State String ()
-> Reader
     ParseOptions (Consumed (Reader ParseOptions (Reply String () a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Identity (Reply String () a)
 -> Reader ParseOptions (Reply String () a))
-> Consumed (Identity (Reply String () a))
-> Consumed (Reader ParseOptions (Reply String () a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Reply String () a -> Reader ParseOptions (Reply String () a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Reply String () a -> Reader ParseOptions (Reply String () a))
-> (Identity (Reply String () a) -> Reply String () a)
-> Identity (Reply String () a)
-> Reader ParseOptions (Reply String () a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Identity (Reply String () a) -> Reply String () a
forall a. Identity a -> a
runIdentity) (Consumed (Identity (Reply String () a))
 -> Consumed (Reader ParseOptions (Reply String () a)))
-> (State String () -> Consumed (Identity (Reply String () a)))
-> State String ()
-> Consumed (Reader ParseOptions (Reply String () a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Identity (Consumed (Identity (Reply String () a)))
-> Consumed (Identity (Reply String () a))
forall a. Identity a -> a
runIdentity (Identity (Consumed (Identity (Reply String () a)))
 -> Consumed (Identity (Reply String () a)))
-> (State String ()
    -> Identity (Consumed (Identity (Reply String () a))))
-> State String ()
-> Consumed (Identity (Reply String () a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parsec String () a
-> State String ()
-> Identity (Consumed (Identity (Reply String () a)))
forall (m :: * -> *) s u a.
Monad m =>
ParsecT s u m a -> State s u -> m (Consumed (m (Reply s u a)))
runParsecT Parsec String () a
p