Current section
Files
Jump to
Current section
Files
lib/data/protocol/sequence.ex
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
# Version 2, December 2004
#
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
#
# 0. You just DO WHAT THE FUCK YOU WANT TO.
alias Data.Protocol.Sequence, as: Protocol
defprotocol Protocol do
@type v :: any
@spec first(t) :: v
def first(self)
@spec next(t) :: t | nil
def next(self)
end
defimpl Protocol, for: Atom do
def first(self) do
self
end
def next(_) do
nil
end
end
defimpl Protocol, for: List do
def first([]) do
nil
end
def first([head | _]) do
head
end
def next([]) do
nil
end
def next([_]) do
nil
end
def next([_ | rest]) do
rest
end
end
defimpl Protocol, for: Range do
def first(first .. last) when first <= last or first > last do
first
end
def first(_ .. _) do
nil
end
def next(first .. last) when first == last do
nil
end
def next(first .. last) when first <= last do
first + 1 .. last
end
def next(first .. last) when first > last do
first - 1 .. last
end
end
defimpl Protocol, for: BitString do
def first(string) do
case String.next_grapheme(string) do
:no_grapheme ->
nil
{ first, _ } ->
first
end
end
def next(string) do
case String.next_grapheme(string) do
:no_grapheme ->
nil
{ _, "" } ->
nil
{ _, next } ->
next
end
end
end