A queue implemented with an array.
The implementation will grow the array as necessary. The array will never
automatically be shrunk, but the size can be interrogated and set with capacity and
set_capacity.
Iteration functions (iter, fold, map, concat_map, filter, filter_map,
filter_inplace, and some functions from Container.S1) will raise if the queue is
modified during iteration.
Differences from the standard module:
enqueue replaces push and add, and takes the queue first.
dequeue replaces pop and take, and returns an option rather than raising
Empty.
dequeue_exn is available if you want to raise Empty.
iter and fold take labeled arguments.
blit_transfer replaces transfer but is markedly different; see below.
of_list list returns a queue t with the elements of list in the same order as
the elements of list (i.e. the first element of t is the first element of the
list).
filter_inplace t ~f removes all elements of t that don't satisfy f. If f
raises, t is unchanged. This is inplace in that it modifies t; however, it uses
space linear in the final length of t.
get t i returns the i'th element in t, where the 0'th element is at the front of
t and the length t - 1 element is at the back.