You need to create a separate closure.
defmodule Demo do
def fun(limit, max) do
value = :rand.uniform(max)
cond do
value <= limit ->
IO.write("#{value}, ")
false
true ->
IO.puts("#{value}")
true
end
end
def make_fun(limit, max) do
fn() -> Demo.fun(limit, max) end
end
def make_fun2(f, limit, max) do
fn() -> f.(limit, max) end
end
def make_fun3(m, f, limit, max) do
fn() -> Kernel.apply(m, f, [limit, max]) end
end
def wait_for_true(fun), do: wait_for_true(fun, 10_000)
def wait_for_true(_fun, 0), do: false
def wait_for_true(fun, timeout) do
case fun.() do
true ->
true
false ->
:timer.sleep(100)
wait_for_true(fun, max(0, timeout - 100))
end
end
end
Demo.wait_for_true(fn() -> Demo.fun(80,100) end)
Demo.wait_for_true(Demo.make_fun(80,100))
Demo.wait_for_true(Demo.make_fun2(&Demo.fun/2, 80, 100))
Demo.wait_for_true(Demo.make_fun3(Demo, :fun, 80, 100))
$ elixir demo.exs
24, 52, 39, 2, 12, 18, 88
68, 76, 32, 90
73, 66, 58, 1, 20, 46, 61, 72, 76, 62, 51, 43, 5, 15, 38, 58, 39, 5, 94
36, 39, 12, 79, 45, 69, 68, 84
$






















