1 | import { selectTabularToSamples, tabularToSamples, voidTabular } from '@analys/tabular';
|
2 | import { matchSlice } from '@analys/table-init';
|
3 | import { unwind } from '@vect/entries-unwind';
|
4 | import { mapper, iterate } from '@vect/vector-mapper';
|
5 | import { select } from '@vect/vector-select';
|
6 | import { Table } from '@analys/table';
|
7 | import { CrosTab } from '@analys/crostab';
|
8 | import { selectValues, SelectValues } from '@vect/object-select';
|
9 | import { first } from '@vect/vector-index';
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 | const tableToSamples = (table, fields) => fields !== null && fields !== void 0 && fields.length ? selectTabularToSamples.call(matchSlice(table), fields) : tabularToSamples.call(matchSlice(table));
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 | const toTable = o => new Table(o.head || o.banner, o.rows || o.matrix, o.title, o.types);
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 | const samplesToTable = (samples, fields) => {
|
36 | var _samplesToTabular;
|
37 |
|
38 | return _samplesToTabular = samplesToTabular(samples, fields), toTable(_samplesToTabular);
|
39 | };
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 | function samplesToTabular(samples, fields) {
|
48 | var _selectFieldMapping$c;
|
49 |
|
50 | let height, width;
|
51 | if (!(height = samples === null || samples === void 0 ? void 0 : samples.length)) return voidTabular();
|
52 | if (!(fields !== null && fields !== void 0 && fields.length)) return convertSamplesToTabular(samples);
|
53 | const [keys, head] = (_selectFieldMapping$c = selectFieldMapping.call(samples[0], fields), unwind(_selectFieldMapping$c));
|
54 | if (!(width = keys === null || keys === void 0 ? void 0 : keys.length)) return voidTabular();
|
55 | const rows = mapper(samples, sample => select(sample, keys, width), height);
|
56 | return {
|
57 | head,
|
58 | rows
|
59 | };
|
60 | }
|
61 | const selectFieldMapping = function (fields) {
|
62 | const sample = this,
|
63 | mapping = [],
|
64 | fieldMapper = fieldMapping.bind(sample);
|
65 | let kvp;
|
66 | iterate(fields, field => {
|
67 | if (kvp = fieldMapper(field)) mapping.push(kvp);
|
68 | });
|
69 | return mapping;
|
70 | };
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 | const fieldMapping = function (field) {
|
78 | const sample = this;
|
79 |
|
80 | if (Array.isArray(field)) {
|
81 | const [current, projected] = field;
|
82 | return current in sample ? [current, projected] : null;
|
83 | }
|
84 |
|
85 | return field in sample ? [field, field] : null;
|
86 | };
|
87 | function convertSamplesToTabular(samples) {
|
88 | var _Object$entries;
|
89 |
|
90 | const height = samples === null || samples === void 0 ? void 0 : samples.length;
|
91 | if (!height) return voidTabular();
|
92 | const rows = Array(height);
|
93 | let head;
|
94 | [head, rows[0]] = (_Object$entries = Object.entries(samples[0]), unwind(_Object$entries));
|
95 |
|
96 | for (let i = 1, w = (_head = head) === null || _head === void 0 ? void 0 : _head.length; i < height; i++) {
|
97 | var _head;
|
98 |
|
99 | rows[i] = select(samples[i], head, w);
|
100 | }
|
101 |
|
102 | return {
|
103 | head,
|
104 | rows
|
105 | };
|
106 | }
|
107 |
|
108 |
|
109 |
|
110 |
|
111 |
|
112 |
|
113 |
|
114 |
|
115 |
|
116 |
|
117 | function samplesToCrostab(sampleCollection, config = {}) {
|
118 | var _samples;
|
119 |
|
120 | const samples = config.side ? selectValues(sampleCollection, config.side) : Object.values(sampleCollection);
|
121 | const side = config.side ?? Object.keys(sampleCollection);
|
122 | const head = config.head ?? Object.keys((_samples = samples, first(_samples)));
|
123 | const rows = samples.map(config.head ? SelectValues(config.head) : Object.values);
|
124 | return CrosTab.from({
|
125 | side,
|
126 | head,
|
127 | rows
|
128 | });
|
129 | }
|
130 |
|
131 | export { samplesToCrostab, samplesToTable, samplesToTabular, tableToSamples, toTable };
|