TermUI.MessageQueue (TermUI v0.2.0)
View SourceMessage queue for batching multiple messages before rendering.
Multiple messages may arrive between renders. We batch messages, applying all updates before rendering once. This prevents redundant renders when multiple events arrive quickly. The batch preserves message order for deterministic updates.
Usage
# Create a queue
queue = MessageQueue.new()
# Enqueue messages
queue = MessageQueue.enqueue(queue, :increment)
queue = MessageQueue.enqueue(queue, {:set_value, 42})
# Process all messages
{messages, queue} = MessageQueue.flush(queue)
# Apply messages to state
state = Enum.reduce(messages, state, fn msg, state ->
{new_state, _commands} = Component.update(msg, state)
new_state
end)
Summary
Functions
Clears the queue and resets overflow count.
Removes and returns the front message.
Returns true if the queue is empty.
Enqueues a message for processing.
Enqueues multiple messages at once.
Removes and returns all messages from the queue.
Creates a new message queue.
Returns the number of dropped messages due to overflow.
Peeks at the front message without removing it.
Processes all queued messages with a function.
Returns the number of messages in the queue.
Types
@type message() :: term()
@type t() :: %TermUI.MessageQueue{ max_size: pos_integer(), messages: :queue.queue(message()), overflow_count: non_neg_integer(), size: non_neg_integer() }
Functions
Clears the queue and resets overflow count.
Removes and returns the front message.
Returns true if the queue is empty.
Enqueues a message for processing.
Messages are added to the back of the queue, preserving order. If the queue is at max capacity, the message is dropped and overflow count is incremented.
Enqueues multiple messages at once.
Removes and returns all messages from the queue.
Returns {messages, empty_queue} where messages is a list
in the order they were enqueued.
Creates a new message queue.
Options
:max_size- Maximum number of messages before dropping (default: 1000)
@spec overflow_count(t()) :: non_neg_integer()
Returns the number of dropped messages due to overflow.
Peeks at the front message without removing it.
Processes all queued messages with a function.
Applies fun to each message and the accumulator, returning
the final accumulator and empty queue.
Example
{final_state, commands, queue} = MessageQueue.process(queue, {state, []}, fn msg, {state, cmds} ->
{new_state, new_cmds} = Component.update(msg, state)
{new_state, cmds ++ new_cmds}
end)
@spec size(t()) :: non_neg_integer()
Returns the number of messages in the queue.