UNPKG

d3-dag

Version:

Layout algorithms for visualizing directed acylic graphs.

68 lines (55 loc) 1.76 kB
// Create a dag with edge data import { default as dagStratify } from "./stratify"; export default function() { if (arguments.length) { throw Error( `got arguments to dagConnect(${arguments}), but constructor takes no aruguments. ` + `These were probably meant as data which should be called as dagConnect()(...)` ); } let sourceAccessor = defaultSource; let targetAccessor = defaultTarget; let linkData = defaultLinkData; function stratifyLinkData(parent, child) { return linkData(child.linkData[parent.id]); } function dagConnect(data) { if (!data.length) throw new Error("can't create graph from empty data"); const keyedData = {}; data.forEach((datum) => { const source = sourceAccessor(datum); const target = targetAccessor(datum); keyedData[source] || (keyedData[source] = { id: source, parentIds: [], linkData: {} }); const node = keyedData[target] || (keyedData[target] = { id: target, parentIds: [], linkData: {} }); node.parentIds.push(source); node.linkData[source] = datum; }); return dagStratify().linkData(stratifyLinkData)(Object.values(keyedData)); } dagConnect.sourceAccessor = function(x) { return arguments.length ? ((sourceAccessor = x), dagConnect) : sourceAccessor; }; dagConnect.targetAccessor = function(x) { return arguments.length ? ((targetAccessor = x), dagConnect) : targetAccessor; }; dagConnect.linkData = function(x) { return arguments.length ? ((linkData = x), dagConnect) : linkData; }; return dagConnect; } function defaultSource(d) { return d[0]; } function defaultTarget(d) { return d[1]; } function defaultLinkData(d) { return d; }