module Language.PureScript.Parser.Kinds (parseKind) where
import Prelude.Compat
import Language.PureScript.Kinds
import Language.PureScript.Parser.Common
import Language.PureScript.Parser.Lexer
import qualified Text.Parsec as P
import qualified Text.Parsec.Expr as P
parseNamedKind :: TokenParser SourceKind
parseNamedKind = withSourceAnnF $ do
name <- parseQualified kindName
return $ \ann -> NamedKind ann name
parseKindAtom :: TokenParser SourceKind
parseKindAtom =
indented *> P.choice
[ parseNamedKind
, parens parseKind
]
parseKind :: TokenParser SourceKind
parseKind = P.buildExpressionParser operators parseKindAtom P.<?> "kind"
where
operators = [ [ P.Prefix (withSourceAnnF $ symbol' "#" >> return Row) ]
, [ P.Infix (withSourceAnnF $ rarrow >> return FunKind) P.AssocRight ] ]