From 63d4cbb8156a6667ccf3db0fd877f4307b010114 Mon Sep 17 00:00:00 2001 From: Denis Knauf Date: Mon, 19 Apr 2010 20:22:54 +0200 Subject: [PATCH] functional --- lib/functional.rb | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lib/functional.rb diff --git a/lib/functional.rb b/lib/functional.rb new file mode 100644 index 0000000..fbb7a93 --- /dev/null +++ b/lib/functional.rb @@ -0,0 +1,46 @@ + +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 + @stack.push [code % name]+args + 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 + +=begin + # map/reduce? + def map &exe + push_method "value=%s(value)", &exe + end +=end + def select &exe + push_method "%s(value)||next", &exe + end + + def delete_if &exe + push_method "%s(value)&&next", &exe + end + + def each obj, &exe + return Enumerator.new self, :each, obj unless exe + obj.each &eval( "lambda{|value|#{@stack.join( ";")};exe.call(value)}") + end + + def inject obj, start, &exe + each( obj).inject start, &exe + end +end