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