X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fhlist.ml;h=4434e1e9d71857f7d8e0fb659416734f7d85edc9;hb=4bbc27978a8e7d36b9d8c47f8b4dd0cf7b654fc6;hp=300c6a1a75946b59c3166bf52a111958058a0bbe;hpb=4b52da1a20a4fe031930bb96d2ca46bec06dc529;p=SXSI%2Fxpathcomp.git diff --git a/src/hlist.ml b/src/hlist.ml index 300c6a1..4434e1e 100644 --- a/src/hlist.ml +++ b/src/hlist.ml @@ -18,7 +18,7 @@ module type S = sig val equal : t -> t -> bool val nil : t val node : t -> t node - val cons : elt -> t -> t + val cons : ?sorted:bool -> elt -> t -> t val hd : t -> elt val tl : t -> t val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a @@ -58,13 +58,19 @@ struct let nil = Node.make Nil (* doing sorted insertion allows to make better use of hash consing *) - let rec cons e l = + let rec sorted_cons e l = match l.Node.node with | Nil -> Node.make (Cons(e, l)) | Cons (x, ll) -> if H.uid e < H.uid x then Node.make (Cons(e, l)) - else Node.make (Cons(x, cons e ll)) + else Node.make (Cons(x, sorted_cons e ll)) + + let cons e l = + Node.make(Cons(e, l)) + + let cons ?(sorted=true) e l = + if sorted then sorted_cons e l else cons e l let hd = function { Node.node = Cons(a,_) } -> a | _ -> failwith "hd" let tl = function { Node.node = Cons(_,a) } -> a | _ -> failwith "tl"