Working of ranges
Ranges implement ClosedRange<T> a common interface in the library. It represents a closed mathematical interval defined for comparable types. It contains two endpoints as start and end (endInclusive)points. The operation performed in range is to check whether the element is contained in it or not. This is done by using in or !in operators.
An arithmetic progression is represented by integral type progressions such as CharProgression, IntProgression, Long Progression. Progressions represent the first element, the last element and the step which is non-zero. The first element is first, sub-sequent elements represent previous element plus step and the last element is the last element unless progression is completed.
Progression refers to subtype of Iterable<N>, where N is Char, Int or Long. As progression is Iterable<N> type it can be used in for-loop and function such as filter, map etc.
The . .operator creates an object for integral type which implements both ClosedRange<T> and Progression. For example, a range type LongRange implements ClosedRange<Int> and extends Long Progression, it means all the operation which are defined for LongProgression is also available for LongRange. The output generated by downTo() and step() functions is always a Progression.
The last element of the Progression is largest value not greater than the end value for positive step. The minimum value of progression is not less than the end value for negative step. The last value is checked by using (last-first) %step == 0.