Skip to content

Instantly share code, notes, and snippets.

@martinsvalin
Created June 3, 2015 19:07
Show Gist options
  • Save martinsvalin/6dad7c8182f846f772e7 to your computer and use it in GitHub Desktop.
Save martinsvalin/6dad7c8182f846f772e7 to your computer and use it in GitHub Desktop.
Elixir Weekday struct with Range.Iterator implementation
defmodule Weekday do
defstruct name: nil, number: nil
def monday, do: %Weekday{name: "Monday", number: 1}
def tuesday, do: %Weekday{name: "Tuesday", number: 2}
def wednesday, do: %Weekday{name: "Wednesday", number: 3}
def thursday, do: %Weekday{name: "Thursday", number: 4}
def friday, do: %Weekday{name: "Friday", number: 5}
def saturday, do: %Weekday{name: "Saturday", number: 6}
def sunday, do: %Weekday{name: "Sunday", number: 7}
end
defimpl Range.Iterator, for: Weekday do
def next(_first, _range) do
fn weekday ->
case weekday.number do
1 -> Weekday.tuesday
2 -> Weekday.wednesday
3 -> Weekday.thursday
4 -> Weekday.friday
5 -> Weekday.saturday
6 -> Weekday.sunday
7 -> Weekday.monday
end
end
end
def count(_, first..last) do
if first.number <= last.number do
last.number + 1 - first.number
else
last.number + 8 - first.number
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment