Stdlib.Queue(3)
π NAME π
Okay so bestie, this is Stdlib.Queue, from the OCaml library manual π¦. The original listing says no description, which is giving mysterious main character energy π β but don't worry, we're about to unpack the whole thing.
π§© Module π§©
Module Stdlib.Queue
π Documentation π
Module Queue : (module Stdlib__Queue)
π¨ Unsynchronized accesses π¨
Unsynchronized accesses to a queue may lead to an invalid queue state. Thus, concurrent accesses to queues must be synchronized (for instance with a Mutex.t). No cap, this one is important π
.
type !'a tβ The type of queues containing elements of type'a. πexception Emptyβ Raised whenQueue.takeorQueue.peekis applied to an empty queue. She will absolutely throw if you try her like that π.
Here are all the values, fr fr:
val create : unit -> 'a tβ Return a new queue, initially empty. Fresh queue just dropped β¨.val add : 'a -> 'a t -> unitβadd x qadds the elementxat the end of the queueq. π«Άval push : 'a -> 'a t -> unitβpushis a synonym foradd. Same vibe, different name π .val take : 'a t -> 'aβtake qremoves and returns the first element in queueq, or raisesQueue.Emptyif the queue is empty. πval take_opt : 'a t -> 'a optionβtake_opt qremoves and returns the first element in queueq, or returnsNoneif the queue is empty. Since 4.08 π¦.val pop : 'a t -> 'aβpopis a synonym fortake. Iconic alias behavior π.val peek : 'a t -> 'aβpeek qreturns the first element in queueq, without removing it from the queue, or raisesQueue.Emptyif the queue is empty. Just looking, not touching π.val peek_opt : 'a t -> 'a optionβpeek_opt qreturns the first element in queueq, without removing it from the queue, or returnsNoneif the queue is empty. Since 4.08 πΈ.val top : 'a t -> 'aβtopis a synonym forpeek. Another alias ate π .val drop : 'a t -> unitβdrop qremoves the first element in queueq, or raisesQueue.Emptyif the queue is empty. Since 5.3 π₯.val clear : 'a t -> unitβ Discard all elements from a queue. Clean slate energy β¨.val copy : 'a t -> 'a tβ Return a copy of the given queue. Twin moment π.val is_empty : 'a t -> boolβ Returntrueif the given queue is empty,falseotherwise. Vibe check β .val length : 'a t -> intβ Return the number of elements in a queue. Math queen π’.val iter : ('a -> unit) -> 'a t -> unitβiter f qappliesfin turn to all elements ofq, from the least recently entered to the most recently entered. The queue itself is unchanged. πval fold : ('acc -> 'a -> 'acc) -> 'acc -> 'a t -> 'accβfold f accu qis equivalent toList.fold_left f accu l, wherelis the list ofq's elements. The queue remains unchanged. πval transfer : 'a t -> 'a t -> unitβtransfer q1 q2adds all ofq1's elements at the end of the queueq2, then clearsq1. It is equivalent to the sequenceiter (fun x -> add x q2) q1; clear q1, but runs in constant time. Fast and fierce β‘.
π Iterators π
val to_seq : 'a t -> 'a Seq.tβ Iterate on the queue, in front-to-back order. The behavior is not specified if the queue is modified during the iteration. Since 4.07 π¦.val add_seq : 'a t -> 'a Seq.t -> unitβ Add the elements from a sequence to the end of the queue. Since 4.07 β¨.val of_seq : 'a Seq.t -> 'a tβ Create a queue from a sequence. Since 4.07 πΈ.
πΈ Examples πΈ
π Basic Example π
A basic example:
# let q = Queue.create ()
val q : '_weak1 Queue.t = <abstr>
# Queue.push 1 q; Queue.push 2 q; Queue.push 3 q
- : unit = ()
# Queue.length q
- : int = 3
# Queue.pop q
- : int = 1
# Queue.pop q
- : int = 2
# Queue.pop q
- : int = 3
# Queue.pop q
Exception: Stdlib.Queue.Empty.
π Search Through a Graph π
For a more elaborate example, a classic algorithmic use of queues is to implement a BFS (breadth-first search) through a graph.
type graph = {
edges: (int, int list) Hashtbl.t
}
(* Search in graph [g] using BFS, starting from node [start].
It returns the first node that satisfies [p], or [None] if
no node reachable from [start] satisfies [p].
*)
let search_for ~(g:graph) ~(start:int) (p:int -> bool) : int option =
let to_explore = Queue.create() in
let explored = Hashtbl.create 16 in
Queue.push start to_explore;
let rec loop () =
if Queue.is_empty to_explore then None
else
(* node to explore *)
let node = Queue.pop to_explore in
explore_node node
and explore_node node =
if not (Hashtbl.mem explored node) then (
if p node then Some node (* found *)
else (
Hashtbl.add explored node ();
let children =
Hashtbl.find_opt g.edges node
|> Option.value ~default:[]
in
List.iter (fun child -> Queue.push child to_explore) children;
loop()
)
) else loop()
in
loop()
(* a sample graph *)
let my_graph: graph =
let edges =
List.to_seq [
1, [2;3];
2, [10; 11];
3, [4;5];
5, [100];
11, [0; 20];
]
|> Hashtbl.of_seq
in {edges}
# search_for ~g:my_graph ~start:1 (fun x -> x = 30)
- : int option = None
# search_for ~g:my_graph ~start:1 (fun x -> x >= 15)
- : int option = Some 20
# search_for ~g:my_graph ~start:1 (fun x -> x >= 50)
- : int option = Some 100
This iconic page was brought to you by OCamldoc, version/date 2026-06-22, for Stdlib.Queue(3) β periodt ππ¦.
π¦ where this page comes from
- arch rolling: ocaml 5.5.0-1 Β· LGPL2.1 AND custom: QPL-1.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms