]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/bin/xhtbl/fold.ml
update in lambdadelta
[helm.git] / matita / matita / contribs / lambdadelta / bin / xhtbl / fold.ml
1 module T = Table
2
3 type 'a fold_cb = {
4    open_table : 'a -> T.table -> 'a;
5    close_table: 'a -> T.table -> 'a;
6    map_key    : 'a -> T.key -> 'a;
7    open_line  : bool -> 'a -> 'a;
8    close_line : bool -> 'a -> 'a;
9    open_entry : bool -> 'a -> 'a;   
10    close_entry: bool -> 'a -> 'a -> 'a;
11 }
12
13 let map h g f a b = h a (g (f a) b)
14
15 let rec fold_table cb a t =
16    let a = cb.open_table a t in
17    let a = fold_entry cb a t.T.te in
18    cb.close_table a t
19
20 and fold_entry cb a = function
21    | T.Key k        -> cb.map_key a k
22    | T.Line (r, ts) ->
23       let a = cb.open_line r a in
24       let a = List.fold_left (map (cb.close_entry r) (fold_table cb) (cb.open_entry r)) a ts in
25       cb.close_line r a