-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmy_methods_enumerables.rb
224 lines (168 loc) · 4.03 KB
/
my_methods_enumerables.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
module Enumerable
#This was an awesome exercise. implement my_* is a great way of learning a language.
# def my_each(iterable) NOPE. It is going to demand an iterable input which is NOT self.
def my_each
index = 0
#using a for here would be cheating because the for loop calls the each method under the hood, which is forbidden by ODIN HIMSELF!!! Hope while does not do that because that would be cheating.
#cannot be <=. self[length] = nil. self[length-1] = last
while index<self.length
yield self[index]
index += 1
end
return self#yeah, the each method does this.
end
def my_each_with_index
index = 0
while index<self.length
yield self[index], index
index += 1
end
return self#yeah, the each method does this.
end
def my_select(&block)
output = []
self.my_each do |element|
if block.call(element)==true #I am explicit.
output << element
end
end
return output
end
def my_select2
output = []
self.my_each do |element|
if yield(element) ==true #I am explicit.
output << element
end
end
return output
end
def my_all?(&block)
if block==nil
self.my_each do |element|
#puts "block==nil"
if element==nil or element==false
return false
end
end
else
self.my_each do |element|
if block.call(element)==false
return false
#efficient. if it fails once, breaks the loop and returns false.
end
end
end
return true
end
def my_any?(&block)
if block==nil
self.my_each do |element|
#puts "block==nil"
if element!=nil and element!=false
return true
end
end
else
self.my_each do |element|
if block.call(element)!=false
#puts "block.call(element)!=false"
return true
end
end
end
return false
end
def my_none?(&block)
#the opposite of all.
if block==nil
self.my_each do |element|
puts "block==nil"
if element==true
return false
end
end
else
self.my_each do |element|
if block.call(element)==true
return false
#efficient. if it fails once, breaks the loop and returns false.
end
end
end
return true
end
def my_count(argument=nil, &block)
count = 0
if argument!=nil
self.my_each do |element|
if element==argument
count+=1
end
end
return count
end
if block!=nil
self.my_each do |element|
if block.call(element)==true
count+=1
end
end
return count
end
self.my_each do |element|
count+=1
end
return count
end
def my_inject(argument=nil, &block)
if argument!=nil
accumulator = argument
else
accumulator = self[0]
end
puts "accumulator_0 = #{accumulator}"
self.my_each do |element|
accumulator = block.call(accumulator, element)
end
return accumulator
end
def my_map(&block) #block implementation transforming it into a proc
out = []
if block==nil
return Enumerator
end
self.my_each do |element|
out << block.call(element)
end
return out
end
def my_map2 #block implementation using yield
out = []
if block_given?
self.each do |element|
out_element = yield element
out << out_element
end
else
return Enumerator
end
return out
end
def my_map3(aproc=nil, &block) #aproc argument and block implementation
out = []
#if both are nil, returns an Enumerator.
if aproc==nil and block_given?!=true
return Enumerator
end
#if aproc is given, uses it to create the out array.
if aproc!=nil
self.each do |element|
out << aproc.call(element)
end
return out
end
#if only a block is given the block is passed AS a aproc recursively. sweet.
my_map3(block)
end
end