# another product.
# Module for range of discrete objects.
-package range
+module range
import abstract_collection
-# Range of discrete objects.
+# Range of discrete objects.
class Range[E: Discrete]
super Collection[E]
redef fun has(item) do return item >= _first and item <= _last
- redef fun has_only(item) do return _first == item and item == _last
+ redef fun has_only(item) do return _first == item and item == _last or is_empty
redef fun count(item)
do
redef fun iterator do return new IteratorRange[E](self)
- redef fun iterate
- !each(e: E)
- do
- var c = _first
- var l = _last
- while c <= l do
- each(c)
- c = c.succ
- end
- end
-
redef fun length
do
var nb = _first.distance(_after)
redef fun is_empty do return _first >= _after
- # Create a range [`from', `to'].
- # The syntax [`from'..`to'[ is equivalent.
+ # Create a range [`from`, `to`].
+ # The syntax `[from..to[` is equivalent.
init(from: E, to: E)
do
_first = from
_after = to.succ
end
- # Create a range [`from', `to'[.
- # The syntax [`from'..`to'[ is equivalent.
+ # Create a range [`from`, `to`[.
+ # The syntax `[from..to[` is equivalent.
init without_last(from: E, to: E)
do
_first = from
class IteratorRange[E: Discrete]
# Iterator on ranges.
super Iterator[E]
- var _range: Range[E]
+ var _range: Range[E]
redef readable var _item: E
redef fun is_ok do return _item < _range.after
_item = r.first
end
end
+
+redef class Discrete
+ # Returns the range from 0 to `self-1`, is used to do:
+ #
+ # for i in 3.times do print "Cool"
+ # for i in 100.times do print "{i}/100"
+ fun times: Range[OTHER] do return new Range[OTHER](0, self-1)
+end