Module: Enumerable

Defined in:
lib/lite/ruby/enumerable.rb,
lib/lite/ruby/safe/enumerable.rb

Instance Method Summary collapse

Instance Method Details

#clusterObject



8
9
10
11
12
13
14
15
16
17
18
# File 'lib/lite/ruby/enumerable.rb', line 8

def cluster
  each_with_object([]) do |ele, results|
    last_res = results.last

    if last_res && (yield(ele) == yield(last_res.last))
      last_res << ele
    else
      results << [ele]
    end
  end
end

#cluster_by(&block) ⇒ Object



20
21
22
# File 'lib/lite/ruby/enumerable.rb', line 20

def cluster_by(&block)
  group_by(&block).sort.transpose.pop || []
end

#deduce(identity = 0, &block) ⇒ Object



24
25
26
27
28
29
30
# File 'lib/lite/ruby/enumerable.rb', line 24

def deduce(identity = 0, &block)
  if defined?(yield)
    map(&block).deduce(identity)
  else
    inject { |acc, val| acc - val } || identity
  end
end

#drop_last(num) ⇒ Object



32
33
34
35
36
37
# File 'lib/lite/ruby/enumerable.rb', line 32

def drop_last(num)
  collection_size = to_a.size
  return self if num > collection_size

  self[0...(collection_size - num)]
end

#drop_last_ifObject



39
40
41
42
43
44
45
46
# File 'lib/lite/ruby/enumerable.rb', line 39

def drop_last_if
  dropping = true
  reverse_each.with_object([]) do |val, arr|
    next if dropping &&= yield(val)

    arr.unshift(val)
  end
end

#exactly?(num) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
51
52
53
54
55
56
57
58
# File 'lib/lite/ruby/enumerable.rb', line 48

def exactly?(num)
  found_count = 0

  if defined?(yield)
    each { |*opt| found_count += 1 if yield(*opt) }
  else
    each { |opt| found_count += 1 if opt }
  end

  found_count > num ? false : num == found_count
end

#excase?(object) ⇒ Boolean

rubocop:disable Style/CaseEquality

Returns:

  • (Boolean)


61
62
63
# File 'lib/lite/ruby/enumerable.rb', line 61

def excase?(object)
  none? { |val| object === val }
end

#exclude?(object) ⇒ Boolean

Returns:

  • (Boolean)


5
6
7
# File 'lib/lite/ruby/safe/enumerable.rb', line 5

def exclude?(object)
  !include?(object)
end

#excluding(*elements) ⇒ Object Also known as: without



9
10
11
12
# File 'lib/lite/ruby/safe/enumerable.rb', line 9

def excluding(*elements)
  elements.flatten!(1)
  reject { |element| elements.include?(element) }
end

#expandObject

rubocop:enable Style/CaseEquality



66
67
68
# File 'lib/lite/ruby/enumerable.rb', line 66

def expand
  map { |val| val.is_a?(Enumerable) ? val.expand : val }
end

#exponential(identity = 0, &block) ⇒ Object



70
71
72
73
74
75
76
# File 'lib/lite/ruby/enumerable.rb', line 70

def exponential(identity = 0, &block)
  if defined?(yield)
    map(&block).exponential(identity)
  else
    inject { |acc, val| acc**val } || identity
  end
end

#frequencyObject Also known as: occurrences



78
79
80
# File 'lib/lite/ruby/enumerable.rb', line 78

def frequency
  each_with_object(Hash.new(0)) { |val, hash| hash[val] += 1 }
end

#incase?(object) ⇒ Boolean

rubocop:disable Style/CaseEquality

Returns:

  • (Boolean)


83
84
85
# File 'lib/lite/ruby/enumerable.rb', line 83

def incase?(object)
  any? { |val| object === val }
end

#including(*elements) ⇒ Object Also known as: with



14
15
16
# File 'lib/lite/ruby/safe/enumerable.rb', line 14

def including(*elements)
  to_a.including(*elements)
end

#interpose(sep, &block) ⇒ Object

rubocop:disable Metrics/MethodLength



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/lite/ruby/enumerable.rb', line 89

