This repository has been archived on 2021-12-03. You can view files and clone it, but cannot push or open issues/pull-requests.
functional/lib/functional.rb

47 lines
842 B
Ruby
Raw Normal View History

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
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
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