Current section
Files
Jump to
Current section
Files
lib/data.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.
defmodule Data do
@spec contains?(Data.Contains.t | Data.Sequence.t, any) :: any
def contains?(self, what) do
cond do
mod = Data.Contains.impl_for(self) ->
mod.contains?(self, what)
Enumerable.impl_for(self) ->
Enum.member?(self, what)
true ->
Data.Seq.contains?(self, what)
end
end
@spec seq(Data.Sequence.t | Data.Sequenceable.t | Data.Listable.t) :: Data.Sequence.t
def seq([]) do
nil
end
def seq(nil) do
nil
end
def seq(self) when is_list(self) do
self
end
def seq(self) when is_binary(self) do
self
end
def seq(self) do
cond do
empty?(self) ->
nil
Data.Sequence.impl_for(self) ->
self
mod = Data.Sequenceable.impl_for(self) ->
mod.to_sequence(self)
true ->
to_list(self)
end
end
@spec peek(Data.Peekable.t) :: any
@spec peek(Data.Peekable.t, any) :: any
def peek(self, default \\ nil) do
Data.Peekable.peek(self, default)
end
@spec peek!(Data.Peekable.t) :: any | no_return
def peek!(self) do
Data.Peekable.peek!(self)
end
@spec reduce(Data.Reducible.t, any, ((any, any) -> any)) :: any
def reduce(self, acc, fun) do
Data.Reducible.reduce(self, acc, fun)
end
@spec foldr(Data.Foldable.t, any, ((any, any) -> any)) :: any
def foldr(self, acc, fun) do
Data.Foldable.foldr(self, acc, fun)
end
@spec empty?(Data.Empytable.t | Data.Sequence.t) :: Data.Emptyable.t
def empty?(nil) do
true
end
def empty?([]) do
true
end
def empty?(list) when is_list(list) do
false
end
def empty?(self) do
cond do
mod = Data.Emptyable.impl_for(self) ->
mod.empty?(self)
mod = Data.Sequenceable.impl_for(self) ->
mod.to_sequence(self) == nil
mod = Data.Listable.impl_for(self) ->
mod.to_list(self) == []
true ->
false
end
end
@spec clear(Data.Emptyable.t) :: Data.Emptyable.t
def clear(self) do
Data.Emptyable.clear(self)
end
@spec count(Data.Counted.t | Data.Sequence.t | Enumerable.t) :: Data.Counted.t | Enumerable.t
def count(self) do
cond do
mod = Data.Counted.impl_for(self) ->
mod.count(self)
Data.Sequence.impl_for(self) ->
Data.Seq.count(self)
Data.Sequenceable.impl_for(self) ->
Data.Seq.count(self)
Enumerable.impl_for(self) ->
Enum.count(self)
end
end
@spec count(Data.Sequence.t | Enumerable.t, (any -> boolean)) :: Data.Counted.t | Enumerable.t
def count(self, pred) do
cond do
Data.Sequence.impl_for(self) ->
Data.Seq.count(self, pred)
Data.Sequenceable.impl_for(self) ->
Data.Seq.count(self, pred)
Enumerable.impl_for(self) ->
Enum.count(self, pred)
end
end
@spec reverse(Data.Reversible.t) :: Data.Reversible.t
def reverse(self) do
Data.Reversible.reverse(self)
end
@spec to_list(list | Data.Listable.t | Data.Sequence.t | Enumerable.t) :: list
def to_list(self) when is_list(self) do
self
end
def to_list(nil) do
[]
end
def to_list(self) do
cond do
mod = Data.Listable.impl_for(self) ->
mod.to_list(self)
mod = Data.Sequence.impl_for(self) ->
mod.to_list(self)
Data.Sequenceable.impl_for(self) ->
Data.Seq.to_list(self)
Enumerable.impl_for(self) ->
Enum.to_list(self)
end
end
end