Merhaba,
Yaklaşık 1 senelik süre içerisinde, aralıklı geliştirilen iota()
alternatifi için gönül rahatlıyla v3 diyebiliriz. Şurada başlayan ve Türkçe forumlarda devam eden InclusiveRange
için kısaca ir
veya iras
takma adlarını yaygınlaştıralım lütfen. Belki bir gün kısa olan bu sürüm Phobos'da yerini alır.
Kullanmak için şu derleme parametrelerine ihtiyaç duyabilirsiniz:
>dmd -w "inclusiveRange3.d" -preview=shortenedMethods -release
auto inclusiveRange(T)(T oneValue)
=> inclusiveRange!T(T(0), oneValue);
template inclusiveRange(Type)
{
enum typeTest = () => !is(Type == bool);
static assert(typeTest(), "\nBoolean type cannot be used!");
auto inclusiveRange(Type f, Type l, Type s = Type(1))
=> InclusiveRange(f, l, s);
struct InclusiveRange {
mixin Value!Type;
Type s, l, term;
import std.format;
this(Type first, Type last, Type step)
in (first <= last, format!"Invalid range: [%s-%s]"(first, last))
{
f = Value(first);
l = term = last;
s = step;
if(diff % s) {
const t = cast(Type)(diff / s);
term = cast(Type)(t * s + first);
}
}
private auto diff() => term - front;
bool empty() => f.empty || front > l;
Type front() => f.value;
auto popFront() => f += s;
auto save() => this;
auto length() => empty ? cast(size_t)0
: cast(size_t)(diff / s) + 1;
}
}
template Value(Type) {
Value f;
struct Value
{
Type value;
bool empty;
auto ref opAssign(Type first) => value = first;
auto ref opOpAssign(string op)(Type first)
if(op == "+")
{
const prev = value;
value += first;
if(value < prev)
{
empty = true;
value = prev;
}
}
}
}