fun calcMatches()

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
            }