1 /// Drops elements from a range 2 module ddash.range.drop; 3 4 /// 5 unittest { 6 assert([1, 2, 3, 4].drop.array == [2, 3, 4]); 7 assert([1, 2, 3, 4].dropRight.array == [1, 2, 3]); 8 assert([1, 2, 3, 4].dropWhile!(a => a < 3).array == [3, 4]); 9 assert([1, 2, 3, 4].dropRightWhile!(a => a > 2).equal([1, 2])); 10 11 } 12 13 import ddash.common; 14 15 16 /** 17 Drops n elements from beginning of range 18 19 Params: 20 range = input range 21 n = number of elements to drop 22 23 Returns: 24 new range 25 26 Since: 27 0.0.1 28 */ 29 auto drop(Range)(Range range, size_t n = 1) if (from!"std.range".isInputRange!Range) { 30 import std.range: stdDrop = drop; 31 return range.stdDrop(n); 32 } 33 34 /// 35 unittest { 36 import std.array; 37 assert([1, 2, 3].drop.equal([2, 3])); 38 } 39 40 /** 41 Drops n elements from end of range 42 43 Params: 44 range = input range 45 n = number of elements to drop 46 47 Returns: 48 new range 49 50 Since: 51 0.0.1 52 */ 53 auto dropRight(Range)(Range range, size_t n = 1) if (from!"std.range".isBidirectionalRange!Range) { 54 import std.range: stdDropBack = dropBack; 55 return range.stdDropBack(n); 56 } 57 58 /// 59 unittest { 60 import std.array; 61 assert([1, 2, 3].dropRight.equal([1, 2])); 62 } 63 64 /** 65 Drops elements from beginnig of range while predicate is true 66 67 Params: 68 pred = comparator 69 range = input range 70 71 Returns: 72 new range 73 74 Since: 75 0.0.1 76 */ 77 auto dropWhile(alias pred, Range)(Range range) if (from!"std.range".isInputRange!Range) { 78 import std.functional: unaryFun; 79 import std.range: empty, back, popBack; 80 while (!range.empty && unaryFun!pred(range.front)) range.popFront; 81 return range; 82 } 83 84 /// 85 unittest { 86 import std.array; 87 assert([1, 2, 3, 4].dropWhile!(a => a < 3).equal([3, 4])); 88 } 89 90 /** 91 Drops elements from end of range while predicate is true 92 93 Params: 94 pred = comparator 95 range = input range 96 97 Returns: 98 new range 99 100 Since: 101 0.0.1 102 */ 103 auto dropRightWhile(alias pred, Range)(Range range) if (from!"std.range".isBidirectionalRange!Range) { 104 import std.functional: unaryFun; 105 import std.range: empty, back, popBack; 106 while (!range.empty && unaryFun!pred(range.back)) range.popBack; 107 return range; 108 }