Current section

Files

Jump to
ark lib ark.ex
Raw

lib/ark.ex

defmodule Ark do
@plugins [Ark.Ok, Ark.PipeIn, Ark.Drip]
@plugin_docs @plugins
|> Enum.map(fn mod -> {mod, mod.__ark_alias, mod.__ark_doc} end)
|> Enum.map(fn {mod, alias, adoc} ->
"""
### #{mod}
#{
if alias do
"**Alias:** `#{inspect(alias)}`"
else
"This module cannot be imported with `use Ark`"
end
}
#{adoc}
"""
end)
@moduledoc """
Ark is a collection of small utilities useful for prototyping,
testing, and working with Elixir common patterns.
Each utility consists in an module that can be imported
through a single `use` expression.
#### Import all Ark utilities at once:
```
use Ark
```
#### Import some of the Ark utilities:
```
use Ark, [:ok, :pipe_in]
```
#### Import utilities manually
As utilities are mere modules, you can always import each of them
separately:
```
import Ark.Ok
import Ark.PipeIn
```
## Utilities
#{@plugin_docs}
"""
@all [:pipe_in, :ok]
defmacro __using__(opts) do
imports =
case List.wrap(opts) do
[] -> @all
list -> list
end
imports
|> Enum.map(&alias_module/1)
|> Enum.map(&abuse_module/1)
end
defp alias_module({:__aliases__, _, [:Ark, plugin]}), do: alias_module(:Ark, plugin)
defp alias_module({:__aliases__, _, mod_path}), do: alias_module(Module.concat(mod_path))
defp alias_module(:ok), do: Ark.Ok
defp alias_module(:pipe_in), do: Ark.PipeIn
defp alias_module(other) do
raise "Ark plugin '#{inspect(other)}' could not be found"
end
defp alias_module(:Ark, :PipeIn), do: Ark.PipeIn
defp alias_module(:Ark, :Ok), do: Ark.Ok
defp abuse_module(mod) do
quote do
use unquote(mod)
end
end
end