Functional
This library facilitates writing code in a more functional style inside Ruby. How this is fun.
Installation
Add this line to your application's Gemfile:
gem 'functional'
And then execute:
$ bundle
Or install it yourself as:
$ gem install functional
Usage
The library provides two different styles. One style builds on Lambda's and another style uses meta-programming. The lambda style is a bit more pure but is currently just a bit slower in performance.
Lambda Style
The lambda style allows you to write functions like this
require 'functions'
module PreludeLambdaUsage
include Functions::Prelude
Power = ->(p,x) { x**p }.curry
Square = Power.(2)
Squares = Map.(Square)
Sum_Of_Squares2 = Sum < Squares
Average = After.( [Sum,Length] ).( Divide )
Gcd = ->(a,b) { (Divisors.(a) & Divisors.(b)).max } # literal translation of the definition, just as an example
# Gcd of an array
GcdA1 = Max < Intersect < Map.(Divisors) # literal translation of the definition
GcdA2 = ReduceLeft.(Gcd) # faster
# Lcm of an array in function of Lcm of a pair
LcmA = ReduceLeft.(Lcm) # the same but without arguments
end
Meta Style
The meta style allows you to write functions like this
require 'functions'
module PreludeMetaUsage
include Functions::PreludeMeta
def power(x, p) x ** p end
def square(x) power(x, 2) end
define :squares, as: { map: :square }
define :evens, as: { filter: :even? }
define :sum_of_squares_tris, as: { compose: [:sum, :squares] }
define :average, as: { :after => [ :sum_length, :divide ] }
define :sum, as: { foldl: [:add, 0]}
end
License
This code is currently copyrighted under the AGPL license. See http://www.gnu.org/licenses/agpl.html for more information.

Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request