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