lib/owl/task.ex

defmodule Owl.Task do
  @moduledoc """
  Run task using internal supervision tree.
  """

  @doc """
  Runs a function as a task under supervision tree.

  This is usefull when you need graceful shutdown in simple scripts, where Owl is installed
  using `Mix.install/2`.

  ## Example

      # content of ping.exs file, run as `elixir --no-halt ping.exs`
      Mix.install([:owl])

      Owl.Task.run(fn ->
        Owl.System.daemon_cmd("ping", ["8.8.8.8"], fn ->
          Process.sleep(3000)
          2 + 2
        end)
      end

      System.stop()

  """
  @spec run((() -> result)) :: {:ok, result} | {:exit, term()} when result: any()
  def run(function) do
    task = Task.Supervisor.async_nolink(Owl.TaskSupervisor, function)
    Task.yield(task, :infinity)
  end
end