defmodule SchedEx do @moduledoc """ SchedEx schedules 'jobs' (either m,f,a tuples or functions) to run in the future. """ @doc """ Runs the given module, function and argument tuple at the given time """ def run_at(m, f, a, %DateTime{} = time) when is_atom(m) and is_atom(f) and is_list(a) do run_at(fn -> apply(m,f,a) end, time) end @doc """ Runs the given function at the given time """ def run_at(func, %DateTime{} = time) when is_function(func) do delay = DateTime.diff(time, DateTime.utc_now(), :millisecond) run_in(func, delay) end @doc """ Runs the given module, function and argument tuple in given number of milliseconds """ def run_in(m, f, a, delay, opts \\ []) when is_atom(m) and is_atom(f) and is_list(a) do run_in(fn -> apply(m,f,a) end, delay, opts) end @doc """ Runs the given function in given number of milliseconds """ def run_in(func, delay, opts \\ []) when is_function(func) and is_integer(delay) do SchedEx.Runner.run_in(func, delay, opts) end @doc """ Cancels the given scheduled job """ def cancel(token) do SchedEx.Runner.cancel(token) end end