Module: Enumerable

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

Instance Method Summary collapse

Instance Method Details

#clusterObject



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

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



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

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

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



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

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



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

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

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

#drop_last_ifObject



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

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)


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

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)


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

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



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

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

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



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

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



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

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

#incase?(object) ⇒ Boolean

Returns:

  • (Boolean)


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

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



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

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



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

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



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

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



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

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



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

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)


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

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



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

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



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

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

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

#take_last_ifObject



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

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

    arr.unshift(val)
  end
end