plymio_funcio v0.1.0 Plymio.Funcio.Predicate View Source

Predicate Functions.

See Plymio.Funcio for an overview and documentation terms.

Link to this section Summary

Functions

reduce_and_predicate1_funs/1 validates the argument is a one or more predicate/1 functions and reduces them to a single predicate/1 function, returning {:ok, predicate}

reduce_or_predicate1_funs/1 validates the argument is a one or more predicate/1 functions and reduces them to a single predicate/1 function, returning {:ok, predicate}

Link to this section Types

Link to this section Functions

Link to this function reduce_and_predicate1_funs(funs) View Source
reduce_and_predicate1_funs(any()) ::
  {:ok, fun1_predicate()} | {:error, error()}

reduce_and_predicate1_funs/1 validates the argument is a one or more predicate/1 functions and reduces them to a single predicate/1 function, returning {:ok, predicate}.

Multiple predicates are AND-ed together to create a composite predicate will return true only if all of the individual predicates return true.

An AND-ed predicate can be used with e.g. Enum.filter/2 or Enum.reject/2.

Examples

iex> predicate1 = fn v -> is_integer(v) end
...> {:ok, and_predicate} = predicate1 |> reduce_and_predicate1_funs
...> false = :not_an_integer |> and_predicate.()
...> false = 3.14 |> and_predicate.()
...> true = 42 |> and_predicate.()
true

iex> predicates = [
...>   fn v -> is_integer(v) end,
...>   fn v -> v >= 5 end,
...>   fn v -> v < 10 end,
...> ]
...> {:ok, and_predicate} = predicates |> reduce_and_predicate1_funs
...> false = :not_an_integer |> and_predicate.()
...> false = 3.14 |> and_predicate.()
...> false = 4 |> and_predicate.()
...> false = 10 |> and_predicate.()
...> true = 5 |> and_predicate.()
...> true = 6 .. 9 |> Enum.all?(and_predicate)
true

iex> predicates = [fn v -> is_integer(v) end, fn _k,v -> v end]
...> {:error, error} = predicates |> reduce_and_predicate1_funs
...> error |> Exception.message |> String.starts_with?("predicate/1 function invalid")
true
Link to this function reduce_or_predicate1_funs(funs) View Source
reduce_or_predicate1_funs(any()) :: {:ok, fun1_predicate()} | {:error, error()}

reduce_or_predicate1_funs/1 validates the argument is a one or more predicate/1 functions and reduces them to a single predicate/1 function, returning {:ok, predicate}.

Multiple predicates are OR-ed together to create a composite predicate will return true if any of the individual predicates return true.

An OR-ed predicate can be used with e.g. Enum.filter/2.

When using a composite OR predicate with e.g. Enum.reject/2, it should be remembered that if any of individual predicates returns true, the composite predicate will return true and the reject “fail”.

Examples

iex> predicate1 = fn v -> is_integer(v) end
...> {:ok, or_predicate} = predicate1 |> reduce_or_predicate1_funs
...> false = :not_an_integer |> or_predicate.()
...> false = 3.14 |> or_predicate.()
...> true = 42 |> or_predicate.()
true

iex> predicates = [
...>   fn v -> is_atom(v) end,
...>   fn v -> is_binary(v) end,
...>   fn v -> is_integer(v) && v >= 5 end,
...>   fn v -> is_integer(v) && v < 10 end,
...> ]
...> {:ok, or_predicate} = predicates |> reduce_or_predicate1_funs
...> true = :not_an_integer |> or_predicate.()
...> true = "Hello World" |> or_predicate.()
...> false = 3.14 |> or_predicate.()
...> true = 4 |> or_predicate.()
...> true = 10 |> or_predicate.()
...> true = 5 |> or_predicate.()
...> true = 6 .. 9 |> Enum.any?(or_predicate)
true

iex> predicates = [fn v -> is_integer(v) end, fn _k,v -> v end]
...> {:error, error} = predicates |> reduce_or_predicate1_funs
...> error |> Exception.message |> String.starts_with?("predicate/1 function invalid")
true