export interface forceCluster {
  initialize(nodes: any): void;

  clusterCenter(): (d: any, i: number, nodes: any[]) => { x: number; y: number };

  clusterCenter(
    center: { x: number; y: number } | ((d: any, i: number, nodes: any[]) => { x: number; y: number })
  ): this;

  strength(): (d: any, i: number, nodes: any[]) => number;

  strength(strength: number | ((d: any, i: number, nodes: any[]) => number)): this;

  radius(): (d: any, i: number, nodes: any[]) => number;

  radius(radius: number | ((d: any, i: number, nodes: any[]) => number)): this;
}

export function forceCluster(
  clusterCenter?: { x: number; y: number } | ((d: any, i: number, nodes: any[]) => { x: number; y: number })
): forceCluster;

export interface forceRect {
  initialize(nodes: any): void;

  strength(): (d: any, i: number, nodes: any[]) => number;

  strength(strength: number | ((d: any, i: number, nodes: any[]) => number)): this;

  index(): (d: any, i: number, nodes: any[]) => number;

  index(index: (d: any, i: number, nodes: any[]) => number): this;

  rect(): { width: number; height: number; columnN: number; rowN: number };

  rect(width: number, height: number, columnN: number, rowN: number): this;

  position(): { x: number; y: number };

  position(x: number, y: number): this;

  center(): { xCenter: number; yCenter: number };

  center(xCenter: number, yCenter: number): this;
}

export function forceRect(
  width: number,
  height: number,
  columnN: number,
  rowN: number,
  x?: number,
  y?: number,
  xCenter?: number,
  yCenter?: number
): forceRect;
