import {Transform} from 'vega-dataflow';
import {inherits} from 'vega-util';
import {Delaunay} from 'd3-delaunay';

export default function Voronoi(params) {
  Transform.call(this, null, params);
}

Voronoi.Definition = {
  'type': 'Voronoi',
  'metadata': {'modifies': true},
  'params': [
    { 'name': 'x', 'type': 'field', 'required': true },
    { 'name': 'y', 'type': 'field', 'required': true },
    { 'name': 'size', 'type': 'number', 'array': true, 'length': 2 },
    { 'name': 'extent', 'type': 'array', 'array': true, 'length': 2,
      'default': [[-1e5, -1e5], [1e5, 1e5]],
      'content': {'type': 'number', 'array': true, 'length': 2} },
    { 'name': 'as', 'type': 'string', 'default': 'path' }
  ]
};

const prototype = inherits(Voronoi, Transform);

const defaultExtent = [-1e5, -1e5, 1e5, 1e5];

prototype.transform = function(_, pulse) {
  const as = _.as || 'path',
        data = pulse.source;

  // nothing to do if no data
  if (!data || !data.length) return pulse;

  // configure and construct voronoi diagram
  let s = _.size;
  s = s ? [0, 0, s[0], s[1]]
    : (s = _.extent) ? [s[0][0], s[0][1], s[1][0], s[1][1]]
    : defaultExtent;

  const voronoi = this.value = Delaunay.from(data, _.x, _.y).voronoi(s);

  // map polygons to paths
  for (let i=0, n=data.length; i<n; ++i) {
    const polygon = voronoi.cellPolygon(i);
    data[i][as] = polygon ? toPathString(polygon) : null;
  }

  return pulse.reflow(_.modified()).modifies(as);
};

// suppress duplicated end point vertices
function toPathString(p) {
  const x = p[0][0],
        y = p[0][1];

  let n = p.length - 1;
  for (; p[n][0] === x && p[n][1] === y; --n);

  return 'M' + p.slice(0, n + 1).join('L') + 'Z';
}

@@ -723,128 +723,91 @@
 nst 
-prototype = inherits(Voronoi, Transform);%0A%0Aconst defaultExtent = %5B-1e5, -1e5, 1e5, 1e5%5D;%0A%0Aprototype.transform = function
+defaultExtent = %5B-1e5, -1e5, 1e5, 1e5%5D;%0A%0Ainherits(Voronoi, Transform, %7B%0A  transform
 (_, 
@@ -813,24 +813,26 @@
  pulse) %7B%0A  
+ 
+ 
 const as = _
@@ -850,24 +850,26 @@
 h',%0A        
+  
 data = pulse
@@ -880,16 +880,18 @@
 rce;%0A%0A  
+ 
+ 
 // nothi
@@ -910,16 +910,18 @@
 no data%0A
+  
   if (!d
@@ -958,16 +958,18 @@
 lse;%0A%0A  
+ 
+ 
 // confi
@@ -1003,16 +1003,18 @@
 diagram%0A
+  
   let s 
@@ -1025,16 +1025,18 @@
 size;%0A  
+ 
+ 
 s = s ? 
@@ -1050,24 +1050,26 @@
 s%5B0%5D, s%5B1%5D%5D%0A
+  
     : (s = _
@@ -1120,16 +1120,18 @@
 1%5D%5D%0A    
+ 
+ 
 : defaul
@@ -1140,16 +1140,18 @@
 xtent;%0A%0A
+  
   const 
@@ -1218,16 +1218,18 @@
 (s);%0A%0A  
+ 
+ 
 // map p
@@ -1245,16 +1245,18 @@
 o paths%0A
+  
   for (l
@@ -1290,24 +1290,26 @@
  ++i) %7B%0A    
+ 
+ 
 const polygo
@@ -1336,16 +1336,18 @@
 gon(i);%0A
+  
     data
@@ -1398,19 +1398,23 @@
 null;%0A  
+ 
+ 
 %7D%0A%0A
+  
   return
@@ -1455,17 +1455,22 @@
 es(as);%0A
-%7D
+  %7D%0A%7D)
 ;%0A%0A// su

Use leaner syntax.