-- |
-- A parser for kinds
--
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
    ]

-- |
-- Parse a kind
--
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 ] ]