On Tuesday, 17 January 2023 at 21:50:06 UTC, matheus wrote:
Have you compared the timings between this way (With ranges) and a normal way (Without ranges)?

Of course it is possible to speed it up. However, even as it is, it is enough to see the power of intervals. I would argue that you'll get fast results even with DMD Compiler!

```d
import std.stdio;
import std.datetime.date;

void main()
{
  import std.datetime.stopwatch : benchmark, StopWatch;
  auto sw = StopWatch();

#line 1
  sw.start();

  enum xTest = 1200;
  auto title = enumToStr!DayOfWeek(2);

  auto date = Date(2023, 12, 1);
  auto range = MyCalendar(date);
  for(size_t test; test < xTest; range.popFront, ++test)
  {
    range.writeln;             // month and year
    title.writefln!"%-(%s %)"; // days of week
    range.front.writeln;       // formatted days
  }
  sw.stop();
  writeln(sw.peek.total!"usecs");
}

struct MyCalendar
{
  import std.array  : appender, replicate;
  import std.format : format, formattedWrite;
  import std.string : capitalize;

  Date date;
  enum empty = false;

  string front()
  {
    auto res = appender!string;
    int day, dow = date.dayOfWeek;
    // skip days:
    res.formattedWrite("%s", " ".replicate(dow * 3));

    for(day = 1; day <= date.daysInMonth; ++day)
    {
      res.formattedWrite("%2s ", day);
      if(++dow % 7 == 0) res.put("\n");
    }
    if(dow % 7) res.put("\n");
    return res.data;
  }

  void popFront()
  {
    date.roll!"months"(1);
  }

  string toString() const
  {
    const currentYear = date.year;   // Current Year
    const currentMonth = date.month; // Name of the month
    const monthAndYear = format("%s/%s:",
                            currentMonth,
                            currentYear);
    return capitalize(monthAndYear);
  }
}

auto enumToStr(E)(size_t len = 0)
{
  import std.conv : to;
  string[] result;
  for(E x = E.min; x <= E.max; x++)
  {
    result ~= len ? x.to!string[0..len]
                  : x.to!string;
  }
  return result;
}
```
SDB@79

Reply via email to