summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-enum-ext
diff options
context:
space:
mode:
authorJun Hiroe <[email protected]>2014-03-25 16:06:25 +0900
committerJun Hiroe <[email protected]>2014-03-25 16:14:19 +0900
commit767ca3f76ea510af3f6c430157c4e2f908c6651c (patch)
treee763438c1c89d1e0a51438183f3cf32bf6d440a5 /mrbgems/mruby-enum-ext
parent896dc002ca2720dc7c8e60a0d54b2353169b2e04 (diff)
downloadmruby-767ca3f76ea510af3f6c430157c4e2f908c6651c.tar.gz
mruby-767ca3f76ea510af3f6c430157c4e2f908c6651c.zip
Enumerable#find_index
Diffstat (limited to 'mrbgems/mruby-enum-ext')
-rw-r--r--mrbgems/mruby-enum-ext/mrblib/enum.rb36
-rw-r--r--mrbgems/mruby-enum-ext/test/enum.rb6
2 files changed, 42 insertions, 0 deletions
diff --git a/mrbgems/mruby-enum-ext/mrblib/enum.rb b/mrbgems/mruby-enum-ext/mrblib/enum.rb
index bca69e08f..92c89a8f7 100644
--- a/mrbgems/mruby-enum-ext/mrblib/enum.rb
+++ b/mrbgems/mruby-enum-ext/mrblib/enum.rb
@@ -579,4 +579,40 @@ module Enumerable
end
end
end
+
+ ##
+ # call-seq:
+ # enum.find_index(value) -> int or nil
+ # enum.find_index { |obj| block } -> int or nil
+ # enum.find_index -> an_enumerator
+ #
+ # Compares each entry in <i>enum</i> with <em>value</em> or passes
+ # to <em>block</em>. Returns the index for the first for which the
+ # evaluated value is non-false. If no object matches, returns
+ # <code>nil</code>
+ #
+ # If neither block nor argument is given, an enumerator is returned instead.
+ #
+ # (1..10).find_index { |i| i % 5 == 0 and i % 7 == 0 } #=> nil
+ # (1..100).find_index { |i| i % 5 == 0 and i % 7 == 0 } #=> 34
+ # (1..100).find_index(50) #=> 49
+ #
+
+ def find_index(val=NONE, &block)
+ return to_enum :find_index if !block_given? && val == NONE
+
+ idx = 0
+ if block
+ self.each do |e|
+ return idx if block.call(e)
+ idx += 1
+ end
+ else
+ self.each do |e|
+ return idx if e == val
+ idx += 1
+ end
+ end
+ nil
+ end
end
diff --git a/mrbgems/mruby-enum-ext/test/enum.rb b/mrbgems/mruby-enum-ext/test/enum.rb
index 68f2781b7..daf737d37 100644
--- a/mrbgems/mruby-enum-ext/test/enum.rb
+++ b/mrbgems/mruby-enum-ext/test/enum.rb
@@ -129,3 +129,9 @@ assert("Enumerable#cycle") do
assert_equal ["a", "b", "c", "a", "b", "c"], a
assert_raise(TypeError) { ["a", "b", "c"].cycle("a") { |v| a << v } }
end
+
+assert("Enumerable#find_index") do
+ assert_nil (1..10).find_index { |i| i % 5 == 0 and i % 7 == 0 }
+ assert_equal 34, (1..100).find_index { |i| i % 5 == 0 and i % 7 == 0 }
+ assert_equal 49 ,(1..100).find_index(50)
+end