operation hasLoop(n) : Boolean { | |
for (n in Node.all) { | |
n.~status = 0; // not visited yet | |
} | |
return hasLoopAux(n); | |
} | |
operation hasLoopAux(n) : Boolean { | |
if (n.~status == 2) { | |
// We already visited this node and did not find any loops | |
return false; | |
} | |
else if (n.~status == 1) { | |
// We have returned to a node through its outgoing edges: we found a loop | |
return true; | |
} | |
n.~status = 1; | |
for (e in n.outgoing) { | |
if (hasLoopAux(e.target)) { | |
return true; | |
} | |
} | |
n.~status = 2; | |
return false; | |
} |