module CoreGrouper

Constants

UNDEFINED_GROUP_NAME

Public Instance Methods

group(source, group_by_rules) click to toggle source

@param source [Array<Hash>] @param group_by_rules [Array<String,Symbol,Proc>]

# File lib/groups_by/core_grouper.rb, line 8
def group(source, group_by_rules)
  groups = source.group_by { |el| group_proc(group_by_rules.first).call(el) || UNDEFINED_GROUP_NAME }
  return groups.merge(groups) { |_group, elements| group_merger(elements, group_by_rules) } unless summarizer
  # Summarizer present
  groups.merge! totals_hash(groups.values.flatten)
  groups.merge(groups.reject { |k, _v| k == :totals }) do |_group, elements|
    group_merger(elements, group_by_rules)
  end
end

Private Instance Methods

group_merger(elements, group_by_rules) click to toggle source
# File lib/groups_by/core_grouper.rb, line 20
def group_merger(elements, group_by_rules)
  return group(elements, group_by_rules.drop(1)) unless group_by_rules.count == 1
  return elements unless summarizer
  # Summarizer present
  { values: elements }.tap do |hsh|
    # totals only if more than 1 element
    hsh.merge!(totals_hash(elements)) if elements.count > 1
  end
end
group_proc(grouping_by) click to toggle source

@param grouping_by [Proc,String,Symbol] @return [Proc]

# File lib/groups_by/core_grouper.rb, line 36
def group_proc(grouping_by)
  case grouping_by
  when Symbol, String
    # prevent grouping_by to be out of lambda scope
    instance_exec { ->(el) { el[grouping_by] } }
  when Proc
    grouping_by
  else
    raise InvalidGrouping
  end
end
totals_hash(elements) click to toggle source
# File lib/groups_by/core_grouper.rb, line 30
def totals_hash(elements)
  { totals: summarizer.call(elements) }
end