1 /** 2 Contains a number of algorithms that operate on sequences. These sequences can be: 3 4 <li>$(LINK2 https://dlang.org/spec/template.html#variadic-templates, value sequences): 5 --- 6 assert(1.concat(2, 3, 4).array == [1, 2, 3, 4]); 7 --- 8 <li>$(LINK2 https://dlang.org/phobos/std_range_primitives.html, ranges): 9 --- 10 assert(1.concat([2, 3, 4]).array == [1, 2, 3, 4]); 11 --- 12 <li>a mixture of the above two: 13 --- 14 assert(1.concat([2, 3], 4).array == [1, 2, 3, 4]); 15 --- 16 <li>$(LINK2 https://dlang.org/spec/hash-map.html, associative arrays): 17 --- 18 auto aa = ["a": 1, "b": 0, "c": 2]; 19 assert(aa.compactValues!(a => a == 0) == ["a": 1, "c": 2]); 20 --- 21 22 Furthermore, a number of algorithms allow you to: 23 24 <li>operate on members of types: 25 26 This would be akin to passing in a predicate that extracts a member variable from a type to 27 operate on instead of operating on the whole type. These algorithms usually have a `By` prefix: 28 --- 29 class C { 30 int x; 31 } 32 auto arr1 = [new C(2), new C(3)]; 33 auto arr2 = [new C(2), new C(3)]; 34 assert(arr1.equalBy!"x"(arr2)); 35 --- 36 <li>operate via unary or binary predicates: 37 --- 38 import std.math: ceil; 39 assert([2.1, 1.2].difference!ceil([2.3, 3.4]).equal([1.2])); 40 assert([2.1, 1.2].difference!((a, b) => ceil(a) == ceil(b))([2.3, 3.4]).equal([1.2])); 41 --- 42 <li> or both: 43 --- 44 struct A { 45 int x; 46 } 47 auto arr = [A(4), A(8), A(12)]; 48 assert(arr.pullBy!("x", a => a / 2)(5, 9).array == [A(12)]); 49 --- 50 51 Algorithms: 52 53 $(TABLE 54 $(TR $(TH Module) $(TH Functions) $(TH Properties) $(TH Description)) 55 $(TR 56 $(TD $(DDOX_NAMED_REF ddash.algorithm.compact, `compact`)) 57 $(TD 58 $(DDOX_NAMED_REF algorithm.compact.compact, `compact`)<br> 59 $(DDOX_NAMED_REF algorithm.compact.compactBy, `compactBy`)<br> 60 $(DDOX_NAMED_REF algorithm.compact.compactValues, `compactValues`)<br> 61 ) 62 $(TD) 63 $(TD Creates a range or associative array with all null/predicate values removed.) 64 ) 65 $(TR 66 $(TD $(DDOX_NAMED_REF ddash.algorithm.concat, `concat`)) 67 $(TD 68 $(DDOX_NAMED_REF algorithm.concat.concat, `concat`) 69 ) 70 $(TD) 71 $(TD Concatenates ranges and values together to a new range) 72 ) 73 $(TR 74 $(TD $(DDOX_NAMED_REF ddash.algorithm.difference, `difference`)) 75 $(TD 76 $(DDOX_NAMED_REF algorithm.difference.difference, `difference`)<br> 77 $(DDOX_NAMED_REF algorithm.difference.differenceBy, `differenceBy`)<br> 78 ) 79 $(TD) 80 $(TD Creates a range of values not included in the other given set of values) 81 ) 82 $(TR 83 $(TD $(DDOX_NAMED_REF ddash.algorithm.equal, `equal`)) 84 $(TD 85 $(DDOX_NAMED_REF algorithm.equal.equal, `equal`)<br> 86 $(DDOX_NAMED_REF algorithm.equal.equalBy, `equalBy`)<br> 87 ) 88 $(TD) 89 $(TD Tells you if two things are equal) 90 ) 91 $(TR 92 $(TD $(DDOX_NAMED_REF ddash.algorithm.fill, `fill`)) 93 $(TD 94 $(DDOX_NAMED_REF algorithm.fill.fill, `fill`) 95 ) 96 $(TD mutates) 97 $(TD Assigns value to each element of input range.) 98 ) 99 $(TR 100 $(TD $(DDOX_NAMED_REF ddash.algorithm.flatmap, `flatmap`)) 101 $(TD 102 $(DDOX_NAMED_REF algorithm.flatmap.flatMap, `flatMap`) 103 ) 104 $(TD) 105 $(TD Maps and flattens a range.) 106 ) 107 $(TR 108 $(TD $(DDOX_NAMED_REF ddash.algorithm.flatten, `flatten`)) 109 $(TD 110 $(DDOX_NAMED_REF algorithm.flatten.flatten, `flatten`)<br> 111 $(DDOX_NAMED_REF algorithm.flatten.flattenDeep, `flattenDeep`)<br> 112 ) 113 $(TD) 114 $(TD Flattens a range by removing nesting levels values) 115 ) 116 $(TR 117 $(TD $(DDOX_NAMED_REF ddash.algorithm.frompairs, `frompairs`)) 118 $(TD 119 $(DDOX_NAMED_REF algorithm.frompairs.fromPairs, `fromPairs`) 120 ) 121 $(TD) 122 $(TD Returns a newly allocated associative array from a range of key/value tuples) 123 ) 124 $(TR 125 $(TD $(DDOX_NAMED_REF ddash.algorithm.index, `index`)) 126 $(TD 127 $(DDOX_NAMED_REF algorithm.index.indexWhere, `indexWhere`)<br> 128 $(DDOX_NAMED_REF algorithm.index.lastIndexWhere, `lastIndexWhere`)<br> 129 $(DDOX_NAMED_REF algorithm.index.indexOf, `indexOf`)<br> 130 $(DDOX_NAMED_REF algorithm.index.lastIndexOf, `lastIndexOf`)<br> 131 ) 132 $(TD) 133 $(TD Returns `optional` index of an element in a range.) 134 ) 135 $(TR 136 $(TD $(DDOX_NAMED_REF ddash.algorithm.intersection, `intersection`)) 137 $(TD 138 $(DDOX_NAMED_REF algorithm.intersection, `intersection`) 139 ) 140 $(TD) 141 $(TD Creates a range of unique values that are included in the other given set of values) 142 ) 143 $(TR 144 $(TD $(DDOX_NAMED_REF ddash.algorithm.pull, `pull`)) 145 $(TD 146 $(DDOX_NAMED_REF algorithm.pull.pull, `pull`)<br> 147 $(DDOX_NAMED_REF algorithm.pull.pullAt, `pullAt`)<br> 148 $(DDOX_NAMED_REF algorithm.pull.pullBy, `pullBy`)<br> 149 ) 150 $(TD) 151 $(TD Pulls elements out of a range) 152 ) 153 $(TR 154 $(TD $(DDOX_NAMED_REF ddash.algorithm.remove, `remove`)) 155 $(TD 156 $(DDOX_NAMED_REF algorithm.remove.remove, `remove`) 157 ) 158 $(TD mutates) 159 $(TD Removed elements from a range by unary predicate) 160 ) 161 $(TR 162 $(TD $(DDOX_NAMED_REF ddash.algorithm.reverse, `reverse`)) 163 $(TD 164 $(DDOX_NAMED_REF algorithm.reverse.reverse, `reverse`) 165 ) 166 $(TD mutates) 167 $(TD Reverses a range in place) 168 ) 169 $(TR 170 $(TD $(DDOX_NAMED_REF ddash.algorithm.sort, `sort`)) 171 $(TD 172 $(DDOX_NAMED_REF algorithm.sort.sortBy, `sortBy`)<br> 173 $(DDOX_NAMED_REF algorithm.sort.maybeSort, `maybeSort`)<br> 174 $(DDOX_NAMED_REF algorithm.sort.maybeSortBy, `maybeSortBy`) 175 ) 176 $(TD) 177 $(TD Provides various ways for sorting a range) 178 ) 179 $(TR 180 $(TD $(DDOX_NAMED_REF ddash.algorithm.stringify, `stringify`)) 181 $(TD 182 $(DDOX_NAMED_REF algorithm.stringify.stringify, `stringify`)<br> 183 $(DDOX_NAMED_REF algorithm.stringify.stringifySeperatedBy, `stringifySeperatedBy`)<br> 184 ) 185 $(TD) 186 $(TD Converts all elements in range into a string separated by separator.) 187 ) 188 $(TR 189 $(TD $(DDOX_NAMED_REF ddash.algorithm.zip, `zip`)) 190 $(TD 191 $(DDOX_NAMED_REF algorithm.zip.zipEach, `zipEach`) 192 ) 193 $(TD) 194 $(TD Zips up ranges together) 195 ) 196 ) 197 */ 198 module ddash.algorithm; 199 200 import ddash.common; 201 202 public { 203 import ddash.algorithm.flatmap; 204 import ddash.algorithm.compact; 205 import ddash.algorithm.concat; 206 import ddash.algorithm.difference; 207 import ddash.algorithm.equal; 208 import ddash.algorithm.fill; 209 import ddash.algorithm.flatmap; 210 import ddash.algorithm.flatten; 211 import ddash.algorithm.frompairs; 212 import ddash.algorithm.index; 213 import ddash.algorithm.intersection; 214 import ddash.algorithm.pull; 215 import ddash.algorithm.remove; 216 import ddash.algorithm.reverse; 217 import ddash.algorithm.sort; 218 import ddash.algorithm.stringify; 219 import ddash.algorithm.zip; 220 }