if is_list(thing) && !Enum.empty?(thing) do IO.puts "matches" else IO.puts "no match" end case thing do [_] -> IO.puts "matches" _ -> IO.puts "no match" end Pattern Matching
Protocols defprotocol Enumerable do def reduce(item) #... end end defimpl Enumerable, for: Set do def reduce(set, acc, fun), do: Set.reduce(set, acc, fun) end Enum.reduce HashSet.new, [], fn element, accum -> List.concat(element, accum) end
Records compile time pattern defrecord ExUnit.Test, [:name, :case, :failure, :time] do @moduledoc """ A record that keeps information about the test. It is received by formatters and also accessible in the metadata under the key `:test`. """ end def handle_cast({:test_finished, ExUnit.Test[failure: nil] = test}, config) do if config.trace do IO.puts success(trace_test_result(test)) else IO.write success(".") end { :noreply, config.update_tests_counter(&1 + 1) } end
fact "mock with a _ wildcard" do provided [MocksTest.Funk.hip?(_) |> false] Funk.hip?(:yes) |> falsey Funk.hip?(:whatever) |> falsey end end |>(MocksTest.Funk.hip?(_), false)
defmodule Provided.Parse do defexception Error, form: [] do def message(exception) do "Amrita could not understand your `provided`:\n" <> " " <> Macro.to_string(exception.form) <> "\n" <> " Make sure it uses this format: [Module.fun |> :return_value]" end end def prerequisites(forms) do prerequisites = Enum.map(forms, fn form -> extract(form) end) Provided.Prerequisites.new(prerequisites) end defp extract({:|>, _, [{fun, _, args}, value]}) do { module_name, function_name } = extract(fun) { module_name, function_name, args, value } end defp extract({:., _, [ns, method_name]}) do { extract(ns), method_name } end defp extract({:__aliases__, _, ns}) do Module.concat ns end defp extract(form) do raise Error.new(form: form) end end
defmodule Provided.Parse do defexception Error, form: [] do def message(exception) do "Amrita could not understand your `provided`:\n" <> " " <> Macro.to_string(exception.form) <> "\n" <> " Make sure it uses this format: [Module.fun |> :return_value]" end end def prerequisites(forms) do prerequisites = Enum.map(forms, fn form -> extract(form) end) Provided.Prerequisites.new(prerequisites) end defp extract({:|>, _, [{fun, _, args}, value]}) do { module_name, function_name } = extract(fun) { module_name, function_name, args, value } end defp extract({:., _, [ns, method_name]}) do { extract(ns), method_name } end defp extract({:__aliases__, _, ns}) do Module.concat ns end defp extract(form) do raise Error.new(form: form) end end
Immutability “Elixir assignments are compiled down to Static Single Assignment.” defmodule Immutable do def mutation do x = 1 # => v0 = 1 x = 2 # => v1 = 2 x = 3 # => v2 = 3 end end