select, collect, .... all these methods work like a breadth-first search. With functional, it will work like a depth-first search. It's not faster, but it needs lesser memory.
This repository has been archived on 2021-12-03. You can view files and clone it, but cannot push or open issues or pull requests.
Find a file
Denis Knauf 145129641d v0.1.5
2011-12-16 12:45:52 +01:00
lib v0.1.5 2011-12-16 12:45:52 +01:00
test more tests 2011-12-16 12:45:22 +01:00
.gitignore ignore pkg-dir 2011-11-24 11:50:08 +01:00
AUTHORS ready for gem 2010-04-19 21:08:49 +02:00
LICENSE ready for gem 2010-04-19 21:08:49 +02:00
Rakefile ready for gem 2010-04-19 21:08:49 +02:00
README.md README.md: methodphitamine & makros. VERSION 0.1.3 2011-11-24 11:47:03 +01:00
VERSION v0.1.5 2011-12-16 12:45:52 +01:00

Install

gem install functional

Usage

require 'functional'

# To demonstrate Functional, we create a Class with a infinite loop:
class Sequence
	include Enumerable
	def initialize first = 0, step = 1
		@i, @step = first, step
	end
	def each
		# Our infinite loop:
		loop do
			yield @i
			@i += @step
		end
	end
end

Functional.new( Sequence.new).
	select {|i| i.even? }.
	collect {|i| i/3 }.
	select {|i| i.even?}.
	collect {|i| [[[[[[i.even?, i.odd?]]], i, [[[[[[i.class]]]]]]]]] }.
	flatten. # It flattens everything! Not like: collect {|i| i.flatten }.
	p

# Without Functional... Bye bye.
Sequence.new.
	select {|i| i.even? }.
	collect {|i| i/3 }.
	select {|i| i.even?}.
	collect {|i| [[[[[[i.even?, i.odd?]]], i, [[[[[[i.class]]]]]]]]] }.
	flatten. # It flattens everything! Not like: collect {|i| i.flatten }.
	p

It will never realize, that #p doesn't exists, because the first select runs endless. Functional#p prints everything to stdout.

(0..100000).to_fun.
	collect {|i| i*3 }.
	select {|i| i%5 == 2 }.
	to_a

Thanks to Symbol#to_proc:

Sequence.new.to_fun.
	select( &:even?).
	collect {|i| i/3 }.
	select( &:even?).
	collect {|i| [[[[[[i.even?, i.odd?]]], i, [[[[[[i.class]]]]]]]]] }.
	flatten. # It flattens everything! Not like: collect {|i| i.flatten }.
	p

If you know methodphitamine, combine it:

require 'methodphitamine'

Sequence.new.to_fun.
	select( &it.even?).
	collect( &it/3).
	select( &it.even?).
	collect {|i| [[[[[[i.even?, i.odd?]]], i, [[[[[[i.class]]]]]]]]] }.
	flatten.
	p

(0..100000).to_fun.
	collect( &it*3).
	select( &it%5 == 2).
	to_a

Makros

seq = Sequence.new.to_fun
seq = seq.select &it.even?  if must_be_even
seq = seq.
	collect( &it/3).
	select( &it.even?).
	collect {|i| [[[[[[i.even?, i.odd?]]], i, [[[[[[i.class]]]]]]]]] }
seq = seq.flatten  if please_flatten
if print_it
	seq.p
else
	seq_to_a
end

What's with #map?

Do you know MapReduce? In future #map will be used for MapReduce. Use #collect.