Method: CrossTable.of

Defined in:
lib/cross_table.rb

.of(grouped_hash, y_keys:, x_keys:, ret_type: nil) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/cross_table.rb', line 34

def of(grouped_hash, y_keys:, x_keys:, ret_type: nil)
  vals = y_keys.map do |y_dig_keys|
    x_keys.map do |x_dig_keys|
      grouped_hash.dig(*y_dig_keys).dig(*x_dig_keys)
    end
  end

  case ret_type
  when :data_only
    return vals

  when :xy_titles
    return ([nil] + y_keys).zip([x_keys] + vals).map do |row_title, value_row|
      [row_title] + value_row
    end
  end

  y_keys.map.zip(
    vals.map do |row|
      x_keys.zip(row).to_h
    end
  ).to_h
end