summaryrefslogtreecommitdiff
path: root/src/Inky/Type
diff options
context:
space:
mode:
authorGreg Brown <greg.brown01@ed.ac.uk>2024-09-13 15:17:52 +0100
committerGreg Brown <greg.brown01@ed.ac.uk>2024-09-13 15:17:52 +0100
commit33fc608bf9e44e814ba594c8a5d8294572966cbc (patch)
treed5b8d724e84368adca69b81f97087f997e286c38 /src/Inky/Type
parentd10ca1c8b2d6b2b8a5179b4ce2e9c6da1320b29a (diff)
Define pretty printers for terms and types.
Diffstat (limited to 'src/Inky/Type')
-rw-r--r--src/Inky/Type/Pretty.idr73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/Inky/Type/Pretty.idr b/src/Inky/Type/Pretty.idr
new file mode 100644
index 0000000..074d86e
--- /dev/null
+++ b/src/Inky/Type/Pretty.idr
@@ -0,0 +1,73 @@
+module Inky.Type.Pretty
+
+import Data.Fin
+import Data.Fin.Extra
+import Data.List
+import Data.String
+import Inky.Type
+import Text.PrettyPrint.Prettyprinter
+
+asTyChar : Fin 6 -> Char
+asTyChar = index' ['X', 'Y', 'Z', 'A', 'B', 'C']
+
+export
+typeName : Nat -> String
+typeName n with (divMod n 6)
+ typeName _ | Fraction _ 6 q r Refl =
+ strSnoc
+ (if q == 0 then "'" else assert_total (typeName $ pred q))
+ (asTyChar r)
+
+arrowPrec, unionPrec, prodPrec, sumPrec, fixPrec : Prec
+arrowPrec = Open
+unionPrec = User 2
+prodPrec = Open
+sumPrec = User 1
+fixPrec = Open
+
+export
+prettyType : {ty : Nat} -> Ty ty -> Prec -> Doc ann
+prettyTypeAll : {ty : Nat} -> List (Ty ty) -> Prec -> List (Doc ann)
+prettyTypeAll1 : {ty : Nat} -> List1 (Ty ty) -> Prec -> List (Doc ann)
+
+prettyType (TVar i) d = pretty (typeName $ finToNat i)
+prettyType TNat d = pretty "Nat"
+prettyType (TArrow a b) d =
+ parenthesise (d > arrowPrec) $ group $ align $ hang 2 $
+ let parts = stripArrow b in
+ concatWith (\x, y => x <++> "->" <+> line <+> y) (prettyType a arrowPrec :: parts)
+ where
+ stripArrow : Ty ty -> List (Doc ann)
+ stripArrow (TArrow a b) = prettyType a arrowPrec :: stripArrow b
+ stripArrow a = [prettyType a arrowPrec]
+prettyType (TUnion (a ::: [])) d =
+ parens $ group $ align $ hang 2 $
+ prettyType a unionPrec <++> "&"
+prettyType (TUnion as) d =
+ parenthesise (d >= unionPrec) $ group $ align $ hang 2 $
+ let parts = prettyTypeAll1 as unionPrec in
+ concatWith (\x, y => x <++> "&" <+> line <+> y) parts
+prettyType (TProd [a]) d =
+ parens $ group $ align $ hang 2 $
+ prettyType a prodPrec <++> ","
+prettyType (TProd as) d =
+ parens $ group $ align $ hang 2 $
+ let parts = prettyTypeAll as prodPrec in
+ concatWith (\x, y => x <++> "," <+> line <+> y) parts
+prettyType (TSum []) d = "(+)"
+prettyType (TSum [a]) d =
+ parens $ group $ align $ hang 2 $
+ prettyType a sumPrec <++> "+"
+prettyType (TSum as) d =
+ parenthesise (d >= sumPrec) $ group $ align $ hang 2 $
+ let parts = prettyTypeAll as sumPrec in
+ concatWith (\x, y => x <++> "+" <+> line <+> y) parts
+prettyType (TFix a) d =
+ parens $ group $ align $ hang 2 $
+ "\\" <+> pretty (typeName ty) <++> "=>" <+> line <+>
+ prettyType a fixPrec
+
+prettyTypeAll [] d = []
+prettyTypeAll (a :: as) d = prettyType a d :: prettyTypeAll as d
+
+prettyTypeAll1 (a ::: as) d = prettyType a d :: prettyTypeAll as d