/
fmt.tao
84 lines (64 loc) · 1.88 KB
/
fmt.tao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#! Utilities for formatting and displaying data.
import "type.tao"
import "str.tao"
# Debug
class Debug =
=> debug : Self -> Str
$[util]
def debug A < Debug : A -> Str = A.debug
member Bool of Debug =
=> debug = fn
| True => "True"
\ False => "False"
for A < Debug member [A] of Debug =
=> debug = fn xs => dispatch(
xs,
# Specialise on [Char]
fn s : Str => "\"" ++ s ++ "\"",
# Fallback for [A]
fn xs => "[" ++ xs -> fix(fn
| _, [] => ""
| _, [x] => x -> debug
\ rec, [x .. xs] => x -> debug ++ ", " ++ xs -> rec) ++ "]",
)
member Char of Debug =
=> debug = fn c => "'" ++ [c] ++ "'"
member Nat of Debug =
=> debug = fn x => @display_int(--x)
member () of Debug =
=> debug = fn () => "()"
for A < Debug, B < Debug member (A, B) of Debug =
=> debug = fn (a, b) => "(" ++ A.debug(a) ++ ", " ++ B.debug(b) ++ ")"
for A < Debug member Maybe A of Debug =
=> debug = fn
| None => "None"
\ Just a => "Some " + a->debug
# TODO: Reenable this when conflict with Str is resolved!
#for A < Debug member [A] of Debug =
# => debug = fn xs => "[" ++ xs->fold("", fn s, x => s ++ ", " ++ x->A.debug) ++ "]"
# Show
class Show =
=> show : Self -> Str
$[util]
def show A < Show : A -> Str = A.show
for A < Show member [A] of Show =
=> show = fn xs => dispatch(
xs,
# Specialise on [Char]
fn s => s,
# Fallback for [A]
fn xs => xs -> fix(fn
| _, [] => ""
| _, [x] => x -> show
\ rec, [x .. xs] => x -> show ++ ", " ++ xs -> rec),
)
member Nat of Show =
=> show = fn x => @display_int(--x)
member Int of Show =
=> show = fn x => @display_int(x)
member Bool of Show =
=> show = fn
| True => "true"
\ False => "false"
member Char of Show =
=> show = fn c => [c]