README.md

# Patiently

Helpers for waiting on asynchronous events.

Patiently is built with testing in mind, but there's nothing in the
code that makes it inappropriate for use elsewhere.

If possible, we should avoid writing code that needs Patiently, but
sometimes we can't avoid situations where the only way to tell that an
event has occurred is to repeatedly call some function.  For example,
we may need to publish a message to a broker and then verify that it has
been consumed.

At the heart of Patiently is a loop with simple behavior:

1. A function is executed at the beginning of each iteration.
2. If the function returns true, we are done.
3. If the function returns false, dwell (sleep) a short time and try again.
4. After a maximum number of tries, return an error or raise an exception.

## Example usage

```
defmodule MyTest do
  use ExUnit.Case
  
  test "wait for some thing to happen" do
    condition = fn -> :random.uniform(10) > 5 end
    
    # non-exception usage
    assert :ok == Patiently.wait_for(condition)

    # raise an exception if an error occurs (which will fail the test)
    Patiently.wait_for!(condition)
    
    # specify the dwell time and maximum number of tries
    Patiently.wait_for!(
      condition,
      dwell: 10, #msec
      max_tries: 100
    )
  end
end
```

## Contributing

The standard Github workflow applies.  Pull requests are welcome!