in reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ReteRuleMatcherImpl.kt [415:440]
fun introduce(occurrence: Occurrence, headPosMask: BitSet): Generation {
val reactivated = layers.any { it.containsOccurrence(occurrence) }
// propagation history
if (propagation && reactivated) {
// TODO: need a better way to process occurrences that are activated but ignored
// TODO: introduce a flag on ReteNode?
// TODO: same concerns "unique signatures" and "consumed signatures"
lastIntroduced = occurrence
return nextGeneration().reset()
}
var firstAffected = -1
for ((idx, layer) in layers.withIndex()) {
if (idx > 0 && headPosMask.get(idx - 1)) {
if (firstAffected < 0) firstAffected = idx
layer.queueUpdate(IntroBlock(occurrence, headPosMask, layers[idx - 1]))
}
}
for (i in firstAffected until layers.size) {
layers[i].reset()
}
if (firstAffected >= 0) lastIntroduced = occurrence
return nextGeneration()
}