On Tuesday, 18 January 2022 at 23:13:14 UTC, Ali Çehreli wrote:
But I like the following one better because it is fast and I think it works correctly.
Is it okay to swap places instead of throwing an error? Let's also implement BidirectionalRange, if okay. This great struct will now run 4x4 like a Jeep. 😀
Moreover, the iota doesn't even care if define char type. And no throwing an error.
The real question to ask is: "Does it reverse the result in case ```a > b``` like we did with foreach_reverse()" Salih ```d import std; struct InclusiveRange(T) { T front, last; this(U)(in U front, in U last) { this.front = front; this.last = last; if(empty) toogleFrontLast(); } bool empty() { return front > last; } void popFront() { if(!empty) ++front; } T back() { return last; } void popBack() { if(!empty) --last; } void toogleFrontLast() { auto temp = this.last; this.last = this.front; this.front = temp; } } auto inclusiveRange(T)(T first, T last) { return InclusiveRange!T(first, last); } enum a = 8; // ASCII 80: P enum b = 7; // ASCII 70: F alias type = char; alias test = inclusiveRange; void main() { string str; // for tests... auto io = iota!type(a * 10, b * 10); io.writeln("\n", typeof(io).stringof, "\n"); str = to!string(io); assert(str == "[]"); // OMG, why? auto ir = test!type(a * 10, b * 10); ir.writeln("\n", typeof(ir).stringof, "\n"); str = to!string(ir); assert(str == "FGHIJKLMNOP"); // Ok foreach_reverse(c; ir) str ~= c; assert(str == "FGHIJKLMNOPPONMLKJIHGF"); // Ok } ```