resolveVisibleQuestions function

List<Question> resolveVisibleQuestions(
  1. List<Question> questions,
  2. List<QuestionVisibilityRule> visibilityRules,
  3. AnswerValues answerValues
)

Implementation

List<Question> resolveVisibleQuestions(
  List<Question> questions,
  List<QuestionVisibilityRule> visibilityRules,
  AnswerValues answerValues,
) {
  final visible = <int>{};
  final rulesByTarget = <int, List<QuestionVisibilityRule>>{};
  final questionsById = {
    for (final question in questions)
      if (question.id != null) question.id!: question,
  };

  for (final rule in visibilityRules) {
    rulesByTarget.putIfAbsent(rule.targetQuestionId, () => []).add(rule);
  }

  final result = <Question>[];
  for (final question in questions) {
    final questionId = question.id;
    if (questionId == null) continue;
    final rules = rulesByTarget[questionId] ?? const [];
    final isVisible =
        rules.isEmpty ||
        _matchesVisibilityRules(
          question,
          rules,
          questionsById,
          visible,
          answerValues,
        );
    if (isVisible) {
      visible.add(questionId);
      result.add(question);
    }
  }

  return result;
}