Commit 79dd12ba authored by skandhas's avatar skandhas

add Enumerable#take, Enumerable#take_while

parent 9262a9f4
......@@ -40,5 +40,46 @@ module Enumerable
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
......@@ -13,3 +13,13 @@ assert("Enumrable#drop_while") do
assert_equal a.drop_while {|i| i < 3 }, [3, 4, 5, 0]
end
assert("Enumrable#take") do
a = [1, 2, 3, 4, 5, 0]
assert_equal a.take(3), [1, 2, 3]
end
assert("Enumrable#take_while") do
a = [1, 2, 3, 4, 5, 0]
assert_equal a.take_while {|i| i < 3 }, [1, 2]
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment