Queue(3)
π NAME π
Queue β first-in first-out queues, bestie. Literally the most iconic data structure, no cap.
π Module π
The module name is Queue, and its signature module is Module Queue with : sig end β yes, that's what it says, that's the whole sig, we're just vibing here.
πΈ Documentation πΈ
Ok so picture this: Queue implements queues (FIFOs), and the modifications happen in place β in-place modification is the whole aesthetic. The module itself says "See Queue.examples below" and honestly, do it, the examples ate. π
β οΈ Alert unsynchronized_access. Unsynchronized accesses to queues are a programming error. Not a vibe. Not cute. π©
π Unsynchronized accesses
Unsynchronized accesses to a queue may lead to an invalid queue state β like, catastrophic. So concurrent accesses to queues must be synchronized (for instance with a Mutex.t). Lock it or lose it, bestie. π
type !'a tβ the type of queues containing elements of type'a.exception Emptyβ raised whenQueue.takeorQueue.peekis applied to an empty queue. This is the "girl, there's nothing there" exception. πval create : unit -> 'a tβ returns a new queue, initially empty. A fresh start, main character energy. β¨val add : 'a -> 'a t -> unitβadd x qadds the elementxat the end of the queueq. Get in line,x. πΆββοΈval push : 'a -> 'a t -> unitβpushis a synonym foradd. Same girl, different font. πββοΈval take : 'a t -> 'aβtake qremoves and returns the first element in queueq, or raisesQueue.Emptyif the queue is empty. It's giving "front of the line, you're up". π₯val take_opt : 'a t -> 'a optionβtake_opt qremoves and returns the first element in queueq, or returnsNoneif the queue is empty. Same astakebut it will NOT throw hands at you. π«Ά Since 4.08val pop : 'a t -> 'aβpopis a synonym fortake. Bestie, they're the same picture. πΈval peek : 'a t -> 'aβpeek qreturns the first element in queueqwithout removing it from the queue, or raisesQueue.Emptyif the queue is empty. Looking respectfully. πval peek_opt : 'a t -> 'a optionβpeek_opt qreturns the first element in queueqwithout removing it from the queue, or returnsNoneif the queue is empty. Look respectfully but with a safe fallback. π Since 4.08val top : 'a t -> 'aβtopis a synonym forpeek. Periodt. πval drop : 'a t -> unitβdrop qremoves the first element in queueq, or raisesQueue.Emptyif the queue is empty. Yeet the front element into the void. π Since 5.3val clear : 'a t -> unitβ discard all elements from a queue. Total reset. Clean slate. We don't know them. π§Ήval copy : 'a t -> 'a tβ returns a copy of the given queue. Twin moment. πval is_empty : 'a t -> boolβ returnstrueif the given queue is empty,falseotherwise. The vibe check of functions. βval length : 'a t -> intβ returns the number of elements in a queue. Counting the girlies. π’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. Give it a little look, don't touch. π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. Very respectful of boundaries. π¦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. Notice how it's faster than the manual way? Yeah. Iconic. β
π§ 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. Don't touch it mid-iteration, bestie, that's chaos. π© Since 4.07val add_seq : 'a t -> 'a Seq.t -> unitβ add the elements from a sequence to the end of the queue. Pour them all in. π Since 4.07val of_seq : 'a Seq.t -> 'a tβ create a queue from a sequence. Glow-up from sequence to queue. β¨ Since 4.07
π Examples π
πΈ Basic Example
A basic example, and yes we're doing the toplevel # prompt thing, it's tradition:
# 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.
See that last one? Popped one too many and got hit with Stdlib.Queue.Empty. Felt that. π
π¦ Search Through a Graph
Ok for a more elaborate example β and this is a classic β one algorithmic use of queues is implementing a BFS (breadth-first search) through a graph. Here's the whole thing:
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}
And here's it actually running, look at her go:
# 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
Three searches, three answers, zero notes. We love a functional queen. π
π That's the whole page! No "SEE ALSO" section in this one, which is honestly a little mysterious of it, but we respect the choices.
And that's a wrap, bestie β this page was brought to you by OCamldoc, dated 2026-06-22, filing itself under Queue(3) like the icon it is. Go forth and FIFO responsibly. π«Άβ¨
π¦ 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