Make `mix format` work with pipeline macros

Background

I use a library that defines a new pipeline macro, the triple arrow >>>. So in my code, it is normal to have something like this:

def safe_div(a, b), do:
  a 
  |> divide(b)
  >>> handle_result()

This magic here is in handle_result. What the >>> does is not important, what matters here is that this is a type of format that I want to see in my code.

Problem

The problem here is the mix format does not know how that it should treat >>> as it treats |>. So inevitably my code becomes:

def safe_div(a, b), do:
  a 
  |> divide(b) >>> handle_result()

Which is very ugly and impossible to read for larger functions.

I have tried to find a way to change mix format's configuration to fix this issue, unfortunately I was not able to find anything.

Question

  • Can I configure mix format to treat >>> as a |> ?
  • If not, would it be a bad idea to make a PR where people would be allowed to define “pipelike” operators/macros, thus telling mix format how to behave?

Basically, what options do I have here ?

I cannot validate it now, but I guess >>>/2 macro should inject end_of_expression: [newlines: 1] or like into meta (second tuple element) of the corresponding AST it produces.

Somewhat like here.

Quite interesting. So I would have to change the code of the library I am using, right?

Here are the operators we consider pipeline like: elixir/formatter.ex at v1.11.4 · elixir-lang/elixir · GitHub

>>> isn’t one because it is also used as a Bitwise operator by Elixir.

3 Likes

Well, better change the operator to one of those considered pipes already, but if the consumer code is already full of calls and you don’t want to stick to it, change the >>>/2 itself. If I am not mistaken with the approach.

@josevalim and @mudasobwa Thank you all for your support and answers. I will now see what I can do!