# Trigger
[](https://github.com/sega-yarkin/trigger/actions/workflows/elixir.yml)
[](https://hex.pm/packages/trigger)
[](https://coveralls.io/github/sega-yarkin/trigger?branch=master)
[](https://codebeat.co/projects/github-com-sega-yarkin-trigger-master)
[](https://opensource.org/licenses/MIT)
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`:
```elixir
def deps do
[
{:trigger, "~> 1.0"},
]
end
```
Documentation can be found at [https://hexdocs.pm/trigger](https://hexdocs.pm/trigger).
# Usage
First, you need to create a trigger:
```elixir
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):
```elixir
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:
```elixir
iex(3)> {sender, data} = Trigger.wait(trigger)
{#PID<0.209.0>, "data"}
```
It is also possible to send arbitrary data back to trigger sender:
```elixir
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.