Module

LayeredLayout.EdgeRouting.PortAssignment

Package
purescript-layered-layout
Repository
markgrafhq/purescript-layered-layout

#assignPorts Source

assignPorts :: Array Edge -> Array NodePlacement -> Map NodeId (Array Port) -> Array { edgeId :: EdgeId, nodes :: Array NodeId } -> EdgePortOffsets -> Array PortAssignment

Dummy ports follow their own BK-assigned centres. A label-dummy switch can leave consecutive ordinary dummies in different columns; copying the first dummy's column would move later ports inside unrelated node or loop-label envelopes. Aligned chains remain straight naturally.

#PortAssignment Source

type PortAssignment = { edge :: Edge, fromPos :: Number /\ Number, fromSide :: Side, toPos :: Number /\ Number, toSide :: Side }

#EdgePortOffsets Source

type EdgePortOffsets = Map (EdgeId /\ Side) Number

Port-distribution result: per-edge x-offset on a node side, in fine-grid coordinates relative to the node's left edge. Built by LayeredLayout.PortDistribution.distributePorts (post-BK) and consumed by assignPorts (edge routing) so the recorded offset overrides the per-call distributeAlongSide re-derivation.

#scaleFactor Source

#distributeAlongSide Source

distributeAlongSide :: { hi :: Number, lo :: Number } -> Array EdgeId -> Map EdgeId Number

Even-distribution port-spacing formula from ELK's LGraphUtil.placePorts.

position_i = lo + (i + 1) * width / (n + 1)

with i ∈ [0, n), so 1 sibling sits at center; 2 at thirds; 3 at quarters. The order of the input array decides which sibling lands at which slot — callers sort by their preferred criterion (target layer-index, source barycenter, etc.) before passing in.