def interpose(sep, &block)
  enum = Enumerator.new do |val|
    items = each

    loop do
      begin
        val << items.next
      rescue StopIteration
        break
      end

      begin
        items.peek
      rescue StopIteration
        break
      else
        val << sep
      end
    end
  end

  block ? enum.each(&block) : enum
end

#many?Boolean

Returns:

  • (Boolean)


18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/lite/ruby/safe/enumerable.rb', line 18

def many?
  found_count = 0

  if defined?(yield)
    any? do |val|
      found_count += 1 if yield(val)
      found_count > 1
    end
  else
    any? { (found_count += 1) > 1 }
  end
end

#modulate(modulo) ⇒ Object

rubocop:enable Metrics/MethodLength



114
115
116
117
118
119
120
121
122
123
124
# File 'lib/lite/ruby/enumerable.rb', line 114

def modulate(modulo)
  if modulo == 1
    to_a
  elsif size % modulo != 0
    raise ArgumentError, "Invalid modulo: #{modulo.inspect}"
  else
    (0...size).each_with_object(Array.new(modulo, [])) do |i, array|
      array[i % modulo] += [self[i]]
    end
  end
end

#occur(amount = nil) ⇒ Object

rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/lite/ruby/enumerable.rb', line 128

def occur(amount = nil)
  result = Hash.new { |hash, key| hash[key] = [] }

  each do |item|
    key = item
    result[key] << item
  end

  if defined?(yield)
    result.select! { |_key, values| yield(values.size) }
  else
    raise ArgumentError, 'Invalid occur amount' unless amount

    if amount.is_a?(Range)
      result.select! { |_key, values| amount.include?(values.size) }
    else
      result.select! { |_key, values| values.size == amount }
    end
  end

  result.values.flatten.uniq
end

#pluck(*keys) ⇒ Object



31
32
33
34
35
36
37
# File 'lib/lite/ruby/safe/enumerable.rb', line 31

def pluck(*keys)
  if keys.many?
    map { |element| keys.map { |key| element[key] } }
  else
    map { |element| element[keys.first] }
  end
end

#produce(identity = 0, &block) ⇒ Object

rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity rubocop:enable Metrics/MethodLength, Metrics/PerceivedComplexity



153
154
155
156
157
158
159
# File 'lib/lite/ruby/enumerable.rb', line 153

def produce(identity = 0, &block)
  if defined?(yield)
    map(&block).produce(identity)
  else
    inject { |acc, val| acc * val } || identity
  end
end

#quotient(identity = 0, &block) ⇒ Object



161
162
163
164
165
166
167
# File 'lib/lite/ruby/enumerable.rb', line 161

def quotient(identity = 0, &block)
  if defined?(yield)
    map(&block).quotient(identity)
  else
    inject { |acc, val| acc / val } || identity
  end
end

#several?Boolean

Returns:

  • (Boolean)


169
170
171
172
173
174
175
176
177
178
179
# File 'lib/lite/ruby/enumerable.rb', line 169

def several?
  found_count = 0

  if defined?(yield)
    each { |*opt| found_count += 1 if yield(*opt) }
  else
    each { |opt| found_count += 1 if opt }
  end

  found_count > 1
end

#squeeze(*limited_to) ⇒ Object

rubocop:disable Metrics/MethodLength



182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/lite/ruby/enumerable.rb', line 182

def squeeze(*limited_to)
  first = true
  current = nil

  each_with_object([]) do |val, array|
    if !limited_to.empty? && !limited_to.include?(val)
      array << val
    elsif first || current != val
      array << val
      first = false
      current = val
    end
  end
end

#take_last(num) ⇒ Object

rubocop:enable Metrics/MethodLength



198
199
200
201
202
203
# File 'lib/lite/ruby/enumerable.rb', line 198

def take_last(num)
  collection_size = to_a.size
  return self if num > collection_size

  self[(collection_size - num)..-1]
end

#take_last_ifObject



205
206
207
208
209
210
211
# File 'lib/lite/ruby/enumerable.rb', line 205

def take_last_if
  reverse_each.with_object([]) do |val, arr|
    break arr unless yield(val)

    arr.unshift(val)
  end
end