diff --git a/src/core/CCHeap.ml b/src/core/CCHeap.ml index dbd04824..5aefb2f8 100644 --- a/src/core/CCHeap.ml +++ b/src/core/CCHeap.ml @@ -89,21 +89,11 @@ module type S = sig (** {2 Conversions} *) - val to_list : t -> elt list - (** Return the elements of the heap, in no particular order. *) - - val to_list_sorted : t -> elt list - (** Return the elements in increasing order. - @since 1.1 *) - val add_list : t -> elt list -> t (** Add the elements of the list to the heap. An element occurring several times will be added that many times to the heap. @since 0.16 *) - val of_list : elt list -> t - (** [of_list l] is [add_list empty l]. Complexity: [O(n log n)]. *) - val add_iter : t -> elt iter -> t (** Like {!add_list}. @since 2.8 *) @@ -112,6 +102,12 @@ module type S = sig (** Like {!add_list}. @since 2.8 *) + val add_gen : t -> elt gen -> t + (** @since 0.16 *) + + val of_list : elt list -> t + (** [of_list l] is [add_list empty l]. Complexity: [O(n log n)]. *) + val of_iter : elt iter -> t (** Build a heap from a given [iter]. Complexity: [O(n log n)]. @since 2.8 *) @@ -120,6 +116,12 @@ module type S = sig (** Build a heap from a given [Seq.t]. Complexity: [O(n log n)]. @since 2.8 *) + val of_gen : elt gen -> t + (** Build a heap from a given [gen]. Complexity: [O(n log n)]. *) + + val to_list : t -> elt list + (** Return the elements of the heap, in no particular order. *) + val to_iter : t -> elt iter (** Return a [iter] of the elements of the heap. @since 2.8 *) @@ -128,6 +130,13 @@ module type S = sig (** Return a [Seq.t] of the elements of the heap. @since 2.8 *) + val to_gen : t -> elt gen + (** Return a [gen] of the elements of the heap. *) + + val to_list_sorted : t -> elt list + (** Return the elements in increasing order. + @since 1.1 *) + val to_iter_sorted : t -> elt iter (** Iterate on the elements, in increasing order. @since 2.8 *) @@ -136,15 +145,6 @@ module type S = sig (** Iterate on the elements, in increasing order. @since 2.8 *) - val add_gen : t -> elt gen -> t - (** @since 0.16 *) - - val of_gen : elt gen -> t - (** Build a heap from a given [gen]. Complexity: [O(n log n)]. *) - - val to_gen : t -> elt gen - (** Return a [gen] of the elements of the heap. *) - val to_tree : t -> elt ktree (** Return a [ktree] of the elements of the heap. *) @@ -283,24 +283,7 @@ module Make (E : PARTIAL_ORD) : S with type elt = E.t = struct (** {2 Conversions} *) - let to_list h = - let rec aux acc h = - match h with - | E -> acc - | N (_, x, l, r) -> x :: aux (aux acc l) r - in - aux [] h - - let to_list_sorted heap = - let rec recurse acc h = - match take h with - | None -> List.rev acc - | Some (h', x) -> recurse (x :: acc) h' - in - recurse [] heap - let add_list h l = List.fold_left add h l - let of_list l = add_list empty l let add_iter h i = let h = ref h in @@ -312,8 +295,24 @@ module Make (E : PARTIAL_ORD) : S with type elt = E.t = struct Seq.iter (fun x -> h := insert x !h) seq; !h + let rec add_gen h g = + match g () with + | None -> h + | Some x -> add_gen (add h x) g + + let of_list l = add_list empty l let of_iter i = add_iter empty i let of_seq seq = add_seq empty seq + let of_gen g = add_gen empty g + + let to_list h = + let rec aux acc h = + match h with + | E -> acc + | N (_, x, l, r) -> x :: aux (aux acc l) r + in + aux [] h + let to_iter h k = iter k h let to_seq h = @@ -326,28 +325,6 @@ module Make (E : PARTIAL_ORD) : S with type elt = E.t = struct in aux [ h ] - let to_iter_sorted heap = - let rec recurse h k = - match take h with - | None -> () - | Some (h', x) -> - k x; - recurse h' k - in - fun k -> recurse heap k - - let rec to_seq_sorted h () = - match take h with - | None -> Seq.Nil - | Some (h', x) -> Seq.Cons (x, to_seq_sorted h') - - let rec add_gen h g = - match g () with - | None -> h - | Some x -> add_gen (add h x) g - - let of_gen g = add_gen empty g - let to_gen h = let stack = Stack.create () in Stack.push h stack; @@ -365,6 +342,29 @@ module Make (E : PARTIAL_ORD) : S with type elt = E.t = struct in next + let to_list_sorted heap = + let rec recurse acc h = + match take h with + | None -> List.rev acc + | Some (h', x) -> recurse (x :: acc) h' + in + recurse [] heap + + let to_iter_sorted heap = + let rec recurse h k = + match take h with + | None -> () + | Some (h', x) -> + k x; + recurse h' k + in + fun k -> recurse heap k + + let rec to_seq_sorted h () = + match take h with + | None -> Seq.Nil + | Some (h', x) -> Seq.Cons (x, to_seq_sorted h') + let rec to_tree h () = match h with | E -> `Nil diff --git a/src/core/CCHeap.mli b/src/core/CCHeap.mli index 894a7ad2..fdc4269f 100644 --- a/src/core/CCHeap.mli +++ b/src/core/CCHeap.mli @@ -93,21 +93,11 @@ module type S = sig (** {2 Conversions} *) - val to_list : t -> elt list - (** [to_list h] returns the elements of the heap [h], in no particular order. *) - - val to_list_sorted : t -> elt list - (** [to_list_sorted h] returns the elements of the heap [h] in increasing order. - @since 1.1 *) - val add_list : t -> elt list -> t (** [add_list h l] adds the elements of the list [l] into the heap [h]. An element occurring several times will be added that many times to the heap. @since 0.16 *) - val of_list : elt list -> t - (** [of_list l] is [add_list empty l]. Complexity: [O(n log n)]. *) - val add_iter : t -> elt iter -> t (** [add_iter h iter] is like {!add_list}. @since 2.8 *) @@ -117,6 +107,13 @@ module type S = sig Renamed from [add_std_seq] since 3.0. @since 3.0 *) + val add_gen : t -> elt gen -> t + (** [add_gen h gen] adds the gen [gen] to the heap [h]. + @since 0.16 *) + + val of_list : elt list -> t + (** [of_list l] is [add_list empty l]. Complexity: [O(n log n)]. *) + val of_iter : elt iter -> t (** [of_iter iter] builds a heap from a given [iter]. Complexity: [O(n log n)]. @since 2.8 *) @@ -126,6 +123,12 @@ module type S = sig Renamed from [of_seq] since 3.0. @since 3.0 *) + val of_gen : elt gen -> t + (** [of_gen gen] builds a heap from a given [gen]. Complexity: [O(n log n)]. *) + + val to_list : t -> elt list + (** [to_list h] returns the elements of the heap [h], in no particular order. *) + val to_iter : t -> elt iter (** [to_iter h] returns a [iter] of the elements of the heap [h]. @since 2.8 *) @@ -135,6 +138,13 @@ module type S = sig Renamed from [to_std_seq] since 3.0. @since 3.0 *) + val to_gen : t -> elt gen + (** [to_gen h] returns a [gen] of the elements of the heap [h]. *) + + val to_list_sorted : t -> elt list + (** [to_list_sorted h] returns the elements of the heap [h] in increasing order. + @since 1.1 *) + val to_iter_sorted : t -> elt iter (** [to_iter_sorted h] returns a [iter] by iterating on the elements of [h], in increasing order. @@ -146,16 +156,6 @@ module type S = sig Renamed from [to_std_seq_sorted] since 3.0. @since 3.0 *) - val add_gen : t -> elt gen -> t - (** [add_gen h gen] adds the gen [gen] to the heap [h]. - @since 0.16 *) - - val of_gen : elt gen -> t - (** [of_gen gen] builds a heap from a given [gen]. Complexity: [O(n log n)]. *) - - val to_gen : t -> elt gen - (** [to_gen h] returns a [gen] of the elements of the heap [h]. *) - val to_tree : t -> elt ktree (** [to_tree h] returns a [ktree] of the elements of the heap [h]. *)