resolveChainedQueue method
Drop from the head of queue every document deactivated by
conditionStatus: false. A skipped document is still counted as done:
its key is pushed into _completedDocumentKeys (which also advances the
__step__:N counter) and its own children are queued in its place, so
the chain keeps going instead of falling through to the outro.
Implementation
List<Map<String, dynamic>> resolveChainedQueue(
List<Map<String, dynamic>> queue,
) {
final resolved = List<Map<String, dynamic>>.from(queue);
while (resolved.isNotEmpty &&
!isCustomDocumentConditionMet(resolved.first)) {
final skipped = resolved.removeAt(0);
final skippedKey = skipped['key'];
if (skippedKey is! String || skippedKey.isEmpty) {
continue;
}
if (!_completedDocumentKeys.contains(skippedKey)) {
_completedDocumentKeys.add(skippedKey);
}
final excludedKeys = <String>{
..._completedDocumentKeys,
...resolved.map((document) => document['key']).whereType<String>(),
};
final discovered = getNextChainedDocuments(
skippedKey,
excludedKeys: excludedKeys.toList(growable: false),
completedFlowStep: _completedDocumentKeys.length,
completedSelectedOptionId:
_completedDocumentSelectedOptions[skippedKey],
);
for (final document in discovered) {
final key = document['key'];
if (key is! String) {
continue;
}
if (resolved.any((item) => item['key'] == key)) {
continue;
}
resolved.add(document);
}
}
return resolved;
}