{-# OPTIONS_GHC -Wno-orphans #-} {-# LANGUAGE ViewPatterns #-} module Syntax.Pretty where import Control.Arrow (Arrow(first)) import qualified Data.Text.Lazy as L import qualified Data.Text as T import Data.Text (Text) import Presyntax.Presyntax (Plicity(..)) import Prettyprinter.Render.Terminal import Prettyprinter import Syntax instance Pretty Name where pretty (Bound x) = pretty x pretty (Defined x) = pretty x prettyTm :: Term -> Doc AnsiStyle prettyTm (Ref v) = pretty v prettyTm (App Im f x) = parenFun f <+> braces (prettyTm x) prettyTm (App Ex f x) = parenFun f <+> parenArg x prettyTm (Pair x y) = parens $ prettyTm x <> operator comma <+> prettyTm y prettyTm (Proj1 x) = prettyTm x <> operator (pretty ".1") prettyTm (Proj2 x) = prettyTm x <> operator (pretty ".2") prettyTm l@(Lam _ _ _) = pretty '\\' <> hsep (map prettyArgList al) <+> pretty "->" <+> prettyTm bod where unwindLam (Lam p x y) = first ((p, x):) (unwindLam y) unwindLam t = ([], t) (al, bod) = unwindLam l prettyArgList (Ex, v) = pretty v prettyArgList (Im, v) = braces (pretty v) prettyTm (Meta x) = keyword $ pretty '?' <> pretty (mvName x) prettyTm Type{} = keyword $ pretty "Type" prettyTm Typeω{} = keyword $ pretty "Typeω" prettyTm I{} = keyword $ pretty "I" prettyTm I0{} = keyword $ pretty "i0" prettyTm I1{} = keyword $ pretty "i1" prettyTm (Pi Ex (T.unpack -> "_") d r) = prettyDom d <+> pretty "->" <+> prettyTm r prettyTm (Pi Im v d r) = braces (pretty v <+> colon <+> prettyTm d) <+> pretty "->" <+> prettyTm r prettyTm (Pi Ex v d r) = parens (pretty v <+> colon <+> prettyTm d) <+> pretty "->" <+> prettyTm r prettyTm (Sigma (T.unpack -> "_") d r) = prettyDom d <+> pretty "*" <+> prettyTm r prettyTm (Sigma v d r) = parens (pretty v <+> colon <+> prettyTm d) <+> pretty "*" <+> prettyTm r prettyTm (IAnd x y) = prettyTm x <+> operator (pretty "&&") <+> prettyTm y prettyTm (IOr x y) = prettyTm x <+> operator (pretty "||") <+> prettyTm y prettyTm (INot x) = operator (pretty '~') <> prettyTm x prettyTm (PathP l x y) = keyword (pretty "PathP") <+> parenArg l <+> parenArg x <+> parenArg y prettyTm (IElim _ _ _ f i) = prettyTm (App Ex f i) prettyTm (PathIntro _ f) = prettyTm f keyword :: Doc AnsiStyle -> Doc AnsiStyle keyword = annotate (color Magenta) operator :: Doc AnsiStyle -> Doc AnsiStyle operator = annotate (color Yellow) parenArg :: Term -> Doc AnsiStyle parenArg x@App{} = parens (prettyTm x) parenArg x@IElim{} = parens (prettyTm x) parenArg x = prettyDom x prettyDom :: Term -> Doc AnsiStyle prettyDom x@Pi{} = parens (prettyTm x) prettyDom x@Sigma{} = parens (prettyTm x) prettyDom x = parenFun x parenFun :: Term -> Doc AnsiStyle parenFun x@Lam{} = parens $ prettyTm x parenFun x@PathIntro{} = parens $ prettyTm x parenFun x = prettyTm x render :: Doc AnsiStyle -> Text render = L.toStrict . renderLazy . layoutPretty defaultLayoutOptions showValue :: Value -> String showValue = L.unpack . renderLazy . layoutPretty defaultLayoutOptions . prettyTm . quote