examples/01.rb
# frozen_string_literal: true
raise 'Wrong Ruby version!' unless RUBY_VERSION >= '2.6.0'
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'ruby-lambdas', require: 'ruby/lambdas'
gem 'benchmark-ips', '~> 2.7', '>= 2.7.2'
end
############
# Examples #
############
#
# Using common Method Chaining
#
def slugify2(value)
value.strip.downcase.gsub(' ', '-')
end
#
# Using Composable Lambdas
#
# -- Alternative syntax --
Slugify = # Slugify =
Strings::Strip # Strings::Trim \
.>> Strings::Downcase # >> Strings::LowerCase \
.>> Strings::GSub[' ', '-'] # >> Strings::ReplaceAll[' ', '-']
# -- Alternative syntax --
slug = Slugify.(' I WILL be a url slug ') # Slugify.call(' I WILL be a url slug ')
# Slugify[' I WILL be a url slug ']
p slug # => "i-will-be-a-url-slug"
#
# Using Data Pipeline with the `then` method & `ruby/lambdas`
#
def slugify(value)
value
.then(&Strings::Trim)
.then(&Strings::LowerCase)
.then(&Strings::ReplaceAll[' ', '-'])
end
p slugify(' I will be a url SLUG ') # => "i-will-be-a-url-slug"
##############
# Benchmarks #
##############
require 'benchmark/ips'
Benchmark.ips do |x|
x.report('method chaining') { slugify2(' I WILL be a url slug ') }
x.report('compose (.>>)') { Slugify.(' I WILL be a url slug ') }
x.report('pipeline (.then)') { slugify(' I WILL be a url slug ') }
x.compare!
end
# ruby -v examples/01.rb
# ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-darwin17]
# Warming up --------------------------------------
# method chaining 41.639k i/100ms
# compose (.>>) 41.931k i/100ms
# pipeline (.then) 32.379k i/100ms
# Calculating -------------------------------------
# method chaining 464.961k (± 1.9%) i/s - 2.332M in 5.016985s
# compose (.>>) 470.854k (± 1.6%) i/s - 2.390M in 5.077433s
# pipeline (.then) 351.887k (± 2.2%) i/s - 1.781M in 5.063616s
# Comparison:
# compose (.>>): 470853.9 i/s
# method chaining: 464960.6 i/s - same-ish: difference falls within error
# pipeline (.then): 351887.1 i/s - 1.34x slower