summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-03-19 06:09:40 -0700
committerYukihiro "Matz" Matsumoto <[email protected]>2013-03-19 06:09:40 -0700
commitfb70370c865eed321d0f5cab9abdaeeb111a9e60 (patch)
tree1b2d108432ce3271335fe5f793f1e50a16a7d457 /mrbgems
parentdec4ec694b5496939ee93a706a6bba95ddbf2b9e (diff)
parentb80badfe6c284c236f7c406278f4286902148739 (diff)
downloadmruby-fb70370c865eed321d0f5cab9abdaeeb111a9e60.tar.gz
mruby-fb70370c865eed321d0f5cab9abdaeeb111a9e60.zip
Merge pull request #1034 from skandhas/pr-add-mruby-enumerable-ext
add mrbgem: mruby-enum-ext and some methods.
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/mruby-enum-ext/mrbgem.rake4
-rw-r--r--mrbgems/mruby-enum-ext/mrblib/enum.rb85
-rw-r--r--mrbgems/mruby-enum-ext/test/enum.rb25
3 files changed, 114 insertions, 0 deletions
diff --git a/mrbgems/mruby-enum-ext/mrbgem.rake b/mrbgems/mruby-enum-ext/mrbgem.rake
new file mode 100644
index 000000000..758d298dc
--- /dev/null
+++ b/mrbgems/mruby-enum-ext/mrbgem.rake
@@ -0,0 +1,4 @@
+MRuby::Gem::Specification.new('mruby-enum-ext') do |spec|
+ spec.license = 'MIT'
+ spec.authors = 'mruby developers'
+end
diff --git a/mrbgems/mruby-enum-ext/mrblib/enum.rb b/mrbgems/mruby-enum-ext/mrblib/enum.rb
new file mode 100644
index 000000000..a9545da98
--- /dev/null
+++ b/mrbgems/mruby-enum-ext/mrblib/enum.rb
@@ -0,0 +1,85 @@
+##
+# Enumerable
+#
+module Enumerable
+ ##
+ # call-seq:
+ # enum.drop(n) -> array
+ #
+ # Drops first n elements from <i>enum</i>, and returns rest elements
+ # in an array.
+ #
+ # a = [1, 2, 3, 4, 5, 0]
+ # a.drop(3) #=> [4, 5, 0]
+
+ def drop(n)
+ raise TypeError, "expected Integer for 1st argument" unless n.kind_of? Integer
+ raise ArgumentError, "attempt to drop negative size" if n < 0
+
+ ary = []
+ self.each {|e| n == 0 ? ary << e : n -= 1 }
+ ary
+ end
+
+ ##
+ # call-seq:
+ # enum.drop_while {|arr| block } -> array
+ #
+ # Drops elements up to, but not including, the first element for
+ # which the block returns +nil+ or +false+ and returns an array
+ # containing the remaining elements.
+ #
+ # a = [1, 2, 3, 4, 5, 0]
+ # a.drop_while {|i| i < 3 } #=> [3, 4, 5, 0]
+
+ def drop_while(&block)
+ ary, state = [], false
+ self.each do |e|
+ state = true if !state and !block.call(e)
+ ary << e if state
+ end
+ ary
+ end
+
+ ##
+ # call-seq:
+ # enum.take(n) -> array
+ #
+ # Returns first n elements from <i>enum</i>.
+ #
+ # a = [1, 2, 3, 4, 5, 0]
+ # a.take(3) #=> [1, 2, 3]
+
+ def take(n)
+ raise TypeError, "expected Integer for 1st argument" unless n.kind_of? Integer
+ raise ArgumentError, "attempt to take negative size" if n < 0
+
+ ary = []
+ self.each do |e|
+ break if ary.size >= n
+ ary << e
+ end
+ ary
+ end
+
+ ##
+ # call-seq:
+ # enum.take_while {|arr| block } -> array
+ #
+ # Passes elements to the block until the block returns +nil+ or +false+,
+ # then stops iterating and returns an array of all prior elements.
+ #
+ #
+ # a = [1, 2, 3, 4, 5, 0]
+ # a.take_while {|i| i < 3 } #=> [1, 2]
+
+ def take_while(&block)
+ ary = []
+ self.each do |e|
+ return ary unless block.call(e)
+ ary << e
+ end
+ ary
+ end
+
+end
diff --git a/mrbgems/mruby-enum-ext/test/enum.rb b/mrbgems/mruby-enum-ext/test/enum.rb
new file mode 100644
index 000000000..5fc9759ad
--- /dev/null
+++ b/mrbgems/mruby-enum-ext/test/enum.rb
@@ -0,0 +1,25 @@
+##
+# Enumerable(Ext) Test
+
+assert("Enumerable#drop") do
+ a = [1, 2, 3, 4, 5, 0]
+
+ assert_equal a.drop(3), [4, 5, 0]
+ assert_equal a.drop(6), []
+end
+
+assert("Enumerable#drop_while") do
+ a = [1, 2, 3, 4, 5, 0]
+ assert_equal a.drop_while {|i| i < 3 }, [3, 4, 5, 0]
+end
+
+assert("Enumerable#take") do
+ a = [1, 2, 3, 4, 5, 0]
+ assert_equal a.take(3), [1, 2, 3]
+end
+
+assert("Enumerable#take_while") do
+ a = [1, 2, 3, 4, 5, 0]
+ assert_equal a.take_while {|i| i < 3 }, [1, 2]
+end
+