UNPKG

1.44 kBJavaScriptView Raw
1import {Transform} from 'vega-dataflow';
2import {accessorName, inherits, toNumber} from 'vega-util';
3
4/**
5 * Computes extents (min/max) for a data field.
6 * @constructor
7 * @param {object} params - The parameters for this operator.
8 * @param {function(object): *} params.field - The field over which to compute extends.
9 */
10export default function Extent(params) {
11 Transform.call(this, [undefined, undefined], params);
12}
13
14Extent.Definition = {
15 'type': 'Extent',
16 'metadata': {},
17 'params': [
18 { 'name': 'field', 'type': 'field', 'required': true }
19 ]
20};
21
22inherits(Extent, Transform, {
23 transform(_, pulse) {
24 const extent = this.value,
25 field = _.field,
26 mod = pulse.changed()
27 || pulse.modified(field.fields)
28 || _.modified('field');
29
30 let min = extent[0],
31 max = extent[1];
32 if (mod || min == null) {
33 min = +Infinity;
34 max = -Infinity;
35 }
36
37 pulse.visit(mod ? pulse.SOURCE : pulse.ADD, t => {
38 const v = toNumber(field(t));
39 if (v != null) {
40 // NaNs will fail all comparisons!
41 if (v < min) min = v;
42 if (v > max) max = v;
43 }
44 });
45
46 if (!Number.isFinite(min) || !Number.isFinite(max)) {
47 let name = accessorName(field);
48 if (name) name = ` for field "${name}"`;
49 pulse.dataflow.warn(`Infinite extent${name}: [${min}, ${max}]`);
50 min = max = undefined;
51 }
52 this.value = [min, max];
53 }
54});