A simple way to sync between processes. Especially useful when writing ExUnit tests.
The package can be installed by adding trigger
to your list of dependencies
in mix.exs
:
def deps do
[
{:trigger, "~> 1.0"},
]
end
Documentation can be found at https://hexdocs.pm/trigger.
First, you need to create a trigger:
iex(1)> trigger = Trigger.new()
%Trigger{receiver: #PID<0.200.0>, ref: #Reference<0.602029420.2269642755.58891>}
The trigger contains pid of a signal receiver and an unique reference.
To fire the trigger (usually from another process):
iex(2)> spawn(fn -> Trigger.fire(trigger, "data") end)
#PID<0.209.0>
An arbitrary data can be sent with the trigger signal (default nil
).
To wait until the trigger is fired:
iex(3)> {sender, data} = Trigger.wait(trigger)
{#PID<0.209.0>, "data"}
It is also possible to send arbitrary data back to trigger sender:
iex(1)> trigger = Trigger.new()
%Trigger{
receiver: #PID<0.233.0>,
ref: #Reference<0.785945778.3082813446.171011>
}
iex(2)> spawn(fn ->
...(2)> "Hello, world" = Trigger.fire_wait(trigger, "world")
...(2)> end)
#PID<0.238.0>
iex(3)> {sender, name} = Trigger.wait(trigger)
{#PID<0.238.0>, "world"}
iex(4)> Trigger.reply(trigger, sender, "Hello, #{name}")
:ok
In addition, a single trigger can be fired multiple times.