module UHC.Light.Compiler.Ty.Parser
( pTy', pTy )
where
import UU.Parsing
import UHC.Util.ParseUtils
import UHC.Light.Compiler.Base.Parser
import UHC.Util.ScanUtils
import UHC.Light.Compiler.Base.Common
import UHC.Light.Compiler.Base.TermLike
import UHC.Light.Compiler.Base.HsName.Builtin
import UHC.Light.Compiler.Scanner.Common
import UHC.Light.Compiler.Scanner.Scanner
import UHC.Light.Compiler.Ty

{-# LINE 21 "src/ehc/Ty/Parser.chs" #-}
-- type P p = PlainParser Token p

{-# LINE 25 "src/ehc/Ty/Parser.chs" #-}
pTy :: P Ty
pTy = pTy' pDollNm

pTy' :: P HsName -> P Ty
pTy' pNm = pT
  where
{-
    pPred :: P Pred
    pPred
      = pOIMPL
         *> (pT
             <**> (   (flip Pred_Lacks) <$ pLAM <*> (Label_Lab <$> pNm <|> Label_Var <$> pUIDHI)
                  <|> pSucceed Pred_Class
            )     )
        <*  pCIMPL
-}

    pTyBase :: P Ty
    pTyBase
      =   appCon  <$> pNm
      <|> pParens pT
      <|> pBracks pT
      <|> pRow
      <|> mkTyVar <$> pUID
{-
      <|> Ty_Any  <$  pQUESTQUEST
      <|> mkTyPr  <$> pPred
-}
      where pRow :: P Ty
            pRow
              = pOROWROW
                 *> (   foldl (\r (l,e) -> Ty_Ext r l e)
                        <$> pRow <* pVBAR
                        <*> pList1Sep pCOMMA ((,) <$> (pNm <|> mkHNmPos <$> pInt) <* pDCOLON <*> pT)
                    <|> pSucceed (appCon hsnRowEmpty)
                    )
                <*  pCROWROW

    pTyApp :: P Ty
    pTyApp
      =   appTopApp <$> pList1 pTyBase

    pT :: P Ty
    pT
      =   pTyApp <**>
            (   flip app1Arr <$ pRARROW <*> pT
            <|> pSucceed id
            )
{-
      <|> Ty_TBind
          <$> ((TyQu_Forall <$ pFORALL <|> TyQu_Exists <$ pEXISTS) <*> pMaybe 0 id (pSTAR *> pMaybe 1 id pInt))
          <*> pUIDHI
          <*> pMaybe kiStar id (pParens pT)
          <*  pDOT
          <*> pT
      <|> Ty_Lam <$ pLAM <*> pUIDHI <* pRARROW <*> pT
-}