diff --git a/test/exercise/fp2/solution.rb b/test/exercise/fp2/solution.rb index 8104f35c..6dc23a38 100644 --- a/test/exercise/fp2/solution.rb +++ b/test/exercise/fp2/solution.rb @@ -5,16 +5,46 @@ class MyArray < Array # Использовать свои написанные функции для реализации следующих - можно. # Написать свою функцию my_each - def my_each; end + def my_each(&blk) + return self if empty? + + head, *tail = self + tail = MyArray.new(tail) + blk.call(head) + tail.my_each(&blk) + self + end # Написать свою функцию my_map - def my_map; end + def my_map(&blk) + new_arr = MyArray.new + my_reduce(new_arr) { |acc, el| acc << blk.call(el) } + new_arr + end # Написать свою функцию my_compact - def my_compact; end + def my_compact + new_arr = MyArray.new + my_reduce(new_arr) do |acc, el| + acc << el unless el.nil? + acc + end + new_arr + end # Написать свою функцию my_reduce - def my_reduce; end + def my_reduce(acc = nil, &blk) + return acc if empty? + + if acc.nil? + acc, *tail = self + else + tail = self + end + tail = MyArray.new(tail) + tail.my_each { |el| acc = blk.call(acc, el) } + acc + end end end end diff --git a/test/exercise/fp2/test.rb b/test/exercise/fp2/test.rb index dcb8c18b..0d84eea1 100644 --- a/test/exercise/fp2/test.rb +++ b/test/exercise/fp2/test.rb @@ -11,7 +11,6 @@ def setup end def test_my_each - skip result = [] my_result = [] @@ -23,14 +22,12 @@ def test_my_each end def test_my_map - skip func = ->(element) { element * @int } assert @array.map(&func) == @my_array.my_map(&func) assert @array.map(&func).map(&func) == @my_array.my_map(&func).my_map(&func) end def test_my_compact - skip func = ->(element) { element if element.even? } func_another = ->(element) { element * @int } func_yet_another = ->(element) { element.even? } @@ -40,7 +37,6 @@ def test_my_compact end def test_my_reduce - skip func = ->(acc, element) { acc * element } assert @array.reduce(&func) == @my_array.my_reduce(&func)