trigger

A simple way to sync between processes.


License
MIT

Documentation

Trigger

GitHub Workflow Status Hex.pm Coveralls codebeat badge License

A simple way to sync between processes. Especially useful when writing ExUnit tests.

Installation

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.

Usage

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.