xxxxxxxxxx
import std.stdio;
import std.range;
import std.algorithm;
struct ExtendedArray(T)
{
T[] a;
alias a this;
T opIndex(int i)
{
if (i < 0) return a[0];
else if (i >= a.length) return a[$-1];
else return a[i];
}
}
ExtendedArray!T extend(T)(T[] a)
{
return ExtendedArray!T(a);
}
void main()
{
int[] xs = [1, 2, 3, 4];
auto extended = extend(xs);
// can index past the end
writeln(extended[5]);
// can index before the start
writeln(extended[-3]);
// still works with range algorithms
writeln(extended.map!(x => x^^2));
}