2022-04-23 18:21:30 -04:00
|
|
|
|
module Quox.Syntax.Term.Pretty
|
|
|
|
|
|
|
|
|
|
import Quox.Syntax.Term.Base
|
|
|
|
|
import Quox.Syntax.Term.Split
|
|
|
|
|
import Quox.Syntax.Term.Subst
|
|
|
|
|
import Quox.Pretty
|
|
|
|
|
|
|
|
|
|
import Data.Vect
|
|
|
|
|
|
2022-05-02 16:38:37 -04:00
|
|
|
|
%default total
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
|
|
|
|
|
2023-01-20 20:34:28 -05:00
|
|
|
|
private %inline
|
2023-02-26 05:01:47 -05:00
|
|
|
|
typeD, arrowD, timesD, lamD, eqndD, dlamD, annD :
|
2023-01-26 13:54:46 -05:00
|
|
|
|
Pretty.HasEnv m => m (Doc HL)
|
2023-02-25 13:14:26 -05:00
|
|
|
|
typeD = hlF Syntax $ ifUnicode "★" "Type"
|
2023-02-25 13:14:11 -05:00
|
|
|
|
arrowD = hlF Syntax $ ifUnicode "→" "->"
|
|
|
|
|
timesD = hlF Syntax $ ifUnicode "×" "**"
|
|
|
|
|
lamD = hlF Syntax $ ifUnicode "λ" "fun"
|
|
|
|
|
eqndD = hlF Syntax $ ifUnicode "≡" "=="
|
|
|
|
|
dlamD = hlF Syntax $ ifUnicode "δ" "dfun"
|
|
|
|
|
annD = hlF Syntax $ ifUnicode "∷" "::"
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
2023-01-20 20:34:28 -05:00
|
|
|
|
private %inline
|
2023-02-26 05:01:47 -05:00
|
|
|
|
eqD, colonD, commaD, dotD, caseD, returnD, ofD : Doc HL
|
2023-01-26 13:54:46 -05:00
|
|
|
|
eqD = hl Syntax "Eq"
|
|
|
|
|
colonD = hl Syntax ":"
|
|
|
|
|
commaD = hl Syntax ","
|
2023-02-26 05:01:47 -05:00
|
|
|
|
dotD = hl Delim "."
|
2023-01-26 13:54:46 -05:00
|
|
|
|
caseD = hl Syntax "case"
|
|
|
|
|
ofD = hl Syntax "of"
|
|
|
|
|
returnD = hl Syntax "return"
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
2023-02-13 16:05:27 -05:00
|
|
|
|
|
2023-02-22 01:40:19 -05:00
|
|
|
|
export covering
|
|
|
|
|
prettyBindType : Pretty.HasEnv m =>
|
|
|
|
|
PrettyHL q => PrettyHL a => PrettyHL b =>
|
|
|
|
|
List q -> BaseName -> a -> Doc HL -> b -> m (Doc HL)
|
|
|
|
|
prettyBindType qtys x s arr t =
|
|
|
|
|
parensIfM Outer $ hang 2 $
|
|
|
|
|
parens !(prettyQtyBinds qtys $ TV x) <++> arr
|
|
|
|
|
<//> !(under T x $ prettyM t)
|
|
|
|
|
|
|
|
|
|
export covering
|
|
|
|
|
prettyLams : Pretty.HasEnv m => PrettyHL a =>
|
|
|
|
|
BinderSort -> List BaseName -> a -> m (Doc HL)
|
|
|
|
|
prettyLams sort names body = do
|
|
|
|
|
lam <- case sort of T => lamD; D => dlamD
|
2023-02-26 05:01:47 -05:00
|
|
|
|
header <- sequence $ [hl TVar <$> prettyM x | x <- names]
|
2023-02-22 01:40:19 -05:00
|
|
|
|
body <- unders sort names $ prettyM body
|
2023-02-26 05:01:47 -05:00
|
|
|
|
parensIfM Outer $ (sep (lam :: header) <+> dotD) <//> body
|
2023-02-22 01:40:19 -05:00
|
|
|
|
|
|
|
|
|
export covering
|
|
|
|
|
prettyApps : Pretty.HasEnv m => PrettyHL f => PrettyHL a =>
|
|
|
|
|
f -> List a -> m (Doc HL)
|
|
|
|
|
prettyApps fun args =
|
|
|
|
|
parensIfM App =<< withPrec Arg
|
|
|
|
|
[|prettyM fun <//> (align . sep <$> traverse prettyM args)|]
|
|
|
|
|
|
|
|
|
|
export covering
|
|
|
|
|
prettyTuple : Pretty.HasEnv m => PrettyHL a => List a -> m (Doc HL)
|
|
|
|
|
prettyTuple = map (parens . align . separate commaD) . traverse prettyM
|
|
|
|
|
|
|
|
|
|
export covering
|
|
|
|
|
prettyArm : Pretty.HasEnv m => PrettyHL a =>
|
|
|
|
|
(List BaseName, Doc HL, a) -> m (Doc HL)
|
|
|
|
|
prettyArm (xs, pat, body) =
|
|
|
|
|
pure $ hang 2 $ sep
|
2023-02-26 05:01:47 -05:00
|
|
|
|
[pat <+> dotD, !(withPrec Outer $ unders T xs $ prettyM body)]
|
2023-02-22 01:40:19 -05:00
|
|
|
|
|
|
|
|
|
export covering
|
|
|
|
|
prettyArms : Pretty.HasEnv m => PrettyHL a =>
|
|
|
|
|
List (List BaseName, Doc HL, a) -> m (Doc HL)
|
|
|
|
|
prettyArms = map (braces . align . sep) . traverse prettyArm
|
|
|
|
|
|
|
|
|
|
export covering
|
|
|
|
|
prettyCase : Pretty.HasEnv m =>
|
|
|
|
|
PrettyHL q => PrettyHL a => PrettyHL b => PrettyHL c =>
|
|
|
|
|
q -> a -> BaseName -> b -> List (List BaseName, Doc HL, c) ->
|
|
|
|
|
m (Doc HL)
|
|
|
|
|
prettyCase pi elim r ret arms =
|
|
|
|
|
pure $ align $ sep $
|
|
|
|
|
[hsep [caseD, !(prettyQtyBinds [pi] elim)],
|
2023-02-26 05:01:47 -05:00
|
|
|
|
hsep [returnD, !(prettyM r) <+> dotD, !(under T r $ prettyM ret)],
|
2023-02-22 01:40:19 -05:00
|
|
|
|
hsep [ofD, !(prettyArms arms)]]
|
|
|
|
|
|
2023-02-22 01:45:10 -05:00
|
|
|
|
-- [fixme] put delimiters around tags that aren't simple names
|
|
|
|
|
export
|
|
|
|
|
prettyTag : TagVal -> Doc HL
|
|
|
|
|
prettyTag t = hl Tag $ "`" <+> fromString t
|
|
|
|
|
|
2023-02-22 01:40:19 -05:00
|
|
|
|
|
2022-04-23 18:21:30 -04:00
|
|
|
|
mutual
|
|
|
|
|
export covering
|
2023-01-08 14:44:25 -05:00
|
|
|
|
PrettyHL q => PrettyHL (Term q d n) where
|
2022-04-23 18:21:30 -04:00
|
|
|
|
prettyM (TYPE l) =
|
2023-02-25 13:14:26 -05:00
|
|
|
|
parensIfM App $ !typeD <//> !(withPrec Arg $ prettyM l)
|
2023-02-22 01:40:19 -05:00
|
|
|
|
prettyM (Pi qty s (S [x] t)) =
|
2023-01-26 13:54:46 -05:00
|
|
|
|
prettyBindType [qty] x s !arrowD t
|
2023-02-22 01:40:19 -05:00
|
|
|
|
prettyM (Lam (S x t)) =
|
|
|
|
|
let GotLams {names, body, _} = getLams' x t.term Refl in
|
2023-01-20 20:34:28 -05:00
|
|
|
|
prettyLams T (toList names) body
|
2023-02-22 01:40:19 -05:00
|
|
|
|
prettyM (Sig s (S [x] t)) =
|
|
|
|
|
prettyBindType {q} [] x s !timesD t
|
2023-01-26 13:54:46 -05:00
|
|
|
|
prettyM (Pair s t) =
|
|
|
|
|
let GotPairs {init, last, _} = getPairs t in
|
|
|
|
|
prettyTuple $ s :: init ++ [last]
|
2023-02-22 01:45:10 -05:00
|
|
|
|
prettyM (Enum tags) =
|
|
|
|
|
pure $ braces . aseparate comma $ map prettyTag $ Prelude.toList tags
|
|
|
|
|
prettyM (Tag t) =
|
|
|
|
|
pure $ prettyTag t
|
2023-02-22 01:40:19 -05:00
|
|
|
|
prettyM (Eq (S _ (N ty)) l r) =
|
2023-01-20 20:34:28 -05:00
|
|
|
|
parensIfM Eq !(withPrec InEq $ pure $
|
2023-02-22 01:40:19 -05:00
|
|
|
|
sep [!(prettyM l) <++> !eqndD,
|
|
|
|
|
!(prettyM r) <++> colonD, !(prettyM ty)])
|
|
|
|
|
prettyM (Eq (S [i] (Y ty)) l r) =
|
2023-01-20 20:34:28 -05:00
|
|
|
|
parensIfM App $
|
|
|
|
|
eqD <++>
|
|
|
|
|
sep [bracks !(withPrec Outer $ pure $ hang 2 $
|
2023-02-26 05:01:47 -05:00
|
|
|
|
sep [hl DVar !(prettyM i) <+> dotD,
|
2023-01-20 20:34:28 -05:00
|
|
|
|
!(under D i $ prettyM ty)]),
|
|
|
|
|
!(withPrec Arg $ prettyM l),
|
|
|
|
|
!(withPrec Arg $ prettyM r)]
|
2023-02-22 01:40:19 -05:00
|
|
|
|
prettyM (DLam (S i t)) =
|
|
|
|
|
let GotDLams {names, body, _} = getDLams' i t.term Refl in
|
2023-01-20 20:34:28 -05:00
|
|
|
|
prettyLams D (toList names) body
|
|
|
|
|
prettyM (E e) = bracks <$> prettyM e
|
2022-04-23 18:21:30 -04:00
|
|
|
|
prettyM (CloT s th) =
|
|
|
|
|
parensIfM SApp . hang 2 =<<
|
|
|
|
|
[|withPrec SApp (prettyM s) </> prettyTSubst th|]
|
|
|
|
|
prettyM (DCloT s th) =
|
|
|
|
|
parensIfM SApp . hang 2 =<<
|
|
|
|
|
[|withPrec SApp (prettyM s) </> prettyDSubst th|]
|
|
|
|
|
|
|
|
|
|
export covering
|
2023-01-08 14:44:25 -05:00
|
|
|
|
PrettyHL q => PrettyHL (Elim q d n) where
|
2022-04-23 18:21:30 -04:00
|
|
|
|
prettyM (F x) =
|
|
|
|
|
hl' Free <$> prettyM x
|
|
|
|
|
prettyM (B i) =
|
|
|
|
|
prettyVar TVar TVarErr (!ask).tnames i
|
|
|
|
|
prettyM (e :@ s) =
|
2023-01-20 20:34:28 -05:00
|
|
|
|
let GotArgs {fun, args, _} = getArgs' e [s] in
|
|
|
|
|
prettyApps fun args
|
2023-02-22 01:40:19 -05:00
|
|
|
|
prettyM (CasePair pi p (S [r] ret) (S [x, y] body)) = do
|
2023-01-26 13:54:46 -05:00
|
|
|
|
pat <- (parens . separate commaD . map (hl TVar)) <$>
|
|
|
|
|
traverse prettyM [x, y]
|
|
|
|
|
prettyCase pi p r ret [([x, y], pat, body)]
|
2023-02-22 01:45:10 -05:00
|
|
|
|
prettyM (CaseEnum pi t (S [r] ret) arms) =
|
|
|
|
|
prettyCase pi t r ret
|
|
|
|
|
[([], prettyTag t, b) | (t, b) <- SortedMap.toList arms]
|
2023-01-20 20:34:28 -05:00
|
|
|
|
prettyM (e :% d) =
|
|
|
|
|
let GotDArgs {fun, args, _} = getDArgs' e [d] in
|
|
|
|
|
prettyApps fun args
|
2022-04-23 18:21:30 -04:00
|
|
|
|
prettyM (s :# a) =
|
|
|
|
|
parensIfM Ann $ hang 2 $
|
|
|
|
|
!(withPrec AnnL $ prettyM s) <++> !annD
|
|
|
|
|
<//> !(withPrec Ann $ prettyM a)
|
|
|
|
|
prettyM (CloE e th) =
|
|
|
|
|
parensIfM SApp . hang 2 =<<
|
|
|
|
|
[|withPrec SApp (prettyM e) </> prettyTSubst th|]
|
|
|
|
|
prettyM (DCloE e th) =
|
|
|
|
|
parensIfM SApp . hang 2 =<<
|
|
|
|
|
[|withPrec SApp (prettyM e) </> prettyDSubst th|]
|
|
|
|
|
|
|
|
|
|
export covering
|
2023-02-22 01:40:19 -05:00
|
|
|
|
{s : Nat} -> PrettyHL q => PrettyHL (ScopedBody s (Term q d) n) where
|
2023-01-20 20:34:28 -05:00
|
|
|
|
prettyM body = prettyM body.term
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
|
|
|
|
export covering
|
2023-01-08 14:44:25 -05:00
|
|
|
|
prettyTSubst : Pretty.HasEnv m => PrettyHL q =>
|
|
|
|
|
TSubst q d from to -> m (Doc HL)
|
2022-04-23 18:21:30 -04:00
|
|
|
|
prettyTSubst s = prettySubstM prettyM (!ask).tnames TVar "[" "]" s
|