static string Wrap(Expr expr, OperationPriority currentPriority, ExpressionOrder order) { bool wrap = ShouldWrap(expr, currentPriority, order); string s = expr.Print(); if(wrap) return "(" + s + ")"; return s; }
static string WrapFromMultiply(Expr expr, ExpressionOrder order) { return Wrap(expr, OperationPriority.Multiply, order); }
static bool ShouldWrap(Expr expr, OperationPriority priority, ExpressionOrder order) { Func<OperationPriority, bool> shouldWrap = x => priority >= x; return expr.MatchStrict( add: x => shouldWrap(OperationPriority.Add), mult: x => IsMinusExpression(x) || shouldWrap(OperationPriority.Multiply), div: (x, y) => shouldWrap(OperationPriority.Divide), power: (x, y) => true, //shouldWrap(OperationPriority.Power), sqrt: x => false, param: x => false, @const: x => { if(x.IsFraction()) return shouldWrap(OperationPriority.Power); if(order == ExpressionOrder.Head) return false; return x < 0; } ); }