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
pTy :: P Ty
pTy = pTy' pDollNm
pTy' :: P HsName -> P Ty
pTy' pNm = pT
where
pTyBase :: P Ty
pTyBase
= appCon <$> pNm
<|> pParens pT
<|> pBracks pT
<|> pRow
<|> mkTyVar <$> pUID
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
)