Passing captured named function requiring arguments to another function?

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
$