public Evaluate ( TemplateContext context ) : void | ||
context | TemplateContext | |
return | void |
private static bool CompareTo(TemplateContext context, SourceSpan span, ScriptBinaryOperator op, IEnumerable <object> left, IEnumerable <object> right) { // Compare the length first var leftCount = left.Count(); var rightCount = right.Count(); var compare = leftCount.CompareTo(rightCount); switch (op) { case ScriptBinaryOperator.CompareEqual: if (compare != 0) { return(false); } break; case ScriptBinaryOperator.CompareNotEqual: if (compare != 0) { return(true); } if (leftCount == 0) { return(false); } break; case ScriptBinaryOperator.CompareLessOrEqual: case ScriptBinaryOperator.CompareLess: if (compare < 0) { return(true); } if (compare > 0) { return(false); } if (leftCount == 0 && op == ScriptBinaryOperator.CompareLess) { return(false); } break; case ScriptBinaryOperator.CompareGreaterOrEqual: case ScriptBinaryOperator.CompareGreater: if (compare < 0) { return(false); } if (compare > 0) { return(true); } if (leftCount == 0 && op == ScriptBinaryOperator.CompareGreater) { return(false); } break; default: throw new ScriptRuntimeException(span, $"The operator `{op.ToText()}` is not supported between {context.GetTypeName(left)} and {context.GetTypeName(right)}."); } // Otherwise we need to compare each element var leftIterator = left.GetEnumerator(); var rightIterator = right.GetEnumerator(); while (leftIterator.MoveNext() && rightIterator.MoveNext()) { var leftValue = leftIterator.Current; var rightValue = rightIterator.Current; var result = (bool)ScriptBinaryExpression.Evaluate(context, span, op, leftValue, rightValue); if (!result) { return(false); } } return(true); }