module Bag:A bag is a data structure like a set, except that:sig
..end
* It doesn't require anything (hashable, comparable) of elements in the bag.
* Duplicates are allowed.
* Addition and removal are (amortized) constant time.
module Elt:sig
..end
type 'a
t
include Container.S1
val invariant : 'a t -> unit
val create : unit -> 'a t
create ()
returns an empty bag.val add : 'a t -> 'a -> 'a Elt.t
add t v
adds v
to the bag t
, returning an element that can later be
removed from the bag. add
runs in (amortized) constant time.val remove : 'a t -> 'a Elt.t -> unit
remove t elt
removes elt
from the bag t
, raising an exception if elt
is not in the bag. remove
runs in (amortized) constant time.val some_elt : 'a t -> 'a Elt.t option
some_elt t
returns some element in the bag.val remove_one : 'a t -> 'a option
remove_one t
removes some element from the bag, and returns its value.
remove_one
runs in (amortized) constant time.val clear : 'a t -> unit
clear t
removes all elements from the bag. clear
runs in O(length t
)
time.val find_elt : 'a t -> f:('a -> bool) -> 'a Elt.t option
find_elt t ~f
looks at elements in the bag one-by-one until it finds one
elt
such that f (Elt.value elt)
, in which case it returns Some elt
.
If there is no element satisfying f
, then find_elt
returns None
.val until_empty : 'a t -> ('a -> unit) -> unit
until_empty t f
repeatedly removes a value v
from t
and runs f v
,
continuing until t
is empty. Running f
may add elements to t
if it
wants.val sexp_of_t : ('a -> Std_internal.Sexp.t) -> 'a t -> Std_internal.Sexp.t