module Enumerable

Public Instance Methods

cluster() { |ele| ... } click to toggle source
# 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) click to toggle source
# File lib/lite/ruby/enumerable.rb, line 17
def cluster_by(&block)
  group_by(&block).sort.transpose.pop || []
end
deduce(identity = 0) { || ... } click to toggle source
# 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) click to toggle source
# 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_if() { |val| ... } click to toggle source
# 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) { || ... } click to toggle source
# 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) click to toggle source
# File lib/lite/ruby/enumerable.rb, line 57
def excase?(object)
  none?(object)
end
exclude?(object) click to toggle source
# File lib/lite/ruby/safe/enumerable.rb, line 5
def exclude?(object)
  !include?(object)
end
excluding(*elements) click to toggle source
# File lib/lite/ruby/safe/enumerable.rb, line 9
def excluding(*elements)
  elements.flatten!(1)
  reject { |element| elements.include?(element) }
end
Also aliased as: without
expand() click to toggle source
# File lib/lite/ruby/enumerable.rb, line 61
def expand
  map { |val| val.is_a?(Enumerable) ? val.expand : val }
end
exponential(identity = 0) { || ... } click to toggle source
# 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
frequency() click to toggle source
# File lib/lite/ruby/enumerable.rb, line 73
def frequency
  each_with_object(Hash.new(0)) { |val, hash| hash[val] += 1 }
end
Also aliased as: occurrences
incase?(object) click to toggle source
# File lib/lite/ruby/enumerable.rb, line 77
def incase?(object)
  any?(object)
end
including(*elements) click to toggle source
# File lib/lite/ruby/safe/enumerable.rb, line 14
def including(*elements)
  to_a.including(*elements)
end
Also aliased as: with
interpose(sep, &block) click to toggle source

rubocop:disable Metrics/MethodLength

# 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?() { || ... } click to toggle source
# 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) click to toggle source

rubocop:enable Metrics/MethodLength

# 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) { || ... } click to toggle source

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

# 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
occurrences()
Alias for: frequency
pick(*keys) click to toggle source
# 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) click to toggle source
# 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) { || ... } click to toggle source

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

# 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) { || ... } click to toggle source
# 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?() { || ... } click to toggle source
# 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) click to toggle source

rubocop:disable Metrics/MethodLength

# 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) click to toggle source

rubocop:enable Metrics/MethodLength

# 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_if() { |val| ... } click to toggle source
# 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
with(*elements)
Alias for: including
without(*elements)
Alias for: excluding