in reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ReteRuleMatcherImpl.kt [452:484]
fun calcMatches(): Collection<RuleMatchImpl> {
val topLayer = layers.last()
val uniqueSignatures = HashSet<Signature>()
val matches = ArrayList<RuleMatchImpl>()
while(true) {
val n = topLayer.nextNode(nodesIt)
if (n == null) break
if (n.isInvalid()) {
nodesIt.remove()
continue
}
val signature = IntArray(headSize).toSignature()
n.fillSignature(signature)
val trail = signature.toTrail()
if (trail.size() < headSize) continue // has dupes
if (lastIntroduced?.let { trail.contains(it.identity) } == false) continue // not relevant match
if (consumedSignatures.contains(signature) || uniqueSignatures.contains(signature)) continue
uniqueSignatures.add(signature)
val occArray = arrayOfNulls<Occurrence>(headSize).apply(n::collect)
val occList = occArray.toList() as List<Occurrence>
val keptCount = lookupRule().headKept().count()
matches.add(RuleMatchImpl(lookupRule(),
n.subst(),
occList.subList(0, keptCount),
occList.subList(keptCount, occList.size)))
}
return matches
}