コード例 #1
0
        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);
        }