order.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { group, ascending, maxIndex } from 'd3-array';
  2. import { defined } from '../../utils/helper';
  3. import { indexOf } from '../../utils/array';
  4. import { columnOf } from './helper';
  5. export function createGroups(groupBy, I, mark) {
  6. const { encode } = mark;
  7. if (groupBy === null)
  8. return [I];
  9. const G = normalizeGroupBy(groupBy)
  10. .map((k) => { var _a; return [k, (_a = columnOf(encode, k)) === null || _a === void 0 ? void 0 : _a[0]]; })
  11. .filter(([, column]) => defined(column));
  12. const key = (i) => G.map(([, V]) => V[i]).join('-');
  13. return Array.from(group(I, key).values());
  14. }
  15. export function normalizeComparator(order) {
  16. if (Array.isArray(order))
  17. return createFieldsOrder(order);
  18. if (typeof order === 'function')
  19. return createFunctionOrder(order);
  20. if (order === 'series')
  21. return createSeriesOrder;
  22. if (order === 'value')
  23. return createValueOrder;
  24. if (order === 'sum')
  25. return createSumOrder;
  26. if (order === 'maxIndex')
  27. return createMaxIndexOrder;
  28. return () => null;
  29. }
  30. export function applyOrder(groups, comparator) {
  31. for (const group of groups) {
  32. group.sort(comparator);
  33. }
  34. }
  35. export function domainOf(value, scale) {
  36. return (scale === null || scale === void 0 ? void 0 : scale.domain) || Array.from(new Set(value));
  37. }
  38. function normalizeGroupBy(groupBy) {
  39. if (Array.isArray(groupBy))
  40. return groupBy;
  41. return [groupBy];
  42. }
  43. function createSeriesOrder(data, Y, S) {
  44. return ascendingComparator((i) => S[i]);
  45. }
  46. function createFunctionOrder(order) {
  47. return (data, Y, S) => {
  48. return ascendingComparator((i) => order(data[i]));
  49. };
  50. }
  51. function createFieldsOrder(order) {
  52. return (data, Y, S) => {
  53. return (i, j) => order.reduce((eq, f) => (eq !== 0 ? eq : ascending(data[i][f], data[j][f])), 0);
  54. };
  55. }
  56. function createValueOrder(data, Y, S) {
  57. return ascendingComparator((i) => Y[i]);
  58. }
  59. function createSumOrder(data, Y, S) {
  60. const I = indexOf(data);
  61. const groups = Array.from(group(I, (i) => S[+i]).entries());
  62. const seriesSum = new Map(groups.map(([k, GI]) => [k, GI.reduce((s, i) => s + +Y[i])]));
  63. return ascendingComparator((i) => seriesSum.get(S[i]));
  64. }
  65. function createMaxIndexOrder(data, Y, S) {
  66. const I = indexOf(data);
  67. const groups = Array.from(group(I, (i) => S[+i]).entries());
  68. const seriesMaxIndex = new Map(groups.map(([k, GI]) => [k, maxIndex(GI, (i) => Y[i])]));
  69. return ascendingComparator((i) => seriesMaxIndex.get(S[i]));
  70. }
  71. function ascendingComparator(order) {
  72. return (i, j) => ascending(order(i), order(j));
  73. }
  74. //# sourceMappingURL=order.js.map