+ // see https://docs.python.org/3/library/stdtypes.html#range
+ fStart, fStop, fStep: Integer;
+ function MoveNext: Boolean; inline;
+ property Current: Integer read fCurrent;
+ constructor Create(stop: Integer); overload;
+ constructor Create(start, stop: Integer; step: Integer = 1); overload;
+ function Equals(const other: TRange): Boolean;
+ function GetEnumerator: TEnumerator; inline;
+ class operator Equal(const left, right: TRange): Boolean; inline;
+ class operator NotEqual(const left, right: TRange): Boolean; inline;
+function Range(stop: Integer): TRange; overload; inline;
+ Result := TRange.Create(stop);
+function Range(start, stop: Integer; step: Integer = 1): TRange; overload; inline;
+ Result := TRange.Create(start, stop, step);
+constructor TRange.Create(stop: Integer);
+constructor TRange.Create(start, stop, step: Integer);
+class operator TRange.Equal(const left, right: TRange): Boolean;
+ Result := left.Equals(right);
+function TRange.Equals(const other: TRange): Boolean;
+ left, right: TEnumerator;
+ right := other.GetEnumerator;
+ if not (right.MoveNext and (left.Current = right.Current)) then
+ Result := not right.MoveNext;
+function TRange.GetEnumerator: TEnumerator;
+ Result.fCurrent := fStart - fStep;
+class operator TRange.NotEqual(const left, right: TRange): Boolean;
+ Result := not left.Equals(right);
+function TRange.TEnumerator.MoveNext: Boolean;
+ Result := fCurrent < fStop
+ Result := fCurrent > fStop;
+procedure List(const r: TRange);
+ List(range(0, -10, -1));
+ Assert(Range(0) = Range(2, 1, 3));
+ Assert(Range(0, 3, 2) = Range(0, 4, 2));