module tailconst2; import std.range; import tailconst; /** * Example range implementing what is needed for tail-const. **/ struct SimpleRange( T ) { T innerRange; mixin tailConst!( .SimpleRange, Tail!T ); static if ( !is( T == .TailMutable!T ) ) { this( SimpleRange.TailImmutable r ) { innerRange = r.innerRange; } } static if ( !is( T == .TailImmutable!T ) ) { this( SimpleRange.TailMutable r ) { innerRange = r.innerRange; } } static if ( !is( T == .TailConst!T ) ) { .TailConst!SimpleRange get( ) { return TailConst( this ); } alias get this; } this( SimpleRange r ) { innerRange = r.innerRange; } this( T t ) { innerRange = t; } auto front( ) { return innerRange.front; } void popFront( ) { innerRange.popFront( ); } bool empty( ) { return innerRange.empty; } SimpleRange save( ) { return this; } } SimpleRange!T simpleRange( T )( T r ) { return SimpleRange!T( r ); } void main( ) { int[] a = [1,2,3]; auto o = simpleRange( a ); TailConst!( typeof( o ) ) c = o; immutable(int)[] b = [4,5,6]; auto p = simpleRange( b ); TailConst!( typeof( p ) ) d = p; }