2012-01-16 16:49:40 -06:00
|
|
|
export fold;
|
|
|
|
export fold_crate, fold_mod, fold_fn, fold_modlist, fold_fnlist;
|
|
|
|
export default_seq_fold;
|
2012-01-18 16:30:48 -06:00
|
|
|
export default_seq_fold_crate;
|
2012-01-18 20:51:04 -06:00
|
|
|
export default_seq_fold_mod;
|
2012-01-16 17:31:49 -06:00
|
|
|
export default_seq_fold_fn;
|
2012-01-17 00:50:00 -06:00
|
|
|
export default_seq_fold_fnlist;
|
2012-01-16 16:49:40 -06:00
|
|
|
|
2012-01-19 18:21:33 -06:00
|
|
|
enum fold<T> = t<T>;
|
2012-01-16 16:49:40 -06:00
|
|
|
|
2012-01-19 02:14:41 -06:00
|
|
|
type fold_crate<T> = fn~(fold: fold<T>, doc: doc::cratedoc) -> doc::cratedoc;
|
|
|
|
type fold_mod<T> = fn~(fold: fold<T>, doc: doc::moddoc) -> doc::moddoc;
|
|
|
|
type fold_fn<T> = fn~(fold: fold<T>, doc: doc::fndoc) -> doc::fndoc;
|
|
|
|
type fold_modlist<T> = fn~(fold: fold<T>,list: doc::modlist) -> doc::modlist;
|
|
|
|
type fold_fnlist<T> = fn~(fold: fold<T>,list: doc::fnlist) -> doc::fnlist;
|
2012-01-16 16:49:40 -06:00
|
|
|
|
2012-01-16 17:31:49 -06:00
|
|
|
type t<T> = {
|
|
|
|
ctxt: T,
|
|
|
|
fold_crate: fold_crate<T>,
|
|
|
|
fold_mod: fold_mod<T>,
|
|
|
|
fold_fn: fold_fn<T>,
|
|
|
|
fold_modlist: fold_modlist<T>,
|
|
|
|
fold_fnlist: fold_fnlist<T>
|
2012-01-16 16:49:40 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// This exists because fn types don't infer correctly as record
|
|
|
|
// initializers, but they do as function arguments
|
2012-01-16 17:31:49 -06:00
|
|
|
fn mk_fold<T:copy>(
|
|
|
|
ctxt: T,
|
|
|
|
fold_crate: fold_crate<T>,
|
|
|
|
fold_mod: fold_mod<T>,
|
|
|
|
fold_fn: fold_fn<T>,
|
|
|
|
fold_modlist: fold_modlist<T>,
|
|
|
|
fold_fnlist: fold_fnlist<T>
|
|
|
|
) -> fold<T> {
|
2012-01-16 16:49:40 -06:00
|
|
|
fold({
|
2012-01-16 17:31:49 -06:00
|
|
|
ctxt: ctxt,
|
2012-01-16 16:49:40 -06:00
|
|
|
fold_crate: fold_crate,
|
|
|
|
fold_mod: fold_mod,
|
|
|
|
fold_fn: fold_fn,
|
|
|
|
fold_modlist: fold_modlist,
|
|
|
|
fold_fnlist: fold_fnlist
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2012-01-16 17:31:49 -06:00
|
|
|
fn default_seq_fold<T:copy>(ctxt: T) -> fold<T> {
|
2012-01-16 16:49:40 -06:00
|
|
|
mk_fold(
|
2012-01-16 17:31:49 -06:00
|
|
|
ctxt,
|
|
|
|
{|f, d| default_seq_fold_crate(f, d)},
|
|
|
|
{|f, d| default_seq_fold_mod(f, d)},
|
|
|
|
{|f, d| default_seq_fold_fn(f, d)},
|
|
|
|
{|f, d| default_seq_fold_modlist(f, d)},
|
|
|
|
{|f, d| default_seq_fold_fnlist(f, d)}
|
2012-01-16 16:49:40 -06:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2012-01-16 17:31:49 -06:00
|
|
|
fn default_seq_fold_crate<T>(
|
|
|
|
fold: fold<T>,
|
2012-01-16 16:49:40 -06:00
|
|
|
doc: doc::cratedoc
|
|
|
|
) -> doc::cratedoc {
|
|
|
|
~{
|
|
|
|
topmod: fold.fold_mod(fold, doc.topmod)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-01-16 17:31:49 -06:00
|
|
|
fn default_seq_fold_mod<T>(
|
|
|
|
fold: fold<T>,
|
2012-01-16 16:49:40 -06:00
|
|
|
doc: doc::moddoc
|
|
|
|
) -> doc::moddoc {
|
|
|
|
~{
|
|
|
|
mods: fold.fold_modlist(fold, doc.mods),
|
|
|
|
fns: fold.fold_fnlist(fold, doc.fns)
|
2012-01-18 20:11:26 -06:00
|
|
|
with *doc
|
2012-01-16 16:49:40 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-01-16 17:31:49 -06:00
|
|
|
fn default_seq_fold_fn<T>(
|
|
|
|
_fold: fold<T>,
|
2012-01-16 16:49:40 -06:00
|
|
|
doc: doc::fndoc
|
|
|
|
) -> doc::fndoc {
|
|
|
|
doc
|
|
|
|
}
|
|
|
|
|
2012-01-16 17:31:49 -06:00
|
|
|
fn default_seq_fold_modlist<T>(
|
|
|
|
fold: fold<T>,
|
2012-01-16 16:49:40 -06:00
|
|
|
list: doc::modlist
|
|
|
|
) -> doc::modlist {
|
|
|
|
doc::modlist(vec::map(*list) {|doc|
|
|
|
|
fold.fold_mod(fold, doc)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2012-01-16 17:31:49 -06:00
|
|
|
fn default_seq_fold_fnlist<T>(
|
|
|
|
fold: fold<T>,
|
2012-01-16 16:49:40 -06:00
|
|
|
list: doc::fnlist
|
|
|
|
) -> doc::fnlist {
|
|
|
|
doc::fnlist(vec::map(*list) {|doc|
|
|
|
|
fold.fold_fn(fold, doc)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
#[test]
|
|
|
|
fn default_fold_should_produce_same_doc() {
|
|
|
|
let source = "mod a { fn b() { } mod c { fn d() { } } }";
|
|
|
|
let ast = parse::from_str(source);
|
|
|
|
let doc = extract::extract(ast, "");
|
2012-01-16 17:31:49 -06:00
|
|
|
let fld = default_seq_fold(());
|
2012-01-16 16:49:40 -06:00
|
|
|
let folded = fld.fold_crate(fld, doc);
|
|
|
|
assert doc == folded;
|
|
|
|
}
|
|
|
|
}
|