1 // Robert Burner Schadek rburners@gmail.com LGPL3 2 module dropuntil; 3 4 import std.conv : to; 5 import std.functional : unaryFun; 6 import std.range : isInputRange; 7 import std.traits : Unqual; 8 import std.array : array, empty, front, popFront; 9 import std.stdio; 10 11 template dropUntil(alias pred) if (is(typeof(unaryFun!pred))) 12 { 13 auto dropUntil(InputRange)(InputRange rs) if (isInputRange!(Unqual!InputRange)) 14 { 15 return DropUntil!(unaryFun!pred, InputRange)(rs); 16 } 17 } 18 19 struct DropUntil(alias pred, InputRange) { 20 public: 21 this(InputRange input) { 22 this.input = input; 23 this.eatUntil(); 24 } 25 26 @property void popFront() { 27 this.input.popFront; 28 } 29 30 @property bool empty() { 31 return this.input.empty; 32 } 33 34 @property auto front() { 35 return this.input.front; 36 } 37 38 private: 39 void eatUntil() { 40 for(; !input.empty(); input.popFront()) { 41 auto f = input.front; 42 if(pred(f)) { 43 break; 44 } 45 } 46 } 47 48 InputRange input; 49 } 50 51 unittest { 52 auto a = [1,2,3,4,5,6,7]; 53 54 auto a2 = a.dropUntil!(a => a > 2).array; 55 assert(a2 == a[2 .. $], to!string(a2)); 56 }