defmodule Iconic do @moduledoc """ Application module for iconic, a Task based icon fetching application. ## Examples iex> Task.await(Iconic.get("www.foo.com")) iex> Enum.to_list(Iconic.mget(["www.foo.com", "www.bar.com", "www.baz.com"])) """ use Application alias Icon.Fetch def start(_type, _args) do children = [ {Task.Supervisor, name: Icon.Fetch.Supervisor} ] opts = [strategy: :one_for_one, name: Iconic.Supervisor] Supervisor.start_link(children, opts) end @doc """ Returns a `Task` that yields a list of `Icon.Parse.Icon.t()` when it's completed. ## Examples iex> task = Iconic.get("www.foo.com") iex> Task.await(task) """ @spec get(String.t()) :: Task.t() def get(url) do Task.Supervisor.async(Icon.Fetch.Supervisor, Fetch, :fetch, [url]) end @doc """ Returns a `Stream` that yields a list of `{task_status, [Icon.Parse.Icon.t()]}` when all the icon fetching tasks are completed. ## Options * `:max_concurrency` - sets the maximum number of tasks to run at the same time. Defaults to `System.schedulers_onlines/0`. * `:timeout` - the maximum amount of time to wait (in milliseconds) without receiving a task reply (across all running tasks). Defaults to `5000`. ## Examples iex> tasks = Iconic.mget(["www.foo.com", "www.bar.com", "www.baz.com"]) iex> Enum.to_list(tasks) """ @spec mget(String.t(), keyword) :: Enumerable.t() def mget(urls, options \\ []) do Task.Supervisor.async_stream( Icon.Fetch.Supervisor, urls, Fetch, :fetch, [], options ) end end