Skip to content

Instantly share code, notes, and snippets.

@sasa1977
Last active December 14, 2015 05:09
Show Gist options
  • Save sasa1977/5033165 to your computer and use it in GitHub Desktop.
Save sasa1977/5033165 to your computer and use it in GitHub Desktop.
Different styles of manipulating hierarchy in Elixir
defmodule Fp do
defmodule Company do
defrecordp :company, employees: HashDict.new
defrecordp :employee, [:id, :name]
def merge_employee(company(employees: employees), employee(id: employee_id) = employee) do
company(company, employees: Dict.put(employees, employee_id, employee))
end
def new, do: company()
def new_employee(id, name), do: employee(id: id, name: name)
end
IO.inspect(
Company.new |>
Company.merge_employee(Company.new_employee(1, "John Doe"))
)
end
defmodule Hybrid do
defrecord Employee, [:id, :name]
defrecord Company, employees: HashDict.new do
def merge_employee(company, employee) do
company.update_employees(Dict.put(&1, employee.id, employee))
end
end
IO.inspect(
Company.new |>
Company.merge_employee(Employee.new(id: 1, name: "John Doe"))
)
end
defmodule Oop do
defrecord Employee, [:id, :name]
defrecord Company, employees: HashDict.new do
def merge_employee(employee, company) do
company.update_employees(Dict.put(&1, employee.id, employee))
end
end
IO.inspect(
Company.new.
merge_employee(Employee.new(id: 1, name: "John Doe"))
)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment