import {slice} from "./array.js"; import constant from "./constant.js"; import {bumpX, bumpY, bumpRadial} from "./curve/bump.js"; import {withPath} from "./path.js"; import {x as pointX, y as pointY} from "./point.js"; function linkSource(d) { return d.source; } function linkTarget(d) { return d.target; } export function link(curve) { let source = linkSource, target = linkTarget, x = pointX, y = pointY, context = null, output = null, path = withPath(link); function link() { let buffer; const argv = slice.call(arguments); const s = source.apply(this, argv); const t = target.apply(this, argv); if (context == null) output = curve(buffer = path()); output.lineStart(); argv[0] = s, output.point(+x.apply(this, argv), +y.apply(this, argv)); argv[0] = t, output.point(+x.apply(this, argv), +y.apply(this, argv)); output.lineEnd(); if (buffer) return output = null, buffer + "" || null; } link.source = function(_) { return arguments.length ? (source = _, link) : source; }; link.target = function(_) { return arguments.length ? (target = _, link) : target; }; link.x = function(_) { return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), link) : x; }; link.y = function(_) { return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), link) : y; }; link.context = function(_) { return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), link) : context; }; return link; } export function linkHorizontal() { return link(bumpX); } export function linkVertical() { return link(bumpY); } export function linkRadial() { const l = link(bumpRadial); l.angle = l.x, delete l.x; l.radius = l.y, delete l.y; return l; }