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 }