2010-04-19 20:22:54 +02:00
|
|
|
|
|
|
|
class Functional
|
|
|
|
include Enumerable
|
|
|
|
|
|
|
|
def self.method_missing meth, *args, &exe
|
|
|
|
self.new.send meth, *args, &exe
|
|
|
|
end
|
|
|
|
|
|
|
|
def push_method code, *args, &exe
|
|
|
|
name = "__meth_#{exe.object_id}"
|
|
|
|
define_singleton_method name, &exe
|
2010-04-19 23:01:42 +02:00
|
|
|
@stack.push code % name
|
2010-04-19 20:22:54 +02:00
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
def initialize obj = nil, func = nil, *args
|
|
|
|
@stack, @obj, @func, @args = [], obj, func, args
|
|
|
|
end
|
|
|
|
|
|
|
|
def collect &exe
|
|
|
|
push_method "value=%s(value)", &exe
|
|
|
|
end
|
|
|
|
|
|
|
|
# map/reduce?
|
|
|
|
def map &exe
|
2010-04-19 21:22:30 +02:00
|
|
|
raise "Reserved for MapReduce."
|
|
|
|
end
|
|
|
|
|
|
|
|
# map/reduce?
|
|
|
|
def reduce &exe
|
|
|
|
raise "Reserved for MapReduce."
|
2010-04-19 20:22:54 +02:00
|
|
|
end
|
2010-04-19 21:08:49 +02:00
|
|
|
|
2010-04-19 20:22:54 +02:00
|
|
|
def select &exe
|
|
|
|
push_method "%s(value)||next", &exe
|
|
|
|
end
|
|
|
|
|
|
|
|
def delete_if &exe
|
|
|
|
push_method "%s(value)&&next", &exe
|
|
|
|
end
|
|
|
|
|
2010-04-19 21:22:30 +02:00
|
|
|
def each &exe
|
|
|
|
return self unless exe
|
2010-04-19 23:01:42 +02:00
|
|
|
@obj.send @func||:each, *@args, &eval( "lambda{|value|#{@stack.join ";"};exe.call(value)}")
|
2010-04-19 20:22:54 +02:00
|
|
|
end
|
|
|
|
end
|