Arithmetic Operators with Pipe Operator

Hello, i just have on doubt, is about code design, i have this case:

  def searched_for?(user_id, term) do
    search_length = from(se in Project.Search, 
                         where: ilike(se.keywords, ^"%#{term}%") and se.user_id == ^user_id, 
                         select: se.id)
      |> Project.Repo.all
      |> length
    search_length > 0
  end

As your guys can see i needed create the variable search_length to compare in the final result, have some way to put arythmetic operators in the pipe operator ? i tried |> >(0) and |> != 0 but without succeded.

1 Like

Yes, there is!

All of the common operators are actually simple functions in the Kernel namespace, and can be called like a normal function by prefixing them with their namespace:

3 |> Kernel.+(2).

9 Likes

If you want to use the pipe with arythmetic operators you can do this for example 1 |> Kernel.>(2).

EDIT: sorry for the duplicate answer, @Qqwy must be faster at typing than me! :slight_smile:

4 Likes

Oh, just worked fine, thank you guys for the quick replies. =)

1 Like

Besides of the ways that were already shown to you, you can always write another function or use an anonymous one, even the anonymous syntax is a biz counterintuitive in pipes:

iex(1)> defmodule F, do: def greater(a, b), [do: a > b]
{:module, F,
 <<70, 79, 82, 49, 0, 0, 4, 216, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 161,
   131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115,
   95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>, {:greater, 2}}
iex(2)> import F
F
iex(3)> 1 |> greater(2)
false
iex(4)> 1 |> (fn (a, b) -> a > b end).(2)
false
iex(5)> 1 |> (&(&1 > &2)).(2)
false

Using single arity anonymous functions is possible as well:

iex(6)> 1 |> (&(&1 > 0)).() # these pair of parens is important!
true
4 Likes