lessless

lessless

Horizontal vs vertical piping

Hello,

In the Elixir codebase most wide-adopted pipe operator usage style is vertical piping:

variable
|> transform1(:another_option)
|> transform2

but horizontal piping is also present, though it’s rarer

variable |> transform1(:another_option) |> transform2

What are your thoughts about horizontal vs vertical piping? When use which? What’s your opinion about passing variable directly to the first function call vs piping it, i.e. transform1(variable, :another_option) vs variable |> transform1(:another_option)?

First 3 of 3 Posts Switch mode

belaustegui

belaustegui

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
NobbZ

NobbZ

I think this is much of a personal style or habbit.

I do prefer vertical pipes, but I do use horizontals in single-line assignments if there are not more than 2 pipe operators.

The main reason for prefering vertical pipes is, that you can spot them on a glance even when you are not in a highlighting editor, just because the aligned pipe operators set a very bold statement.

Qqwy

Qqwy

TypeCheck Core Team

The only uses for horizontal piping are either very trivial (i.e. short) sequences, or in IEx, as it will end a statement as soon as you hit return, even if you actually wanted to place a |> on the next line.

In most code, I (and I believe most of the other people in the community) agree that it is better to use vertical pipes, because they remain readable even when the amount of nested statements increases at a later time.

— All posts loaded —

Where Next?

Trending in Discussions Top

AstonJ
As the title says, please share what you’ve been up to with Elixir. Whether that’s been learning it, looking into it, making stuff with i...
2977 91561 914
New
byu
@chrismccord : I just saw the Extract AGENTS.md from Phoenix.new into phx.new generator commit to the phoenix project. My initial shotgu...
New
arcanemachine
I was working on an Ecto migration and I needed a timestamp. So, for the nth time, I looked up the different data types for timestamps, a...
New
AstonJ
Just a general thread to post chat/news/info relating to AI/ML stuff that may be relevant for Nx now or in the future. Got anything to sh...
New
type1fool
I just stumbled on a newly redesigned elixir-lang.org. :tada: It looks like @Software_Mansion did the work, and I think it is generally a...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
alexslade
Fly’s CEO posted this recently - Turn And Face The Strange · The Fly Blog It says that Fly is going all-in on sprites, which is a worry ...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
akoutmos
@hugobarauna and I (Alex Koutmos) have been hard at work on writing a book on Nerves that takes you from simply blinking LEDs to building...
New
bjorng
We want to introduce a new native datatype to Erlang: native records. Although replacing all tuple records with native records is not our...
New

We're in Beta

About us Mission Statement