module Language.PureScript.Parser.Kinds (
parseKind
) where
import Language.PureScript.Kinds
import Language.PureScript.Parser.Common
import Language.PureScript.Parser.Lexer
import Control.Applicative
import qualified Text.Parsec as P
import qualified Text.Parsec.Expr as P
parseStar :: TokenParser Kind
parseStar = const Star <$> symbol' "*"
parseBang :: TokenParser Kind
parseBang = const Bang <$> symbol' "!"
parseTypeAtom :: TokenParser Kind
parseTypeAtom = indented *> P.choice (map P.try
[ parseStar
, parseBang
, parens parseKind ])
parseKind :: TokenParser Kind
parseKind = P.buildExpressionParser operators parseTypeAtom P.<?> "kind"
where
operators = [ [ P.Prefix (symbol' "#" >> return Row) ]
, [ P.Infix ((P.try rarrow) >> return FunKind) P.AssocRight ] ]