Module: Enumerable

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

Instance Method Summary collapse

Instance Method Details

#clusterObject



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

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



18
19
20
# File 'lib/lite/ruby/enumerable.rb', line 18

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

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



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

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



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

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

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

#drop_last_ifObject



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

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)


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

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

Returns:

  • (Boolean)


58
59
60
# File 'lib/lite/ruby/enumerable.rb', line 58

def excase?(object)
  none?(object)
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



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

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

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



66
67
68
69
70
71
72
# File 'lib/lite/ruby/enumerable.rb', line 66

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



74
75
76
# File 'lib/lite/ruby/enumerable.rb', line 74

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

#incase?(object) ⇒ Boolean

Returns:

  • (Boolean)


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

def incase?(object)
  any?(object)
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



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/lite/ruby/enumerable.rb', line 83

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



108
109
110
111
112
113
114
115
116
117
118
# File 'lib/lite/ruby/enumerable.rb', line 108

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



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/lite/ruby/enumerable.rb', line 122

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

#pick(*keys) ⇒ Object



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

def pick(*keys)
  return if none?

  if keys.many?
    keys.map { |key| first[key] }
  else
    first[keys.first]
  end
end

#pluck(*keys) ⇒ Object



41
42
43
44
45
46
47
48
# File 'lib/lite/ruby/safe/enumerable.rb', line 41

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

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

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



147
148
149
150
151
152
153
# File 'lib/lite/ruby/enumerable.rb', line 147

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



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

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)


163
164
165
166
167
168
169
170
171
172
173
# File 'lib/lite/ruby/enumerable.rb', line 163

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



176
177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/lite/ruby/enumerable.rb', line 176

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



192
193
194
195
196
197
# File 'lib/lite/ruby/enumerable.rb', line 192

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

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

#take_last_ifObject



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

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

    arr.unshift(val)
  end
end