summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-array-ext/mrblib/array.rb
diff options
context:
space:
mode:
authorJun Hiroe <[email protected]>2014-04-11 23:04:15 +0900
committerJun Hiroe <[email protected]>2014-04-11 23:42:40 +0900
commit7ed47c1223e6b0c37a5e5e1a14e5fd31ba59bc04 (patch)
tree32d9b09d60039f956d2ba4261ff56885d430cc68 /mrbgems/mruby-array-ext/mrblib/array.rb
parentb20d711c4d3d8241da08aaa7688000b007e13c39 (diff)
downloadmruby-7ed47c1223e6b0c37a5e5e1a14e5fd31ba59bc04.tar.gz
mruby-7ed47c1223e6b0c37a5e5e1a14e5fd31ba59bc04.zip
Array#rotate
Diffstat (limited to 'mrbgems/mruby-array-ext/mrblib/array.rb')
-rw-r--r--mrbgems/mruby-array-ext/mrblib/array.rb31
1 files changed, 31 insertions, 0 deletions
diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb
index 2e66c5fbc..f6adc5255 100644
--- a/mrbgems/mruby-array-ext/mrblib/array.rb
+++ b/mrbgems/mruby-array-ext/mrblib/array.rb
@@ -351,4 +351,35 @@ class Array
end
self
end
+
+ ##
+ # call-seq:
+ # ary.rotate(count=1) -> new_ary
+ #
+ # Returns a new array by rotating +self+ so that the element at +count+ is
+ # the first element of the new array.
+ #
+ # If +count+ is negative then it rotates in the opposite direction, starting
+ # from the end of +self+ where +-1+ is the last element.
+ #
+ # a = [ "a", "b", "c", "d" ]
+ # a.rotate #=> ["b", "c", "d", "a"]
+ # a #=> ["a", "b", "c", "d"]
+ # a.rotate(2) #=> ["c", "d", "a", "b"]
+ # a.rotate(-3) #=> ["b", "c", "d", "a"]
+
+ def rotate(count=1)
+ ary = []
+ len = self.length
+
+ if len > 0
+ idx = (count < 0) ? (len - (~count % len) - 1) : (count % len) # rotate count
+ len.times do
+ ary << self[idx]
+ idx += 1
+ idx = 0 if idx > len-1
+ end
+ end
+ ary
+ end
end