Skip to content

Instantly share code, notes, and snippets.

View Adzz's full-sized avatar

Adam Lancaster Adzz

View GitHub Profile
defmodule Project do
def total_cost(shape, cost_per_square_meter) do
Shape.area(shape) * cost_per_square_meter
end
end
defimpl Shape, for: EquilateralTriangle do
def area(shape) do
# some basic high school math that I've forgotten
end
end
defmodule EquilateralTriangle do
defstruct [:side]
end
%Square{side: 10}
|> Shape.area() #=> 100
defimpl Shape, for: Circle do
def area(shape) do
shape.radius * shape.radius * 3.14
end
end
defimpl Shape, for: Square do
def area(shape) do
shape.side * shape.side
end
end
defprotocol Shape do
def area(shape)
end
defmodule Project do
def total_cost(shape, cost_per_square_meter) do
Shape.area(shape) * cost_per_square_meter
end
end
defmodule Project do
def total_cost(shape = %Square{}, cost_per_square_meter) do
Square.area(shape) * cost_per_square_meter
end
def total_cost(shape = %Circle{}, cost_per_square_meter) do
Circle.area(shape) * cost_per_square_meter
end
end
defmodule Project do
def total_cost(shape, cost_per_square_meter) do
case shape do
%Square{} -> Square.area(shape) * cost_per_square_meter
%Circle{} -> Circle.area(shape) * cost_per_square_meter
end
end
end