Packages

Embed your map into a module for easier/faster lookup

Current section

Files

Jump to
defmap lib defmap.ex
Raw

lib/defmap.ex

defmodule Defmap do
@moduledoc File.read!(Path.join([__DIR__, "..", "README.md"]))
defmacro __using__(opts) do
map = Keyword.fetch! opts, :map
quote do
import Defmap, only: [compile: 1]
compile unquote(map)
end
end
defmacro compile({_, _, map}) do
catch_all = quote do
def get(_) do
:error
end
end
Enum.reduce(map, [catch_all], fn({key,value}, acc) ->
fun = quote do
def get(unquote(key)) do
{:ok, unquote(value)}
end
end
[fun | acc]
end)
end
end