Packages
mazurka
0.3.2
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.3.39
0.3.38
0.3.37
0.3.36
0.3.35
0.3.34
0.3.33
0.3.32
0.3.31
0.3.30
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
hypermedia api toolkit
Current section
Files
Jump to
Current section
Files
lib/mazurka/compiler/utils.ex
defmodule Mazurka.Compiler.Utils do
def eval(quoted, env) do
{out, []} = quoted
|> Macro.expand(env)
|> Code.eval_quoted([], env)
out
end
def expand(quoted, env) do
Macro.postwalk(quoted, fn
({type, meta, children}) ->
meta = replace_kernel(meta)
Macro.expand({type, meta, children}, env)
([{:do, _} | _] = doblock) ->
Enum.map(doblock, fn({key, children}) ->
children = expand(children, env)
{key, children}
end)
({name, children}) when is_atom(name) ->
children = expand(children, env)
{name, children}
(other) ->
Macro.expand(other, env)
end)
end
defp replace_kernel(meta) do
if meta[:import] == Kernel do
Keyword.put(meta, :import, Mazurka.Compiler.Kernel)
else
meta
end
end
def register(name, block) do
register(name, block, nil)
end
def register(name, block, meta) do
register(nil, name, block, meta)
end
def register(mediatype, name, block, meta) do
{{:., [],
[{:__aliases__, [alias: false], [:Mazurka, :Compiler, :Utils]}, :save]}, [],
[mediatype, name, block, meta]}
|> Mazurka.Compiler.Kernel.wrap
end
defmacro save(mediatype, name, block, meta) do
mediatype = eval(mediatype, __CALLER__)
put(__CALLER__, mediatype, name, block, meta)
end
def put(caller, mediatype, name, value, meta \\ nil) do
module = caller.module
Module.register_attribute(module, __MODULE__, accumulate: true)
Module.put_attribute(module, __MODULE__, {mediatype, name, value, meta})
nil
end
def get(caller) do
caller.module
|> Module.get_attribute(__MODULE__)
end
def get(caller, name) do
get(caller)
|> Enum.filter(fn({_, item, _, _}) ->
item == name
end)
end
end