Module type Doubly_linked_intf.S
module Elt : sig ... end
val compare : ('a -> 'a -> Core_kernel__.Import.int) -> 'a t -> 'a t -> Core_kernel__.Import.int
include Ppx_sexp_conv_lib.Sexpable.S1 with type 'a t := 'a t
val t_of_sexp : (Sexplib0.Sexp.t -> 'a) -> Sexplib0.Sexp.t -> 'a t
val sexp_of_t : ('a -> Sexplib0.Sexp.t) -> 'a t -> Sexplib0.Sexp.t
include Core_kernel.Container.S1 with type 'a t := 'a t
val mem : 'a t -> 'a -> equal:('a -> 'a -> bool) -> bool
Checks whether the provided element is there, using
equal
.
val length : 'a t -> int
val is_empty : 'a t -> bool
val iter : 'a t -> f:('a -> unit) -> unit
val fold : 'a t -> init:'accum -> f:('accum -> 'a -> 'accum) -> 'accum
fold t ~init ~f
returnsf (... f (f (f init e1) e2) e3 ...) en
, wheree1..en
are the elements oft
val fold_result : 'a t -> init:'accum -> f:('accum -> 'a -> ('accum, 'e) Base.Result.t) -> ('accum, 'e) Base.Result.t
fold_result t ~init ~f
is a short-circuiting version offold
that runs in theResult
monad. Iff
returns anError _
, that value is returned without any additional invocations off
.
val fold_until : 'a t -> init:'accum -> f:('accum -> 'a -> ('accum, 'final) Base__.Container_intf.Continue_or_stop.t) -> finish:('accum -> 'final) -> 'final
fold_until t ~init ~f ~finish
is a short-circuiting version offold
. Iff
returnsStop _
the computation ceases and results in that value. Iff
returnsContinue _
, the fold will proceed. Iff
never returnsStop _
, the final result is computed byfinish
.Example:
type maybe_negative = | Found_negative of int | All_nonnegative of { sum : int } (** [first_neg_or_sum list] returns the first negative number in [list], if any, otherwise returns the sum of the list. *) let first_neg_or_sum = List.fold_until ~init:0 ~f:(fun sum x -> if x < 0 then Stop (Found_negative x) else Continue (sum + x)) ~finish:(fun sum -> All_nonnegative { sum }) ;; let x = first_neg_or_sum [1; 2; 3; 4; 5] val x : maybe_negative = All_nonnegative {sum = 15} let y = first_neg_or_sum [1; 2; -3; 4; 5] val y : maybe_negative = Found_negative -3
val exists : 'a t -> f:('a -> bool) -> bool
Returns
true
if and only if there exists an element for which the provided function evaluates totrue
. This is a short-circuiting operation.
val for_all : 'a t -> f:('a -> bool) -> bool
Returns
true
if and only if the provided function evaluates totrue
for all elements. This is a short-circuiting operation.
val count : 'a t -> f:('a -> bool) -> int
Returns the number of elements for which the provided function evaluates to true.
val sum : (module Base__.Container_intf.Summable with type t = 'sum) -> 'a t -> f:('a -> 'sum) -> 'sum
Returns the sum of
f i
for alli
in the container.
val find : 'a t -> f:('a -> bool) -> 'a option
Returns as an
option
the first element for whichf
evaluates to true.
val find_map : 'a t -> f:('a -> 'b option) -> 'b option
Returns the first evaluation of
f
that returnsSome
, and returnsNone
if there is no such element.
val to_list : 'a t -> 'a list
val to_array : 'a t -> 'a array
val min_elt : 'a t -> compare:('a -> 'a -> int) -> 'a option
Returns a minimum (resp maximum) element from the collection using the provided
compare
function, orNone
if the collection is empty. In case of a tie, the first element encountered while traversing the collection is returned. The implementation usesfold
so it has the same complexity asfold
.
val max_elt : 'a t -> compare:('a -> 'a -> int) -> 'a option
include Core_kernel__.Import.Invariant.S1 with type 'a t := 'a t
val invariant : 'a Base__.Invariant_intf.inv -> 'a t Base__.Invariant_intf.inv
Creating doubly-linked lists
val create : Core_kernel__.Import.unit -> 'a t
val of_list : 'a Core_kernel__.Import.list -> 'a t
of_list l
returns a doubly-linked listt
with the same elements asl
and in the same order (i.e., the first element ofl
is the first element oft
). It is always the case thatl = to_list (of_list l)
.
val of_array : 'a Core_kernel__.Import.array -> 'a t
Predicates
val equal : 'a t -> 'a t -> Core_kernel__.Import.bool
pointer equality
val is_first : 'a t -> 'a Elt.t -> Core_kernel__.Import.bool
val is_last : 'a t -> 'a Elt.t -> Core_kernel__.Import.bool
val mem_elt : 'a t -> 'a Elt.t -> Core_kernel__.Import.bool
Constant-time extraction of first and last elements
val first_elt : 'a t -> 'a Elt.t Core_kernel__.Import.option
val last_elt : 'a t -> 'a Elt.t Core_kernel__.Import.option
val first : 'a t -> 'a Core_kernel__.Import.option
val last : 'a t -> 'a Core_kernel__.Import.option
Constant-time retrieval of next or previous element
val next : 'a t -> 'a Elt.t -> 'a Elt.t Core_kernel__.Import.option
val prev : 'a t -> 'a Elt.t -> 'a Elt.t Core_kernel__.Import.option
Constant-time insertion of a new element
Constant-time move of an element from and to positions in the same list
An exception is raised if elt
is equal to anchor
.
val move_to_front : 'a t -> 'a Elt.t -> Core_kernel__.Import.unit
val move_to_back : 'a t -> 'a Elt.t -> Core_kernel__.Import.unit
val move_after : 'a t -> 'a Elt.t -> anchor:'a Elt.t -> Core_kernel__.Import.unit
val move_before : 'a t -> 'a Elt.t -> anchor:'a Elt.t -> Core_kernel__.Import.unit
Constant-time removal of an element
val remove : 'a t -> 'a Elt.t -> Core_kernel__.Import.unit
val remove_first : 'a t -> 'a Core_kernel__.Import.option
val remove_last : 'a t -> 'a Core_kernel__.Import.option
val iteri : 'a t -> f:(Core_kernel__.Import.int -> 'a -> Core_kernel__.Import.unit) -> Core_kernel__.Import.unit
val foldi : 'a t -> init:'b -> f:(Core_kernel__.Import.int -> 'b -> 'a -> 'b) -> 'b
val fold_elt : 'a t -> init:'b -> f:('b -> 'a Elt.t -> 'b) -> 'b
fold_elt t ~init ~f
is the same as fold, exceptf
is called with the'a Elt.t
's from the list instead of the contained'a
values.Note that like other iteration functions, it is an error to mutate
t
inside the fold. If you'd like to callremove
on any of the'a Elt.t
's, usefilter_inplace
.
val foldi_elt : 'a t -> init:'b -> f:(Core_kernel__.Import.int -> 'b -> 'a Elt.t -> 'b) -> 'b
val iter_elt : 'a t -> f:('a Elt.t -> Core_kernel__.Import.unit) -> Core_kernel__.Import.unit
val iteri_elt : 'a t -> f:(Core_kernel__.Import.int -> 'a Elt.t -> Core_kernel__.Import.unit) -> Core_kernel__.Import.unit
val fold_right : 'a t -> init:'b -> f:('a -> 'b -> 'b) -> 'b
val fold_right_elt : 'a t -> init:'b -> f:('a Elt.t -> 'b -> 'b) -> 'b
val find_elt : 'a t -> f:('a -> Core_kernel__.Import.bool) -> 'a Elt.t Core_kernel__.Import.option
find_elt t ~f
finds the first element int
that satisfiesf
, by testing each of element oft
in turn untilf
succeeds.
val findi_elt : 'a t -> f:(Core_kernel__.Import.int -> 'a -> Core_kernel__.Import.bool) -> (Core_kernel__.Import.int * 'a Elt.t) Core_kernel__.Import.option
val clear : 'a t -> Core_kernel__.Import.unit
clear t
removes all elements from the list in constant time.
val copy : 'a t -> 'a t
val transfer : src:'a t -> dst:'a t -> Core_kernel__.Import.unit
transfer ~src ~dst
has the same behavior asiter src ~f:(insert_last dst); clear src
except that it runs in constant time.If
s = to_list src
andd = to_list dst
, then aftertransfer ~src ~dst
:to_list src = []
to_list dst = d @ s
Linear-time mapping of lists (creates a new list)
val map : 'a t -> f:('a -> 'b) -> 'b t
val mapi : 'a t -> f:(Core_kernel__.Import.int -> 'a -> 'b) -> 'b t
val filter : 'a t -> f:('a -> Core_kernel__.Import.bool) -> 'a t
val filteri : 'a t -> f:(Core_kernel__.Import.int -> 'a -> Core_kernel__.Import.bool) -> 'a t
val filter_map : 'a t -> f:('a -> 'b Core_kernel__.Import.option) -> 'b t
val filter_mapi : 'a t -> f:(Core_kernel__.Import.int -> 'a -> 'b Core_kernel__.Import.option) -> 'b t
Linear-time partition of lists (creates two new lists)
val partition_tf : 'a t -> f:('a -> Core_kernel__.Import.bool) -> 'a t * 'a t
val partitioni_tf : 'a t -> f:(Core_kernel__.Import.int -> 'a -> Core_kernel__.Import.bool) -> 'a t * 'a t
val partition_map : 'a t -> f:('a -> ('b, 'c) Core_kernel.Either.t) -> 'b t * 'c t
val partition_mapi : 'a t -> f:(Core_kernel__.Import.int -> 'a -> ('b, 'c) Core_kernel.Either.t) -> 'b t * 'c t
Linear-time in-place mapping of lists
val map_inplace : 'a t -> f:('a -> 'a) -> Core_kernel__.Import.unit
map_inplace t ~f
replaces all valuesv
withf v
val mapi_inplace : 'a t -> f:(Core_kernel__.Import.int -> 'a -> 'a) -> Core_kernel__.Import.unit
val filter_inplace : 'a t -> f:('a -> Core_kernel__.Import.bool) -> Core_kernel__.Import.unit
filter_inplace t ~f
removes all elements oft
that don't satisfyf
.
val filteri_inplace : 'a t -> f:(Core_kernel__.Import.int -> 'a -> Core_kernel__.Import.bool) -> Core_kernel__.Import.unit
val filter_map_inplace : 'a t -> f:('a -> 'a Core_kernel__.Import.option) -> Core_kernel__.Import.unit
If
f
returnsNone
, the element is removed, else the value is replaced with the contents of theSome
val filter_mapi_inplace : 'a t -> f:(Core_kernel__.Import.int -> 'a -> 'a Core_kernel__.Import.option) -> Core_kernel__.Import.unit
val unchecked_iter : 'a t -> f:('a -> Core_kernel__.Import.unit) -> Core_kernel__.Import.unit
unchecked_iter t ~f
behaves likeiter t ~f
except thatf
is allowed to modifyt
. Adding or removing elements before the element currently being visited has no effect on the traversal. Elements added after the element currently being visited will be traversed. Elements deleted after the element currently being visited will not be traversed. Deleting the element currently being visited is an error that is not detected (presumably leading to an infinite loop).
val to_sequence : 'a t -> 'a Core_kernel.Sequence.t
A sequence of values from the doubly-linked list. It makes an intermediate copy of the list so that the returned sequence is immune to any subsequent mutation of the original list.