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
}
```

Reply via email to