class Agent(T)
- Agent(T)
- Reference
- Object
Defined in:
agent.crConstant Summary
-
DefaultTimeout =
5.seconds
-
SubmittedInst =
Submitted.new
-
TimeoutExceptionInst =
TimeoutException.new
-
TimeoutInst =
Timeout.new
Constructors
-
.new(state : T)
Creates an Agent wrapping
@state
.
Instance Method Summary
-
#get(max_time = DefaultTimeout) : T | Result
Fetches the state of the Agent.
-
#get(max_time = DefaultTimeout, &fn : T -> Q) : Q | Result forall Q
Fetches the state of the Agent and applies the given function to it.
-
#get!(max_time = DefaultTimeout) : T
Fetches the state of the Agent.
-
#get!(max_time = DefaultTimeout, &fn : T -> Q) : Q forall Q
Fetches the state of the Agent and applies the given function to it.
-
#get_and_update(max_time = DefaultTimeout, &fn : T -> Tuple(Q, T)) : Q | Result forall Q
Fetches the state of the Agent, updates it and returns the first projection of
fn.call(state)
. -
#get_and_update!(max_time = DefaultTimeout, &fn : T -> Tuple(Q, T)) : Q forall Q
Fetches the state of the Agent, updates it and returns the first projection of
fn.call(state)
. -
#update(max_time = DefaultTimeout, &fn : T -> T) : Result
Updates the state of the Agent.
Constructor Detail
Creates an Agent wrapping @state
.
Agents are fiber-based, i.e. each Agent runs a fiber and serialises access and update requests over a channel. This guarantees thread-safety and data consistency within Agent's operations.
Instance Method Detail
Fetches the state of the Agent.
This is equivalent to get(max_time, &id)
, where id
is the identity function.
Fetches the state of the Agent and applies the given function to it.
This is equivalent to calling Agent#get_and_update
, where fn
does not update the current state.
the current state.
Fetches the state of the Agent.
Analogous Agent#get
, but an exception is raised in case of timeout.
NOTE the compile-time type of the returned value is T
, rather than T | Agent::Result
.
Fetches the state of the Agent and applies the given function to it.
Analogous Agent#get
, but an exception is raised in case of timeout
or if an exception is raised within the block.
NOTE the compile-time type of the returned value is Q
, rather than Q | Agent::Result
.
Fetches the state of the Agent, updates it and returns the first projection of fn.call(state)
.
If the #get_and_update
request is not handled by the Agent's fiber within
max_time
, then an Agent::Result::Timeout is returned. If an error is raised
during the execution of the block, then an Agent::Result::Error is returned.
Otherwise, the transformed state fn.call(state).first
, and the state is updated to
fn.call(state).last
.
Fetches the state of the Agent, updates it and returns the first projection of fn.call(state)
.
Analogous Agent#get_and_update
, but an exception is raised in case of timeout
or if an exception is raised within the block.
NOTE the compile-time type of the returned value is Q
, rather than Q | Agent::Result
.
Updates the state of the Agent.
Returns Agent::Result::Submitted
, if the update operation was accepted.
Returns Agent::Result::Timeout
, if a timeout is triggered before the operation
is accepted by the Agent's fiber.
NOTE #update
does not wait for fn
to be applied to the Agent's state
before returning.