resolveChainedQueue method

List<Map<String, dynamic>> resolveChainedQueue(
  1. List<Map<String, dynamic>> queue
)

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;
}