Skip to content

Instantly share code, notes, and snippets.

@mattwynne
Forked from dchelimsky/composer.rb
Last active December 24, 2015 14:19
Show Gist options
  • Save mattwynne/6811764 to your computer and use it in GitHub Desktop.
Save mattwynne/6811764 to your computer and use it in GitHub Desktop.
require 'wrong/adapters/rspec'
require 'facets/proc/compose'
# (apply comp fns) in clojure
module Composer
def compose(lambdas)
lambdas.reduce(:*) || lambda {|x| x}
end
module_function :compose
end
describe Composer do
describe ".compose" do
it "returns identity with no fns" do
empty = Composer.compose([])
assert { empty.call(3) == 3 }
end
it "composes with 1 fns" do
double = ->(x) { x + x }
composed_double = Composer.compose([double])
assert { composed_double.call(3) == 6 }
end
it "composes with 2 fns" do
double = ->(x) { x + x }
square = ->(x) { x * x }
square_double = Composer.compose([square, double])
assert { square_double.call(3) == 36 }
end
it "composes with 3 fns" do
double = ->(x) { x * 2 }
triple = ->(x) { x * 3 }
square = ->(x) { x * x }
square_double_triple = Composer.compose([square, double, triple])
assert { square_double_triple.call(3) == 18*18 }
end
it "composes with no-arg fn at end" do
double = ->(x) { x * 2 }
triple = ->(x) { x * 3 }
square = ->(x) { x * x }
three = -> (){3}
square_double_triple = Composer.compose([square, double, triple, three])
assert { square_double_triple.call == 18*18 }
end
end
end
@dchelimsky
Copy link

@mattwynne - I think I prefer the original implementation plus @tomstuart's suggestions over reducing with :* since that's not part of Ruby core, and * is not really intention revealing. WDYT?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment