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

Link to this section Functions

Link to this macro

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
Link to this macro

left <~> right View Source (macro)

Infix shortcut for Eq.equal?/2

Examples

iex> use Eq
Eq
iex> 1 <~> 1
true
iex> 1 <~> :hello
false

Imports Eq.defequalable/3, Eq.<~>/2 and Eq.<|>/2 macro helpers

Examples

iex> use Eq
Eq
iex> 1 <~> 1
true
iex> 1 <|> 2
true
Link to this macro

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
Link to this function

equal?(left, right) View Source
equal?(left(), right()) :: bool()

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
Link to this function

not_equal?(left, right) View Source
not_equal?(left(), right()) :: bool()

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