74 lines
1.8 KiB
JavaScript
74 lines
1.8 KiB
JavaScript
|
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;
|
||
|
}
|