import std.exception, std.conv;
import std.algorithm.sorting;
struct N( size_t minimum = 0 , size_t maximum = minimum )
static enum min = minimum;
static enum max = maximum;
auto opBinary( string operation , size_t min2 , size_t max2 )( N!(min2,max2) mult )
return N!( min * min2 , max * max2 )( this.value * mult );
auto opBinary( string operation , size_t min2 , size_t max2 )( N!(min2,max2) div )
return N!( minimum / max2 , maximum / min2 )( this.value / div );
auto opBinary( string operation , size_t min2 , size_t max2 )( N!(min2,max2) add )
return N!( min + min2 , max + max2 )( this.value + add );
bool Less( a , b )() { return a.max < b.min; }
struct List( alias Size = N!( 0 , size_t.max ) )
int opIndex( Index )( Index index )
static assert( Less!( Index , Size ) );
auto opSlice( Start , Finish )( Start start , Finish finish )
static assert( Less!( Start , Finish ) );
static assert( Less!( Finish , Size ) );
return List!( N!( Finish.min - Start.max + 1 , Finish.max - Start.min + 1 ) )( data[ start .. finish + N!1() ] );
auto arr = [ 11 , 22 , 33 , 44 , 55 ];
auto list = List!( N!( 5 , 100 ) )( arr );
auto start = N!( 0 , 1 )();
auto slice = list[ start .. end ];
writeln( slice[ N!2() ] );
static assert( !__traits( compiles , writeln( slice[ N!3() ] ) ) );