mirror of
https://github.com/c-cube/sidekick.git
synced 2025-12-06 19:25:36 -05:00
feat(term): util for post-order DAG traversal
This commit is contained in:
parent
a2c397f1e5
commit
d195a2fa87
1 changed files with 13 additions and 6 deletions
|
|
@ -799,10 +799,12 @@ module Term : sig
|
||||||
|
|
||||||
module Iter_dag : sig
|
module Iter_dag : sig
|
||||||
type t
|
type t
|
||||||
|
type order = Pre | Post
|
||||||
val create : unit -> t
|
val create : unit -> t
|
||||||
val iter_dag : t -> term -> term Iter.t
|
val iter_dag : ?order:order -> t -> term -> term Iter.t
|
||||||
end
|
end
|
||||||
|
|
||||||
|
val iter_dag_with : order:Iter_dag.order -> t -> t Iter.t
|
||||||
val iter_dag : t -> t Iter.t
|
val iter_dag : t -> t Iter.t
|
||||||
|
|
||||||
val map_shallow : state -> (t -> t) -> t -> t
|
val map_shallow : state -> (t -> t) -> t -> t
|
||||||
|
|
@ -961,21 +963,26 @@ end = struct
|
||||||
|
|
||||||
module Iter_dag = struct
|
module Iter_dag = struct
|
||||||
type t = unit Tbl.t
|
type t = unit Tbl.t
|
||||||
|
type order = Pre | Post
|
||||||
let create () : t = Tbl.create 16
|
let create () : t = Tbl.create 16
|
||||||
let iter_dag (self:t) t yield =
|
let iter_dag ?(order=Pre) (self:t) t yield =
|
||||||
let rec aux t =
|
let rec aux t =
|
||||||
if not @@ Tbl.mem self t then (
|
if not @@ Tbl.mem self t then (
|
||||||
Tbl.add self t ();
|
Tbl.add self t ();
|
||||||
yield t;
|
|
||||||
Term_cell.iter aux (view t)
|
match order with
|
||||||
|
| Pre -> yield t; Term_cell.iter aux (view t);
|
||||||
|
| Post -> Term_cell.iter aux (view t); yield t
|
||||||
)
|
)
|
||||||
in
|
in
|
||||||
aux t
|
aux t
|
||||||
end
|
end
|
||||||
|
|
||||||
let iter_dag t yield =
|
let iter_dag_with ~order t yield =
|
||||||
let st = Iter_dag.create() in
|
let st = Iter_dag.create() in
|
||||||
Iter_dag.iter_dag st t yield
|
Iter_dag.iter_dag ~order st t yield
|
||||||
|
|
||||||
|
let iter_dag t yield = iter_dag_with ~order:Pre t yield
|
||||||
|
|
||||||
let map_shallow (tst:state) f (t:t) : t =
|
let map_shallow (tst:state) f (t:t) : t =
|
||||||
match view t with
|
match view t with
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue