[macruby-changes] [3455] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Mon Feb 8 15:05:40 PST 2010
Revision: 3455
http://trac.macosforge.org/projects/ruby/changeset/3455
Author: ernest.prabhakar at gmail.com
Date: 2010-02-08 15:05:40 -0800 (Mon, 08 Feb 2010)
Log Message:
-----------
Create and pass spec for Enumerable#p_find
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:05:29 UTC (rev 3454)
+++ MacRuby/trunk/lib/dispatch/enumerable.rb 2010-02-08 23:05:40 UTC (rev 3455)
@@ -31,41 +31,50 @@
# Parallel +collect+ plus +inject+
# Accumulates from +initial+ via +op+ (default = '+')
+ # Note: each object can only run one mapreduce at a time
def p_mapreduce(initial, op=:+, &block)
+ raise ArgumentError if not initial.respond_to? op
+ # Since exceptions from a Dispatch block can act funky
@mapreduce_q ||= Dispatch::Queue.new("enumerable.p_mapreduce.#{object_id}")
- # Ideally should set from within a Dispatch.once to avoid race
- raise ArgumentError if not initial.respond_to? op
- # Since exceptions from a Dispatch block act funky
+ # Ideally should run from within a Dispatch.once to avoid race
@mapreduce_q.sync do
- @result = initial
- q = Dispatch.queue_for(@result)
- p_each do |obj|
+ @mapreduce_result = initial
+ q = Dispatch.queue_for(@mapreduce_result)
+ self.p_each do |obj|
val = block.call(obj)
- q.async { @result = @result.send(op, val) }
+ q.async { @mapreduce_result = @mapreduce_result.send(op, val) }
end
q.sync {}
- return @result # can return from inside the block
+ return @mapreduce_result
end
end
-
# Parallel +select+; will return array of objects for which
# +&block+ returns true.
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._done_
end
# Parallel +detect+; will return -one- match for +&block+
# but it may not be the 'first'
# Only useful if the test block is very expensive to run
+ # Note: each object can only run one find at a time
+
def p_find(&block)
- found = Dispatch.wrap(nil)
- self.p_each do |obj|
- found = found.nil? ? block.call(obj) : nil
- found = obj if found and found.nil?
+ @find_q ||= Dispatch::Queue.new("enumerable.p_find.#{object_id}")
+ @find_q.sync do
+ @find_result = nil
+ q = Dispatch.queue_for(@find_result)
+ self.p_each do |obj|
+ if @find_result.nil?
+ found = block.call(obj)
+ q.async { @find_result = obj if found }
+ end
+ end
+ q.sync {} #if @find_result.nil?
+ return @find_result
end
- 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:05:29 UTC (rev 3454)
+++ MacRuby/trunk/spec/macruby/library/dispatch/enumerable_spec.rb 2010-02-08 23:05:40 UTC (rev 3455)
@@ -39,25 +39,18 @@
@ary.p_each_with_index {|v, i| temp = v**i; @q.sync {@sum2 += temp} }
@sum2.should == @sum1
end
-
- it "should execute concurrently" do
- true.should == true
- end
end
describe :p_map do
it "exists on objects that support Enumerable" do
@ary.respond_to?(:p_map).should == true
end
+
it "should behave like map" do
map1 = @ary.map {|v| v*v}
map2 = @ary.p_map {|v| v*v}
map2.should == map1
end
-
- it "should execute concurrently" do
- true.should == true
- end
end
describe :p_mapreduce do
@@ -85,11 +78,37 @@
sum2 = @ary.p_mapreduce(0, :|) {|v| v**2}
sum2.should == sum1
end
-
- it "should execute concurrently" do
- true.should == true
+ end
+
+ describe :p_find_all do
+ it "exists on objects that support Enumerable" do
+ @ary.respond_to?(:p_find_all).should == true
+ end
+
+ it "should behave like find_all" do
+ found1 = @ary.find_all {|v| v.odd?}
+ found2 = @ary.p_find_all {|v| v.odd?}
+ found2.sort.should == found1
end
end
+ describe :p_find do
+ it "exists on objects that support Enumerable" do
+ @ary.respond_to?(:p_find).should == true
+ end
+
+ it "returns nil if nothing found" do
+ found2 = @ary.p_find {|v| false}
+ found2.should.nil?
+ end
+
+ it "returns one element that matches the condition" do
+ found1 = @ary.find_all {|v| v.odd?}
+ found2 = @ary.p_find {|v| v.odd?}
+ found2.should_not.nil?
+ found1.include? found2
+ end
+ end
+
end
end
\ No newline at end of file
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100208/fa14595a/attachment.html>
More information about the macruby-changes
mailing list