1
1
export fold;
2
2
export fold_crate, fold_mod, fold_fn, fold_modlist, fold_fnlist;
3
3
export default_seq_fold;
4
+ export default_seq_fold_fn;
4
5
5
- tag fold = t;
6
+ tag fold< T > = t< T > ;
6
7
7
- type fold_crate = fn ~( fold : fold , doc : doc:: cratedoc ) -> doc:: cratedoc ;
8
- type fold_mod = fn ~( fold : fold , doc : doc:: moddoc ) -> doc:: moddoc ;
9
- type fold_fn = fn ~( fold : fold , doc : doc:: fndoc ) -> doc:: fndoc ;
10
- type fold_modlist = fn ~( fold : fold , list : doc:: modlist ) -> doc:: modlist ;
11
- type fold_fnlist = fn ~( fold : fold , list : doc:: fnlist ) -> doc:: fnlist ;
8
+ type fold_crate < T > = fn ~(
9
+ fold : fold < T > ,
10
+ doc : doc:: cratedoc
11
+ ) -> doc:: cratedoc ;
12
+
13
+ type fold_mod < T > = fn ~(
14
+ fold : fold < T > ,
15
+ doc : doc:: moddoc
16
+ ) -> doc:: moddoc ;
17
+
18
+ type fold_fn < T > = fn ~(
19
+ fold : fold < T > ,
20
+ doc : doc:: fndoc
21
+ ) -> doc:: fndoc ;
22
+
23
+ type fold_modlist < T > = fn ~(
24
+ fold : fold < T > ,
25
+ list : doc:: modlist
26
+ ) -> doc:: modlist ;
27
+
28
+ type fold_fnlist < T > = fn ~(
29
+ fold : fold < T > ,
30
+ list : doc:: fnlist
31
+ ) -> doc:: fnlist ;
12
32
13
- type t = {
14
- fold_crate : fold_crate ,
15
- fold_mod : fold_mod ,
16
- fold_fn : fold_fn ,
17
- fold_modlist : fold_modlist ,
18
- fold_fnlist : fold_fnlist
33
+ type t < T > = {
34
+ ctxt : T ,
35
+ fold_crate : fold_crate < T > ,
36
+ fold_mod : fold_mod < T > ,
37
+ fold_fn : fold_fn < T > ,
38
+ fold_modlist : fold_modlist < T > ,
39
+ fold_fnlist : fold_fnlist < T >
19
40
} ;
20
41
21
42
22
43
// This exists because fn types don't infer correctly as record
23
44
// initializers, but they do as function arguments
24
- fn mk_fold (
25
- fold_crate : fold_crate ,
26
- fold_mod : fold_mod ,
27
- fold_fn : fold_fn ,
28
- fold_modlist : fold_modlist ,
29
- fold_fnlist : fold_fnlist
30
- ) -> fold {
45
+ fn mk_fold < T : copy > (
46
+ ctxt : T ,
47
+ fold_crate : fold_crate < T > ,
48
+ fold_mod : fold_mod < T > ,
49
+ fold_fn : fold_fn < T > ,
50
+ fold_modlist : fold_modlist < T > ,
51
+ fold_fnlist : fold_fnlist < T >
52
+ ) -> fold < T > {
31
53
fold ( {
54
+ ctxt: ctxt,
32
55
fold_crate: fold_crate,
33
56
fold_mod: fold_mod,
34
57
fold_fn: fold_fn,
@@ -37,27 +60,28 @@ fn mk_fold(
37
60
} )
38
61
}
39
62
40
- fn default_seq_fold ( ) -> fold {
63
+ fn default_seq_fold < T : copy > ( ctxt : T ) -> fold < T > {
41
64
mk_fold (
42
- default_seq_fold_crate,
43
- default_seq_fold_mod,
44
- default_seq_fold_fn,
45
- default_seq_fold_modlist,
46
- default_seq_fold_fnlist
65
+ ctxt,
66
+ { |f, d| default_seq_fold_crate ( f, d) } ,
67
+ { |f, d| default_seq_fold_mod ( f, d) } ,
68
+ { |f, d| default_seq_fold_fn ( f, d) } ,
69
+ { |f, d| default_seq_fold_modlist ( f, d) } ,
70
+ { |f, d| default_seq_fold_fnlist ( f, d) }
47
71
)
48
72
}
49
73
50
- fn default_seq_fold_crate (
51
- fold : fold ,
74
+ fn default_seq_fold_crate < T > (
75
+ fold : fold < T > ,
52
76
doc : doc:: cratedoc
53
77
) -> doc:: cratedoc {
54
78
~{
55
79
topmod: fold. fold_mod ( fold, doc. topmod )
56
80
}
57
81
}
58
82
59
- fn default_seq_fold_mod (
60
- fold : fold ,
83
+ fn default_seq_fold_mod < T > (
84
+ fold : fold < T > ,
61
85
doc : doc:: moddoc
62
86
) -> doc:: moddoc {
63
87
~{
@@ -67,24 +91,24 @@ fn default_seq_fold_mod(
67
91
}
68
92
}
69
93
70
- fn default_seq_fold_fn (
71
- _fold : fold ,
94
+ fn default_seq_fold_fn < T > (
95
+ _fold : fold < T > ,
72
96
doc : doc:: fndoc
73
97
) -> doc:: fndoc {
74
98
doc
75
99
}
76
100
77
- fn default_seq_fold_modlist (
78
- fold : fold ,
101
+ fn default_seq_fold_modlist < T > (
102
+ fold : fold < T > ,
79
103
list : doc:: modlist
80
104
) -> doc:: modlist {
81
105
doc:: modlist ( vec:: map ( * list) { |doc|
82
106
fold. fold_mod ( fold, doc)
83
107
} )
84
108
}
85
109
86
- fn default_seq_fold_fnlist (
87
- fold : fold ,
110
+ fn default_seq_fold_fnlist < T > (
111
+ fold : fold < T > ,
88
112
list : doc:: fnlist
89
113
) -> doc:: fnlist {
90
114
doc:: fnlist ( vec:: map ( * list) { |doc|
@@ -99,7 +123,7 @@ mod tests {
99
123
let source = "mod a { fn b() { } mod c { fn d() { } } }" ;
100
124
let ast = parse:: from_str ( source) ;
101
125
let doc = extract:: extract ( ast, "" ) ;
102
- let fld = default_seq_fold ( ) ;
126
+ let fld = default_seq_fold ( ( ) ) ;
103
127
let folded = fld. fold_crate ( fld, doc) ;
104
128
assert doc == folded;
105
129
}
0 commit comments