less prototype, less bad code implementation of CCHM type theory
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
3.0 KiB

  1. {-# OPTIONS_GHC -Wno-orphans #-}
  2. {-# LANGUAGE ViewPatterns #-}
  3. module Syntax.Pretty where
  4. import Control.Arrow (Arrow(first))
  5. import qualified Data.Text.Lazy as L
  6. import qualified Data.Text as T
  7. import Data.Text (Text)
  8. import Presyntax.Presyntax (Plicity(..))
  9. import Prettyprinter.Render.Terminal
  10. import Prettyprinter
  11. import Syntax
  12. instance Pretty Name where
  13. pretty (Bound x) = pretty x
  14. pretty (Defined x) = pretty x
  15. prettyTm :: Term -> Doc AnsiStyle
  16. prettyTm (Ref v) = pretty v
  17. prettyTm (App Im f x) = parenFun f <+> braces (prettyTm x)
  18. prettyTm (App Ex f x) = parenFun f <+> parenArg x
  19. prettyTm (Pair x y) = parens $ prettyTm x <> operator comma <+> prettyTm y
  20. prettyTm (Proj1 x) = prettyTm x <> operator (pretty ".1")
  21. prettyTm (Proj2 x) = prettyTm x <> operator (pretty ".2")
  22. prettyTm l@(Lam _ _ _) = pretty '\\' <> hsep (map prettyArgList al) <+> pretty "->" <+> prettyTm bod where
  23. unwindLam (Lam p x y) = first ((p, x):) (unwindLam y)
  24. unwindLam t = ([], t)
  25. (al, bod) = unwindLam l
  26. prettyArgList (Ex, v) = pretty v
  27. prettyArgList (Im, v) = braces (pretty v)
  28. prettyTm (Meta x) = keyword $ pretty '?' <> pretty (mvName x)
  29. prettyTm Type{} = keyword $ pretty "Type"
  30. prettyTm Typeω{} = keyword $ pretty "Typeω"
  31. prettyTm I{} = keyword $ pretty "I"
  32. prettyTm I0{} = keyword $ pretty "i0"
  33. prettyTm I1{} = keyword $ pretty "i1"
  34. prettyTm (Pi Ex (T.unpack -> "_") d r) = prettyDom d <+> pretty "->" <+> prettyTm r
  35. prettyTm (Pi Im v d r) = braces (pretty v <+> colon <+> prettyTm d) <+> pretty "->" <+> prettyTm r
  36. prettyTm (Pi Ex v d r) = parens (pretty v <+> colon <+> prettyTm d) <+> pretty "->" <+> prettyTm r
  37. prettyTm (Sigma (T.unpack -> "_") d r) = prettyDom d <+> pretty "*" <+> prettyTm r
  38. prettyTm (Sigma v d r) = parens (pretty v <+> colon <+> prettyTm d) <+> pretty "*" <+> prettyTm r
  39. prettyTm (IAnd x y) = prettyTm x <+> operator (pretty "&&") <+> prettyTm y
  40. prettyTm (IOr x y) = prettyTm x <+> operator (pretty "||") <+> prettyTm y
  41. prettyTm (INot x) = operator (pretty '~') <> prettyTm x
  42. prettyTm (PathP l x y) = keyword (pretty "PathP") <+> parenArg l <+> parenArg x <+> parenArg y
  43. prettyTm (IElim _ _ _ f i) = prettyTm (App Ex f i)
  44. prettyTm (PathIntro _ f) = prettyTm f
  45. keyword :: Doc AnsiStyle -> Doc AnsiStyle
  46. keyword = annotate (color Magenta)
  47. operator :: Doc AnsiStyle -> Doc AnsiStyle
  48. operator = annotate (color Yellow)
  49. parenArg :: Term -> Doc AnsiStyle
  50. parenArg x@App{} = parens (prettyTm x)
  51. parenArg x@IElim{} = parens (prettyTm x)
  52. parenArg x = prettyDom x
  53. prettyDom :: Term -> Doc AnsiStyle
  54. prettyDom x@Pi{} = parens (prettyTm x)
  55. prettyDom x@Sigma{} = parens (prettyTm x)
  56. prettyDom x = parenFun x
  57. parenFun :: Term -> Doc AnsiStyle
  58. parenFun x@Lam{} = parens $ prettyTm x
  59. parenFun x@PathIntro{} = parens $ prettyTm x
  60. parenFun x = prettyTm x
  61. render :: Doc AnsiStyle -> Text
  62. render = L.toStrict . renderLazy . layoutPretty defaultLayoutOptions
  63. showValue :: Value -> String
  64. showValue = L.unpack . renderLazy . layoutPretty defaultLayoutOptions . prettyTm . quote