Proc Composition Operator in Ruby #functionalruby
Function composition is really nice, and having a clean way to do it is important. Ruby 2.6 introduced a really neat way of handling it with procs
:
add_self = ->x { x + x }
mult_self = ->x { x * x }
add_and_mult = add_self << mult_self
add_and_mult[3] # 18
If you want the application to be reversed:
add_self = ->x { x + x }
mult_self = ->x { x * x }
add_and_mult = add_self >> mult_self
add_and_mult[3] # 36
This can be made into a way of building up pipelines for single argument procs by declaring them in an Array and using #inject
with an identity proc
:
calculations = [
->x { x / 3 },
->x { x + 5 },
->x { x * 2 }
]
pipeline = calculations.inject(->x {x}) do |built, func|
build << func
end
pipeline[3] # 8
This can be super cool for things like ActiveRecord
objects where you want to chain certain operations without necessarily making them explicit methods via scope
s or similar.