Skip to content

Instantly share code, notes, and snippets.

View Adzz's full-sized avatar

Adam Lancaster Adzz

View GitHub Profile
# Make some shapes
defmodule Square do
defstruct [:side]
end
defmodule Circle do
defstruct [:radius]
end
defmodule Square do
defstruct [:side]
end
defmodule Circle do
defstruct [:radius]
end
defprotocol Area do
defmodule Square do
defstruct [:side]
end
defmodule Circle do
defstruct [:radius]
end
defprotocol Area do
Shape.calculate(:area, %Square{side: 10})
defmodule Square do
defstruct [:side]
end
defmodule Area do
defstruct []
end
defprotocol Shape do
def calculate(calculation, shape)
defmodule Circle do
defstruct [:radius]
end
defimpl AreaProtocol, for: Circle do
def calculate(%Circle{radius: radius}) do
3.14 * radius * radius
end
end
defmodule Perimeter do
defstruct []
end
defprotocol PerimeterProtocol do
def calculate(shape)
end
defimpl Shape, for: Perimeter do
def calculate(%Perimeter{}, shape) do
defmodule Square do
defstruct [:side]
end
defmodule Circle do
defstruct [:radius]
end
defmodule Area do
def calculate(shape) do
defprotocol Perimeter do
def calculate(shape)
end
defimpl Perimeter, for: Square do
def calculate(square) do
square.side * 4
end
end
defmodule Perimeter do
def calculate(shape) do
case shape do
%Square{side: side} -> side * 4
%Circle{radius: radius} -> radius * 2 * 3.14
end
end
end
Perimeter.calculate(%Square{side: 10}) #=> 40