module SkewBinaryList:sig
..end
This module implements random access lists with O(1) hd
and tl
operations and O(log n) lookup
and update
operations.
type 'a
t
val empty : 'a t
val is_empty : 'a t -> bool
val length : 'a t -> int
length t
returns the lenth of the list t
. Runs in O(log n)
time and O(1) stack space where n is the number of elements in
the list.val rev : 'a t -> 'a t
rev t
Reverse the list t
. Runs in O(n) run and O(1) stack
space where n is the number of elements in the list.val cons : 'a -> 'a t -> 'a t
cons x t
Adds the element x
to the front of the list t
.
Runs in O(1) time and stack space.val snoc : 'a -> 'a t -> 'a t
snoc x t
Adds the element x
to the back of the list t
.
Runs in O(n) time and O(1) stack space where n is the length of
the list.val last : 'a t -> 'a
last t
Returns the element at the back of the list. If the
list is empty, it raises Failure "last"
. Runs in O(1) stack
and O(log n) time.val hd : 'a t -> 'a
hd t
Returns the element at the front of the list t
. Runs
in O(1) time and stack space. Raises Failure "hd"
if the list is
empty.val tl : 'a t -> 'a t
tl t
Returns the list t
with the first element removed.
Runs in O(1) time and stack space. Raises Failure "tl"
if the
list is empty.val pop : 'a t -> 'a * 'a t
pop t
Equivalent to (hd t), (tl t)
but is more efficient.
Runs in amortized O(1) time and stack space. If the list is
empty, it raises Failure "pop"
.val append : 'a t ->
'a t -> 'a t
append t1 t2
Appends the list t2
onto the back of list t1
.
Runs in O(n) time and O(1) stack space where n is the number of
elements in t1
.val flatten : 'a t t -> 'a t
flatten t
Appends all of the elements of t
into a new list.
Runs in O(n) time and O(1) stack space where n is the sum of
each of the lists in t
.val from_list : 'a list -> 'a t
from_list l
Convert the standard list l into a SkewBinaryList.
Runs in O(n) time and O(1) stack space where n is the number of
elements in l
.val to_list : 'a t -> 'a list
to_list t
Convert the SkewBinaryList t
into a standard list.
Runs in O(n) time and O(1) stack space where n is the number of
elements in t
.val iter : ('a -> unit) -> 'a t -> unit
iter f t
Iterates over each element in the list t
in order
and applies f
to that element. Runs in O(n*ft) where ft is
the running time of f
and uses O(fs) stack space where fs is
the stack space required by f
.val fold : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a
fold f acc t
Accumulates the result acc
by applying f acc
x
for each element x
in t
. Runs in O(n*ft) where ft is the
running time of f
and uses O(fs) stack space where fs is the
stack space required by f
.val rev_map : ('a -> 'b) -> 'a t -> 'b t
rev_map f t
Creates a new list by applying f
to each element
of t
. The resulting list is in reverse order of t
. Runs in
O(n*ft) time where n is the number of elements in t
and ft is
the running time of f
. It uses O(fs) stack space where fs is
the stack space required by f
.val map : ('a -> 'b) -> 'a t -> 'b t
map f t
Creates a new list by applying f
to each element of
t
. The resulting list is in the same order as t
. Runs in
O(n*ft) time where n is the number of elements in t
and ft is
the running time of f
. It uses O((fs * log n) stack space
where fs is the stack space required by f
. This function is
slightly more efficient than Reins.SkewBinaryList.rev_map
(yielding
a different ordering) and significantly more efficient (by a
constant factor) than SkewBinaryList.rev
(SkewBinaryList.rev_map t)
.val to_string : ('a -> string) -> 'a t -> string
to_string to_s t
Convert the list t
into a string using
to_s
to individually convert each element into a string. Runs
in O(n*st) where st is the running time of to_s
and uses O(ss)
stack space where ss is the amount of stack required by to_s
.val compare : ('a -> 'a -> int) ->
'a t -> 'a t -> int
compare f t1 t2
Compares the lists t1
and t2
using f
to
compare individual elements. Returns 0 if t1
and t2
are
equal (under f). Returns <0
if t1
is less than t2
and
returns >0
otherwise.val gen : (?size:int -> Random.State.t -> 'a) ->
?size:int -> Random.State.t -> 'a t
gen f ?size rs
Generates a random list whose length is bounded
by size
. Each element in the list is computed by calling f
?size rs
. Runs in time O(size
* ft) where ft is the running
time of f
and uses O(fs) stack space where fs is the stack space
of f
.val lookup : int -> 'a t -> 'a
lookup i t
Returns the element at position i
(O-indexed) in
the list t
. Raises Not_found
if the list contains fewer
than i-1
elements. Runs in O(min(i,log n)) time and O(1)
stack space where n is the number of elements in t
.val update : int -> 'a -> 'a t -> 'a t
update i v t
Returns a new list where the element in position
i
(0-indexed) has been replaced by v
. Raises Not_found
if
the list contains fewer than i-1
elements. Runs in
O(min(i,log n)) time and O(1) stack space where n is the number
of elements in t
.