import std.range; struct UntilFirst(R, T) if(isInputRange!R) { private R _input; private T _x; this(R input, T x) { _input = input; _x = x; } bool empty() @property { return _input.empty || _input.front == _x; } auto front() @property { assert(!empty); return _input.front; } void popFront() { assert(!empty); _input.popFront(); } } auto untilFirst(R, T)(R input, T x) if(isInputRange!R) { return UntilFirst!(R, T)(input, x); } unittest { import std.stdio; writeln(untilFirst(iota(20), 13)); writeln(untilFirst("abcdefghijklmnopqrstuvwxyz", 'j')); }