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 when Queue.take or Queue.peek is 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 q adds the element x at the end of the queue q. 🫢
  • val push : 'a -> 'a t -> unit β€” push is a synonym for add. Same vibe, different name πŸ’….
  • val take : 'a t -> 'a β€” take q removes and returns the first element in queue q, or raises Queue.Empty if the queue is empty. 😭
  • val take_opt : 'a t -> 'a option β€” take_opt q removes and returns the first element in queue q, or returns None if the queue is empty. Since 4.08 πŸ¦‹.
  • val pop : 'a t -> 'a β€” pop is a synonym for take. Iconic alias behavior πŸ‘‘.
  • val peek : 'a t -> 'a β€” peek q returns the first element in queue q, without removing it from the queue, or raises Queue.Empty if the queue is empty. Just looking, not touching πŸ‘€.
  • val peek_opt : 'a t -> 'a option β€” peek_opt q returns the first element in queue q, without removing it from the queue, or returns None if the queue is empty. Since 4.08 🌸.
  • val top : 'a t -> 'a β€” top is a synonym for peek. Another alias ate πŸ’….
  • val drop : 'a t -> unit β€” drop q removes the first element in queue q, or raises Queue.Empty if 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 β€” Return true if the given queue is empty, false otherwise. 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 q applies f in turn to all elements of q, 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 q is equivalent to List.fold_left f accu l, where l is the list of q's elements. The queue remains unchanged. πŸŒ€
  • val transfer : 'a t -> 'a t -> unit β€” transfer q1 q2 adds all of q1's elements at the end of the queue q2, then clears q1. It is equivalent to the sequence iter (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