public static IRange GetRange(Value left, Value right, IMaybe <int> length, bool inside = false) { var range = left.As <IRange>(); if (range.IsSome) { range.Value.SetStop(right); return(range.Value); } var dateRange = left.As <DateRange>(); if (dateRange.IsSome) { dateRange.Value.SetStop(right.Text); return(dateRange.Value); } if (left.Type == ValueType.Number && right.Type == ValueType.Number) { var start = (int)left.Number; var stop = (int)right.Number; return(new IntRange(start, stop, length) { Inside = inside }); } if (left.Type == ValueType.String) { var start = left.Text; var stop = right.Text; Reject(start.IsEmpty(), LOCATION, "Start can't be an empty string"); Reject(stop.IsEmpty(), LOCATION, "Stop can't be an empty string"); return(new StringRange(start, stop)); } if (left.Type == ValueType.Block && right.Type == ValueType.Block) { var start = (Block)left; var stop = (Block)right; return(new BlockRange(start, stop)); } if (left.Type == ValueType.Date && right.Type == ValueType.Date) { var start = (Date)left; var stop = (Date)right; return(new DateRange(start, stop)); } if (left.Type == ValueType.Rational) { var start = (Rational)left; var stop = Rational.Cast(right); return(new RationalRange(start, stop)); } if (left.Type == ValueType.Object && right.Type == ValueType.Object) { var start = (Object)left; var stop = (Object)right; return(new ObjectRange(start, stop)); } return(null); }