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






















