Packages
moar
1.2.0
5.0.0
4.3.0
4.2.0
4.1.0
4.0.0
3.2.0
3.1.0
3.0.0
2.7.0
2.6.0
2.5.0
2.4.2
2.4.1
2.4.0
2.3.0
2.2.0
2.1.0
2.0.1
2.0.0
1.64.0
1.63.1
1.63.0
1.62.0
1.61.2
1.61.1
1.61.0
1.60.0
1.59.2
1.59.1
1.59.0
1.58.0
1.57.0
1.56.2
1.56.1
1.56.0
1.55.0
1.54.0
1.53.0
1.52.1
1.52.0
1.51.0
1.50.0
1.49.0
1.48.0
1.47.0
1.46.0
1.45.1
1.45.0
1.44.0
1.43.0
1.42.0
1.41.0
1.40.0
1.39.0
1.38.0
1.37.0
1.36.0
1.35.0
1.34.0
1.33.0
1.32.0
1.31.0
1.30.0
1.29.0
1.28.0
1.27.0
1.26.0
1.25.0
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.0
1.19.3
1.19.2
1.19.1
1.19.0
1.18.1
1.18.0
1.17.0
1.16.0
1.15.0
1.14.0
1.13.1
1.13.0
1.12.0
1.11.0
1.10.0
1.9.0
1.8.0
1.7.0
1.6.0
1.5.0
1.4.0
1.3.0
1.2.0
1.1.0
1.0.0
0.1.0
A dependency-free utility library containing 100+ useful functions.
Current section
Files
Jump to
Current section
Files
lib/retry.ex
defmodule Moar.Retry do
# @related [test](/test/retry_test.exs)
# TODO:
# - implement: retry_until(DateTime.t(), fun()) :: {:ok, any()} | {:error, :timeout}
# - implement: retry_for(pos_integer(), fun()) :: {:ok, any()} | {:error, :timeout}
#
# see: https://github.com/RatioPBC/euclid/blob/main/test/support/helpers/retry.ex
@spec rescue_for!(pos_integer(), (() -> any())) :: any() | no_return
def rescue_for!(timeout_ms \\ 5000, fun) when is_function(fun) and is_number(timeout_ms) do
DateTime.utc_now()
|> DateTime.add(timeout_ms, :millisecond)
|> rescue_until!(fun)
end
@spec rescue_until!(DateTime.t(), (() -> any())) :: any() | no_return
def rescue_until!(%DateTime{} = time, fun) when is_function(fun) do
fun.()
rescue
e ->
if DateTime.compare(time, DateTime.utc_now()) == :gt do
:timer.sleep(100)
rescue_until!(time, fun)
else
reraise e, __STACKTRACE__
end
end
end