Module Bag


module Bag: sig .. end
A bag is a data structure like a set, except that: * * - It doesn't require anything (hashable, comparable) of elements in the bag. * - Duplicates are allowed. * - Addition and removal are constant time. * * It is an error to modify a bag (add, remove, remove_one, ...) during iteration * (fold, iter, ...).

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 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 constant time.

some_elt t returns some element in the bag.
val some_elt : 'a t -> 'a Elt.t option
val remove_one : 'a t -> 'a option
remove_one t removes some element from the bag, and returns its value. remove_one runs in constant time.
val clear : 'a t -> unit
clear t removes all elements from the bag. clear runs in O(1) 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