Equalable v0.1.1 Eq View Source
Utilities which help to implement and use Equalable
protocol for pair of types/values
Link to this section Summary
Functions
Infix shortcut for Eq.not_equal?/2
Examples
iex> use Eq
Eq
iex> 1 <|> 1
false
iex> 1 <|> :hello
true
Infix shortcut for Eq.equal?/2
Imports Eq.defequalable/3
, Eq.<~>/2
and Eq.<|>/2
macro helpers
Helper to define symmetric equivalence relation,
accepts two term :: type
pairs
and block of code where relation is described
Is left equivalent to right?
Here are provided examples for standard Erlang types,
for more complex examples look defequalable/3
documetation
Is left not equivalent to right?
For more complex examples look equal?/2
and defequalable/3
documetation
Link to this section Types
left()
View Source
left() :: term()
left() :: term()
right()
View Source
right() :: term()
right() :: term()
Link to this section Functions
left <|> right View Source (macro)
Infix shortcut for Eq.not_equal?/2
Examples
iex> use Eq
Eq
iex> 1 <|> 1
false
iex> 1 <|> :hello
true
left <~> right View Source (macro)
Infix shortcut for Eq.equal?/2
Examples
iex> use Eq
Eq
iex> 1 <~> 1
true
iex> 1 <~> :hello
false
__using__(_) View Source (macro)
Imports Eq.defequalable/3
, Eq.<~>/2
and Eq.<|>/2
macro helpers
Examples
iex> use Eq
Eq
iex> 1 <~> 1
true
iex> 1 <|> 2
true
defequalable(arg1, arg2, list) View Source (macro)
Helper to define symmetric equivalence relation,
accepts two term :: type
pairs
and block of code where relation is described.
Examples
iex> quote do
...> use Eq
...> defmodule Foo do
...> defstruct [:value, :meta]
...> end
...> defmodule Bar do
...> defstruct [:value, :meta]
...> end
...> defequalable %Foo{value: left} :: Foo, %Foo{value: right} :: Foo do
...> Eq.equal?(left, right)
...> end
...> defequalable %Foo{value: left} :: Foo, %Bar{value: right} :: Bar do
...> Eq.equal?(left, right)
...> end
...> defequalable %Foo{value: left} :: Foo, right :: Integer do
...> Eq.equal?(left, right)
...> end
...> end
...> |> Code.compile_quoted
iex> quote do
...> x = %Foo{value: 1, meta: 1}
...> y = %Foo{value: 1, meta: 2}
...> Eq.equal?(x, y) && Eq.equal?(y, x)
...> end
...> |> Code.eval_quoted
...> |> elem(0)
true
iex> quote do
...> x = %Foo{value: 1, meta: 1}
...> y = %Bar{value: 1, meta: 2}
...> Eq.equal?(x, y) && Eq.equal?(y, x)
...> end
...> |> Code.eval_quoted
...> |> elem(0)
true
iex> quote do
...> x = %Foo{value: 1, meta: 1}
...> y = 1
...> Eq.equal?(x, y) && Eq.equal?(y, x)
...> end
...> |> Code.eval_quoted
...> |> elem(0)
true
equal?(left, right) View Source
Is left equivalent to right?
Here are provided examples for standard Erlang types,
for more complex examples look defequalable/3
documetation.
Examples
iex> Eq.equal?(1, 1)
true
iex> Eq.equal?(1, 1.0)
true
iex> Eq.equal?(1, 2)
false
iex> Eq.equal?(1, :hello)
false
iex> Eq.equal?([1, 2, 3], [1, 2, 3])
true
iex> Eq.equal?([[1, 2, 3], [4]], [[1, 2, 3], [4]])
true
iex> Eq.equal?([1, 2, 3], [1, 2])
false
iex> Eq.equal?([[1, 2, 3], [4]], [[1, 2, 3], [5]])
false
iex> Eq.equal?({1, 2, 3}, {1, 2, 3})
true
iex> Eq.equal?({{1, 2, 3}, {4}}, {{1, 2, 3}, {4}})
true
iex> Eq.equal?({1, 2, 3}, {1, 2})
false
iex> Eq.equal?({{1, 2, 3}, {4}}, {{1, 2, 3}, {5}})
false
iex> Eq.equal?(%{a: 1, b: 2}, %{a: 1, b: 2})
true
iex> Eq.equal?(%{a: 1, b: %{c: 2}}, %{a: 1, b: %{c: 2}})
true
iex> Eq.equal?(%{a: 1, b: 2}, %{a: 1})
false
iex> Eq.equal?(%{a: 1, b: 2}, %{a: 1, c: 2})
false
iex> a = 1
iex> x = URI.parse("http://hello.world")
iex> y = URI.parse("http://foo.bar")
iex> z = URI.parse("http://foo.bar")
iex> Eq.equal?(a, x)
false
iex> Eq.equal?(x, a)
false
iex> Eq.equal?(x, y)
false
iex> Eq.equal?(y, x)
false
iex> Eq.equal?(y, z)
true
iex> Eq.equal?(z, y)
true
not_equal?(left, right) View Source
Is left not equivalent to right?
For more complex examples look equal?/2
and defequalable/3
documetation.
Examples
iex> Eq.not_equal?(1, 0)
true
iex> Eq.not_equal?(1, 1)
false