internal static HashSet <Expression> Select(Expression e, Func <Expression, bool> predicate)
        {
            var visitor = new BranchSelectExpressionVisitor(predicate);

            visitor.Visit(e);
            return(visitor.matches);
        }
        public static Expression Evaluate(Expression e)
        {
            var chosenForEvaluation = BranchSelectExpressionVisitor.Select(e, ShouldEvaluate);

            return(EvaluatingExpressionVisitor.Evaluate(e, chosenForEvaluation));
        }