Ok, a strange question from my side again...
Let's begin, with what works:
Say, I define two types:
import std.typecons : Nullable;
alias M = uint;
alias Mr = Nullable!M;
then, I can write two types of methods. Those which can handle
Mr's:
void fun1(Mr val)
{
//do some funny stuff
}
and those, which assume an existing value is provided:
void fun2(M val)
{
//do some other funny stuff
}
they could be overloaded by using the same name I think... but
this is not the point.
The question is, how to define the same thing for ranges. What I
started with is:
import std.range : iota;
alias MrSlice = typeof(iota(M.init));
so far, so good. The MrSlice-thing is the analogy for Mr, as it
can be empty, as Mr can.
What I also need is the analogy for the M-thing. But how can I
define a slice, which is not-empty by definition?
A workaround, which works is for example, using in a function
which assumes a non-empty slice a contract:
void fun3(MrSlice val)
in
{
assert(!val.empty);
}
body
{
// do some funny stuff, part 3 :)
}
I tried also something using Algebraic types with an underlying
int, but couldn't manage to append elements to something like:
alias List2 = Algebraic!(This[]);
or
alias List(Leaf) = Algebraic!(Leaf, This*);
The cool thing is, if the algebraic stuff works, it would
potentially be able to replace all four aliases altogether...
But a knock-out criteria is: the solution has to be @nogc