Source: core/measures.js

import {timeFormat} from 'd3';

/**
 * If measures is specified, sets measures and returns the instance itself. If measures is an object or string, it would be turned into an array with a measure. If measures is not specified, returns the instance's current measures. 
 * A measure(value) acts as an value that is looked up by dimensions(key). A synonym for dimension is independent attribute. Jelly-chart has {@link Core#data data} in an array to be grouped into a hierarchical tree structure with dimensions. If measures are specified, leaves of the tree will be summarized by them. 
 * @memberOf Core#
 * @function
 * @example
 * bar.data([
 *    {name: 'A', sales: 10},
 *    {name: 'B', sales: 20},
 *    {name: 'C', sales: 30},
 *    {name: 'D', sales: 40},
 *    {name: 'A', sales: 20},
 *    {name: 'B', sales: 10},
 *    {name: 'C', sales: 40},
 *    {name: 'D', sales: 10},
 *  ]) //sets data
 *  .dimensions(['name'])
 *  .measures([{field:'sales', op: 'mean'}])
 *  //generates a mono bar chart with 4 bars(A,B,C,D).
 *  //each bar's length will be determined mean of 'sales' values from leaf elements.
 * @param {(string|object|Object[])} [measures] sets a {@link Core#measure measure} array which are objects has properties for aggregation(grouping).
 * @return {(measures|Core)}
 */

function measures (measures) {
  if (!arguments.length) return this.__attrs__.measures;
  var _type = function (v) {
    if (typeof v === 'string') {
      return {field: v, op: 'sum'};
    } else if (typeof v === 'object') {
      if ('format' in v && typeof v.format === 'string') v.format = timeFormat(v.format);
      return v;
    }
  };
  if (Array.isArray(measures)) {
    this.__attrs__.measures = measures.map(function (v) { return _type(v); });
  } else {
    this.__attrs__.measures = [_type(measures)];
  }
  return this;
}

export default measures;