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

Returns:

  • (Boolean)


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

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



64
65
66
# File 'lib/lite/ruby/enumerable.rb', line 64

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

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



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

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



76
77
78
# File 'lib/lite/ruby/enumerable.rb', line 76

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

#incase?(object) ⇒ Boolean

Returns:

  • (Boolean)


80
81
82
# File 'lib/lite/ruby/enumerable.rb', line 80

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



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

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



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

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



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

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



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

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



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

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)


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

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



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

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



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

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

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

#take_last_ifObject



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

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

    arr.unshift(val)
  end
end