3 | import Prelude.Basics
16 | data Prec = Open | Equal | Dollar | Backtick | User Nat | PrefixMinus | App
21 | precCon : Prec -> Integer
25 | precCon Backtick = 3
26 | precCon (User n) = 4
27 | precCon PrefixMinus = 5
32 | (==) (User m) (User n) = m == n
33 | (==) x y = precCon x == precCon y
37 | compare (User m) (User n) = compare m n
38 | compare x y = compare (precCon x) (precCon y)
43 | interface Show ty where
48 | show : (x : ty) -> String
49 | show x = showPrec Open x
64 | showPrec : (d : Prec) -> (x : ty) -> String
65 | showPrec _ x = show x
70 | showParens : (b : Bool) -> String -> String
71 | showParens False s = s
72 | showParens True s = "(" ++ s ++ ")"
86 | showCon : (d : Prec) -> (conName : String) -> (shownArgs : String) -> String
87 | showCon d conName shownArgs = showParens (d >= App) (conName ++ shownArgs)
94 | public export %tcinline
95 | showArg : Show a => (x : a) -> String
96 | showArg x = " " ++ showPrec App x
98 | firstCharIs : (Char -> Bool) -> String -> Bool
99 | firstCharIs p "" = False
100 | firstCharIs p str = p (assert_total (prim__strHead str))
102 | primNumShow : (a -> String) -> Prec -> a -> String
103 | primNumShow f d x = let str = f x in showParens (d >= PrefixMinus && firstCharIs (== '-') str) str
107 | showPrec = primNumShow prim__cast_IntString
111 | showPrec = primNumShow prim__cast_IntegerString
115 | showPrec = primNumShow prim__cast_Bits8String
119 | showPrec = primNumShow prim__cast_Bits16String
123 | showPrec = primNumShow prim__cast_Bits32String
127 | showPrec = primNumShow prim__cast_Bits64String
131 | showPrec = primNumShow prim__cast_Int8String
135 | showPrec = primNumShow prim__cast_Int16String
139 | showPrec = primNumShow prim__cast_Int32String
143 | showPrec = primNumShow prim__cast_Int64String
147 | showPrec = primNumShow prim__cast_DoubleString
149 | protectEsc : (Char -> Bool) -> String -> String -> String
150 | protectEsc p f s = f ++ (if firstCharIs p s then "\\&" else "") ++ s
152 | showLitChar : Char -> String -> String
153 | showLitChar '\a' = ("\\a" ++)
154 | showLitChar '\b' = ("\\b" ++)
155 | showLitChar '\f' = ("\\f" ++)
156 | showLitChar '\n' = ("\\n" ++)
157 | showLitChar '\r' = ("\\r" ++)
158 | showLitChar '\t' = ("\\t" ++)
159 | showLitChar '\v' = ("\\v" ++)
160 | showLitChar '\SO' = protectEsc (== 'H') "\\SO"
161 | showLitChar '\DEL' = ("\\DEL" ++)
162 | showLitChar '\\' = ("\\\\" ++)
164 | = case getAt (fromInteger (prim__cast_CharInteger c)) asciiTab of
165 | Just k => strCons '\\' . (k ++)
166 | Nothing => if (c > '\DEL')
167 | then strCons '\\' . protectEsc isDigit (show (prim__cast_CharInt c))
170 | asciiTab : List String
172 | = ["NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
173 | "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI",
174 | "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",
175 | "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US"]
177 | showLitString : List Char -> String -> String
178 | showLitString [] = id
179 | showLitString ('"'::cs) = ("\\\"" ++) . showLitString cs
180 | showLitString (c ::cs) = (showLitChar c) . showLitString cs
184 | show '\'' = "'\\''"
185 | show c = strCons '\'' (showLitChar c "'")
189 | show cs = strCons '"' (showLitString (unpack cs) "\"")
193 | show n = show (the Integer (natToInteger n))
198 | show False = "False"
209 | (Show a, Show b) => Show (a, b) where
210 | show (x, y) = "(" ++ show x ++ ", " ++ show y ++ ")"
213 | (Show a, {y : a} -> Show (p y)) => Show (DPair a p) where
214 | show (
y ** prf)
= "(" ++ show y ++ " ** " ++ show prf ++ ")"
217 | Show a => Show (List a) where
218 | show xs = "[" ++ show' "" xs ++ "]"
220 | show' : String -> List a -> String
222 | show' acc [x] = acc ++ show x
223 | show' acc (x :: xs) = show' (acc ++ show x ++ ", ") xs
226 | Show a => Show (Maybe a) where
227 | showPrec d Nothing = "Nothing"
228 | showPrec d (Just x) = showCon d "Just" (showArg x)
231 | (Show a, Show b) => Show (Either a b) where
232 | showPrec d (Left x) = showCon d "Left" $
showArg x
233 | showPrec d (Right x) = showCon d "Right" $
showArg x
236 | Show Ordering where