Horizontal vs vertical piping

I have nothing against horizontal piping as long at it doesn’t generate too long lines (my limit is about 80 characters).
If the line gets too long I would break it to use vertical piping.

I have stronger opinions about directly passing the variable to the first function call though. Consider the following example:

transform1(variable, :option)
|> transform2(:another_option)

The variable that gets passed to transform1() is the beginning of the piping, but I have to read the code carefully to notice that. The thing gets aggravated when using horizontal piping or functions with long names and multiple arguments.

transform1(variable, :option) |> transform2(:another_option)

On the other side, piping the variable to the first function call makes it explicit and I can recognise the actual data flow and transformations while quickly scanning the code.

variable
|> transform1(:option)
|> transform2(:another_option)

#or

variable |> transform1(:option) |> transform2(:another_option)

EDIT: I’ve been taking a look at Credo’s style guide and found this:

It is preferred to start pipe chains with a “pure” value rather than a function call.

# preferred way - this is very readable due to the clear flow of data
username
|> String.strip
|> String.downcase

# also okay - but often slightly less readable
String.strip(username)
|> String.downcase
5 Likes