private static bool VisitConditionNode(IConditionNode <TConditionType> conditionNode, IDictionary <TConditionType, bool> conditionsChecklist)
        {
            switch (conditionNode)
            {
            case IValueConditionNode <TConditionType> valueConditionNode:
                if (conditionsChecklist.ContainsKey(valueConditionNode.ConditionType))
                {
                    conditionsChecklist[valueConditionNode.ConditionType] = true;
                }

                return(conditionsChecklist.All(kvp => kvp.Value));

            case ComposedConditionNode <TConditionType> composedConditionNode:
                foreach (IConditionNode <TConditionType> childConditionNode in composedConditionNode.ChildConditionNodes)
                {
                    bool allPresentAlready = VisitConditionNode(childConditionNode, conditionsChecklist);
                    if (allPresentAlready)
                    {
                        return(true);
                    }
                }

                return(false);

            default:
                throw new NotSupportedException($"Unsupported condition node: '{conditionNode.GetType().Name}'.");
            }
        }
 private ISpecification <IEnumerable <Condition <TConditionType> > > BuildSpecification(IConditionNode <TConditionType> conditionNode, MatchModes matchMode)
 {
     return(conditionNode switch
     {
         IValueConditionNode <TConditionType> valueConditionNode => this.BuildSpecificationForValueNode(valueConditionNode, matchMode),
         ComposedConditionNode <TConditionType> composedConditionNode => this.BuildSpecificationForComposedNode(composedConditionNode, matchMode),
         _ => throw new NotSupportedException($"Unsupported condition node: '{conditionNode.GetType().Name}'."),
     });