Last active
December 14, 2015 05:09
-
-
Save sasa1977/5033165 to your computer and use it in GitHub Desktop.
Different styles of manipulating hierarchy in Elixir
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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