Module Kcas_data.Stack

Last-In First-Out (LIFO) stack.

The interface provides a subset of the OCaml Stdlib.Stack module. add_seq is not provided at all. Compositional versions of iter, fold, pop, and top are not provided.

The implementation is essentially a Treiber stack with randomized exponential backoff and support for constant time length.

Common interface

type !'a t

The type of stacks containing elements of type 'a.

exception Empty

Raised when pop or top is applied to an empty stack.

val create : unit -> 'a t

create () returns a new empty stack.

val copy : 'a t -> 'a t

copy s returns a copy of the stack s.

val of_seq : 'a Stdlib.Seq.t -> 'a t

of_seq xs creates a stack from the sequence xs.

Compositional interfaces

module Tx : sig ... end

Transactions on stacks.

module Xt : sig ... end

Explicit transaction log passing on stacks.

Non-compositional interface

val is_empty : 'a t -> bool

is_empty s determines whether the stack s is empty.

val length : 'a t -> int

length s returns the length of the stack s.

val clear : 'a t -> unit

clear s removes all elements from the stack s.

val swap : 'a t -> 'a t -> unit

swap s1 s2 exchanges the contents of the stacks s1 and s2.

val to_seq : 'a t -> 'a Stdlib.Seq.t

to_seq s returns a domain safe sequence for iterating through the elements of the stack top to bottom.

The sequence is based on a constant time, O(1), snapshot of the stack and modifications of the stack have no effect on the sequence.

val push : 'a -> 'a t -> unit

push x s adds the element x to the top of the stack s.

val pop_opt : 'a t -> 'a option

pop_opt s removes and returns the topmost element of the stack s, or None if the stack is empty.

val top_opt : 'a t -> 'a option

top_opt s returns the topmost element in stack s, or None if the stack is empty.

val pop : 'a t -> 'a

pop s removes and returns the topmost element in stack s, or raises Empty if the stack is empty.

val top : 'a t -> 'a

top s returns the topmost element in stack s, or raises Empty if the stack is empty.

val iter : ('a -> unit) -> 'a t -> unit

iter f s is equivalent to Seq.iter f (to_seq s).

val fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b

fold f s is equivalent to Seq.fold_left f a (to_seq s).