public override Value Perform(Value left, Value right)
{
var step = 1.0;
var explicitStep = false;
var start = 0.0;
var end = 0.0;
var all = false;
if (left is ScalarValue)
{
start = (left as ScalarValue).Re;
}
else if (left is RangeValue)
{
var m = left as RangeValue;
start = m.Start;
step = m.End;
explicitStep = true;
}
else
{
throw new YAMPOperationInvalidException(":", left);
}
if (right is ScalarValue)
{
end = (right as ScalarValue).Re;
}
else if (right is RangeValue)
{
var m = right as RangeValue;
step = m.Start;
end = m.End;
all = m.All;
explicitStep = true;
}
else if (right is StringValue)
{
all = (right as StringValue).Value.Equals(End);
}
else
{
throw new YAMPOperationInvalidException(":", left);
}
if (!all && !explicitStep && end < start)
{
step = -1.0;
}
if (all)
{
return new RangeValue(start, step);
}
return new RangeValue(start, end, step);
}