import std.stdio, std.conv, std.exception;
struct Checked( alias proof ) {
auto opBinary( string operation )( size_t sub )
enforce( this.value >= sub );
auto val = this.value - sub;
return Checked!proof( val );
auto indexFrom( alias list )( size_t index )
enforce( index < list.length );
return Checked!list( index );
auto itemFrom( alias list )( Checked!list index )
auto list1 = [ 1 , 2 , 3 ];
auto index = 2.indexFrom!list1;
assert( ( index - 1 ).itemFrom!list1 == 2 );
assert( ( index - 1 ).indexFrom!list2.itemFrom!list2 == 5 );
static assert( !__traits( compiles , 5.itemFrom!list2 ) );
static assert( !__traits( compiles , ( index + 1 ).itemFrom!list1 ) );
static assert( !__traits( compiles , index.itemFrom!list2 ) );