handleLoopEdges method
Implementation
List<LoopNode> handleLoopEdges(NodeOutput item, State state) {
var mtx = state.mtx;
var loops = this.loops(item.id);
if (loops.length == 0) throw "no loops found for node ${item.id}";
List<LoopNode> loopNodes = loops.map((String incomeId) {
if (item.id == incomeId) {
return LoopNode(
id: incomeId, node: item, x: state.x, y: state.y, isSelfLoop: true);
}
List<int>? coords = mtx.find((NodeOutput n) {
return n.id == incomeId;
});
if (coords?.length != 2)
throw "loop target $incomeId not found on matrix";
MatrixCell? cell = mtx.getByCoords(coords![0], coords[1]);
if (cell == null) throw "loop target cell $incomeId not found on matrix";
NodeOutput? node = cell.getById(incomeId);
if (node == null) throw "loop target node $incomeId not found on matrix";
return LoopNode(
id: incomeId,
node: node,
x: coords[0],
y: coords[1],
isSelfLoop: false);
}).toList();
bool skip = loopNodes.any((LoopNode income) {
int checkY = income.y != 0 ? income.y - 1 : 0;
return mtx.hasVerticalCollision(state.x, checkY);
});
return skip ? [] : loopNodes;
}