Skip to content

Instantly share code, notes, and snippets.

@roehst
Created November 6, 2018 16:01
Show Gist options
  • Save roehst/359730e68bc6b0425d61c52c8c221ea6 to your computer and use it in GitHub Desktop.
Save roehst/359730e68bc6b0425d61c52c8c221ea6 to your computer and use it in GitHub Desktop.
Refactor some functional compositions
defmodule Functional do
def run() do
source = """
def f(xs, f) do
Enum.map(xs, f) |> Enum.join(",")
Enum.map(xs, f) |> Enum.into(",")
end
"""
ast = Code.string_to_quoted!(source)
Macro.traverse(ast, %{issues: []}, &prewalk/2, &postwalk/2)
end
@pairs [{:map, :join}, {:map, :into}]
for {f1, f2} <- @pairs do
def prewalk(
{:|>, [line: line],
[
{{:., _, [{:__aliases__, _, [:Enum]}, unquote(f1)]}, _, _},
{{:., _, [{:__aliases__, _, [:Enum]}, unquote(f2)]}, _, _}
]} = ast,
acc
) do
{ast, %{acc | issues: [{line, unquote(f1), unquote(f2)}|acc.issues]}}
end
end
def prewalk(ast, acc) do
{ast, acc}
end
def postwalk(ast, acc) do
{ast, acc}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment