public static IEnumerable <TResult> VisitBinary <TLetter, TBinaryNode, TContext, TResult>(this RxNode <TLetter> node, IRegexVisitor <TLetter, TContext, TResult> visitor, TContext context)
     where TBinaryNode : RxBinaryNode <TLetter>
     where TLetter : IEquatable <TLetter>, IComparable <TLetter>
 {
     if (node is TBinaryNode binaryNode)
     {
         return(binaryNode.Left.VisitBinary <TLetter, TBinaryNode, TContext, TResult>(visitor, context)
                .Concat(binaryNode.Right.VisitBinary <TLetter, TBinaryNode, TContext, TResult>(visitor, context)));
     }
     return(new[] { node.Visit(visitor, context) });
 }
 public static RxNode <TLetter> Optimize <TLetter>(this RxNode <TLetter> node)
     where TLetter : IEquatable <TLetter>, IComparable <TLetter>
 {
     return(node.Visit(new OptimizerVisitor <TLetter>(), null));
 }