# Refactoring Elixir

One of my colleagues pointed me at this blog post:

https://evuez.github.io/posts/cursed-elixir.html

This is a refactoring exercise, starting with this:

```defmodule FooBar do
def foo(a) do
if a < 0 do
bar(a, -1)
else
bar(a, 1)
end
end

defp bar(a, b) do
IO.inspect(a * b)
end
end
```

Transform it into canonical Elixir.

The article linked to moves heavily into pipelines but there are alternatives, here this notes that if is an expression:

```defmodule FooBar do
def foo(a) do
bar(a, (if a < 0, do: -1, else: 1))
end

defp bar(a, b) do
IO.inspect(a * b)
end
end
```

Also bar is symmetrical:

```defmodule FooBar do
def foo(a) do
if a < 0, do: -1, else: 1 |> bar(a)
end

defp bar(a, b) do
IO.inspect(a * b)
end
end
```

Pattern matching and guards is also typical Elixir, more so than an if:

```defmodule FooBar do
def foo(a) do
a
|> calculate()
|> bar(a)
end

defp calculate(a) when a < 0, do: -1
defp calculate(a), do: 1

defp bar(a, b) do
IO.inspect(a * b)
end
end
```

This is far more typical.