[macruby-changes] [3448] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Mon Feb 8 15:04:22 PST 2010
Revision: 3448
http://trac.macosforge.org/projects/ruby/changeset/3448
Author: ernest.prabhakar at gmail.com
Date: 2010-02-08 15:04:22 -0800 (Mon, 08 Feb 2010)
Log Message:
-----------
Preliminary Dispatch mapreduce
Modified Paths:
--------------
MacRuby/trunk/lib/dispatch/enumerable.rb
MacRuby/trunk/spec/macruby/library/dispatch/enumerable_spec.rb
Modified: MacRuby/trunk/lib/dispatch/enumerable.rb
===================================================================
--- MacRuby/trunk/lib/dispatch/enumerable.rb 2010-02-08 23:04:12 UTC (rev 3447)
+++ MacRuby/trunk/lib/dispatch/enumerable.rb 2010-02-08 23:04:22 UTC (rev 3448)
@@ -19,43 +19,48 @@
grp.wait
end
- # Parallel +inject+
- # Requires initial value since 'first' no longer special.
- # Only works if result doesn't depend on the order elements are processed.
- def p_inject(initial, &block)
- @result = Dispatch.wrap(initial)
- self.p_each { |obj| block.call(@result, obj) }
- @result._done
- return @result
- end
-
# Parallel +collect+
+ # Results match the order of the original array
def p_map(&block)
result = Dispatch.wrap(Array)
self.p_each_with_index do |obj, i|
result[i] = block.call(obj)
end
- result
+ result._done_
end
+ # Parallel +collect+ plus +inject+
+ # Accumulates in +result+ via +op+ (default = '<<')
+ # Only works if result doesn't depend on the order elements are processed.
+ def p_mapreduce(result=[], op=:<<, &block)
+ raise ArgumentError if not result.respond_to? :op
+ p_result = Dispatch.wrap(result)
+ self.p_each_with_index do |obj, i|
+ val = block.call(obj)
+ p_result.send(op, val)
+ end
+ p_result
+ ._done_
+ end
+
+
# Parallel +select+; will return array of objects for which
# +&block+ returns true.
- # Useful if the test block is very expensive to run
def p_find_all(&block)
- @found_all = Dispatch.wrap(Array)
- self.p_each { |obj| @found_all << obj if block.call(obj) }
- @found_all._done # will this leak?
+ found_all = Dispatch.wrap(Array)
+ self.p_each { |obj| found_all << obj if block.call(obj) }
+ found_all._done # will this leak?
end
# Parallel +detect+; will return -one- match for +&block+
# but it may not be the 'first'
- # Useful if the test block is very expensive to run
+ # Only useful if the test block is very expensive to run
def p_find(&block)
- @found = Dispatch.wrap(nil)
+ found = Dispatch.wrap(nil)
self.p_each do |obj|
- found = @found.nil? ? block.call(obj) : nil
- @found = obj if found and @found.nil?
+ found = found.nil? ? block.call(obj) : nil
+ found = obj if found and found.nil?
end
- @found._done # will this leak?
+ found._done # will this leak?
end
end
Modified: MacRuby/trunk/spec/macruby/library/dispatch/enumerable_spec.rb
===================================================================
--- MacRuby/trunk/spec/macruby/library/dispatch/enumerable_spec.rb 2010-02-08 23:04:12 UTC (rev 3447)
+++ MacRuby/trunk/spec/macruby/library/dispatch/enumerable_spec.rb 2010-02-08 23:04:22 UTC (rev 3448)
@@ -30,8 +30,14 @@
it "exists on objects that support Enumerable" do
@ary.respond_to?(:p_each).should == true
end
+
it "behaves like each_with_index" do
- @ary.should.respond_to? :p_each_with_index
+ @sum1 = 0
+ @ary.each_with_index {|v, i| @sum1 += v**i}
+ @sum2 = 0
+ @q = Dispatch.queue_for(@sum2)
+ @ary.p_each_with_index {|v, i| temp = v**i; @q.sync {@sum2 += temp} }
+ @sum1.should == @sum2
end
it "executes concurrently" do
@@ -39,19 +45,6 @@
end
end
- describe :p_inject do
- it "exists on objects that support Enumerable" do
- @ary.respond_to?(:p_each).should == true
- end
- it "behaves like inject" do
- @ary.should.respond_to? :p_inject
- end
-
- it "executes concurrently" do
- true.should == true
- end
- end
-
describe :p_map do
it "exists on objects that support Enumerable" do
@ary.respond_to?(:p_each).should == true
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100208/5f1db26c/attachment.html>
More information about the macruby-changes
mailing list