[ruby-core:90501] [Ruby trunk Feature#14392] Pipe operator

From: sean.m.huber@...
Date: 2018-12-13 09:51:05 UTC
List: ruby-core #90501
Issue #14392 has been updated by shuber (Sean Huber).


@dsferreira @zverok @shevegen @bughit

How do you feel about the syntax from this working proof of concept? https://github.com/LendingHome/pipe_operator

    "https://api.github.com/repos/ruby/ruby".pipe do
      URI.parse
      Net::HTTP.get
      JSON.parse.fetch("stargazers_count")
      yield_self { |n| "Ruby has #{n} stars" }
      Kernel.puts
    end
    #=> Ruby has 15120 stars

    -9.pipe { abs; Math.sqrt; to_i } #=> 3

    # Method chaining is supported:
    -9.pipe { abs; Math.sqrt.to_i } #=> 3

    # Pipe | for syntactic sugar:
    -9.pipe { abs | Math.sqrt.to_i } #=> 3

    [9, 64].map(&Math.pipe.sqrt)           #=> [3.0, 8.0]
    [9, 64].map(&Math.pipe.sqrt.to_i.to_s) #=> ["3", "8"]


----------------------------------------
Feature #14392: Pipe operator
https://bugs.ruby-lang.org/issues/14392#change-75659

* Author: dsferreira (Daniel Ferreira)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
I would like to see implemented in ruby a pipe operator as we have in elixir.

An example of application I have in mind is this:

```ruby
class Foo

  def bar(var)
    puts “Hello #{var}!”
  end |> private
  
  def baz(arg)
    bar(arg)
  end 
 
end

foo = Foo.new
foo.baz("Fred") # => "Hello Fred!"
```

It can also help simplify method chains:

```ruby
class Secret

  def initialise(user, password)
    @user = user
    @password = password
  end

  def second_pass(encrypted_string)
    encrypted_string.chain_4.chain_5.chain_6
  end |> private

  ##
  #  Super encryption

  def super_encryption
    @password.chain_1.chain_2.chain_3
      |> second_pass
  end |> public

end
```

And also simplify codes like this:

```ruby
class Foo

  def bar(*args)
    baz = args.select { |arg| arg =~ /regex/ }.first
    good?(baz)
  end

  public :bar

  def good(arg)
    arg.to_s.size > 10
  end
  
  private :good

end
```

to become:

```ruby
class Foo

  ##
  # Bar public method.

  def bar(*args)
    args.select { |arg| arg =~ /regex/ }.first
      |> good?
  end |> public

  def good(arg)
    arg.to_s.size > 10
  end |> private

end
```

Lots of local variables would be saved and I would expect some performance improvements with that.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next