1
+ export fold;
2
+ export fold_crate, fold_mod, fold_fn, fold_modlist, fold_fnlist;
3
+ export default_seq_fold;
4
+
5
+ tag fold = t;
6
+
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 ;
12
+
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
19
+ } ;
20
+
21
+
22
+ // This exists because fn types don't infer correctly as record
23
+ // 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 {
31
+ fold ( {
32
+ fold_crate: fold_crate,
33
+ fold_mod: fold_mod,
34
+ fold_fn: fold_fn,
35
+ fold_modlist: fold_modlist,
36
+ fold_fnlist: fold_fnlist
37
+ } )
38
+ }
39
+
40
+ fn default_seq_fold ( ) -> fold {
41
+ 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
47
+ )
48
+ }
49
+
50
+ fn default_seq_fold_crate (
51
+ fold : fold ,
52
+ doc : doc:: cratedoc
53
+ ) -> doc:: cratedoc {
54
+ ~{
55
+ topmod: fold. fold_mod ( fold, doc. topmod )
56
+ }
57
+ }
58
+
59
+ fn default_seq_fold_mod (
60
+ fold : fold ,
61
+ doc : doc:: moddoc
62
+ ) -> doc:: moddoc {
63
+ ~{
64
+ name: doc. name ,
65
+ mods: fold. fold_modlist ( fold, doc. mods ) ,
66
+ fns: fold. fold_fnlist ( fold, doc. fns )
67
+ }
68
+ }
69
+
70
+ fn default_seq_fold_fn (
71
+ _fold : fold ,
72
+ doc : doc:: fndoc
73
+ ) -> doc:: fndoc {
74
+ doc
75
+ }
76
+
77
+ fn default_seq_fold_modlist (
78
+ fold : fold ,
79
+ list : doc:: modlist
80
+ ) -> doc:: modlist {
81
+ doc:: modlist ( vec:: map ( * list) { |doc|
82
+ fold. fold_mod ( fold, doc)
83
+ } )
84
+ }
85
+
86
+ fn default_seq_fold_fnlist (
87
+ fold : fold ,
88
+ list : doc:: fnlist
89
+ ) -> doc:: fnlist {
90
+ doc:: fnlist ( vec:: map ( * list) { |doc|
91
+ fold. fold_fn ( fold, doc)
92
+ } )
93
+ }
94
+
95
+ #[ cfg( test) ]
96
+ mod tests {
97
+ #[ test]
98
+ fn default_fold_should_produce_same_doc ( ) {
99
+ let source = "mod a { fn b() { } mod c { fn d() { } } }" ;
100
+ let ast = parse:: from_str ( source) ;
101
+ let doc = extract:: extract ( ast, "" ) ;
102
+ let fld = default_seq_fold ( ) ;
103
+ let folded = fld. fold_crate ( fld, doc) ;
104
+ assert doc == folded;
105
+ }
106
+ }
0 commit comments