1 module uim.core.datatypes.general; 2 3 import uim.core; 4 5 size_t indexIn(T)(T value, T[] values) { 6 foreach(i, ref v; values) if (v == value) return i; 7 return -1; 8 } 9 unittest { 10 assert(2.indexIn([1,2,3,4]) == 1); 11 assert(20.indexIn([1,2,3,4]) == -1); 12 assert((2.1).indexIn([1.5,2.1,3.3,4.6]) == 1); 13 assert((20.1).indexIn([1.5,2.1,3.3,4.6]) == -1); 14 } 15 16 bool isIn(T)(T value, T[] values) { 17 foreach(i, ref v; values) if (v == value) return true; 18 return false; 19 } 20 unittest { 21 assert(2.isIn([1,2,3,4])); 22 assert(!20.isIn([1,2,3,4])); 23 assert((2.1).isIn([1.5,2.1,3.3,4.6])); 24 assert(!(20.1).isIn([1.5,2.1,3.3,4.6])); 25 } 26 27 @safe bool has(T)(T[] values, T value) if (!isSomeString!T) { 28 foreach(i, ref v; values) if (v == value) return true; 29 return false; 30 } 31 unittest { 32 assert([1,2,3,4].has(2)); 33 assert(![1,2,3,4].has(20)); 34 } 35 36 size_t[] indexIn(T)(T[] checkValues, T[] values) { 37 size_t[] results; 38 foreach(ref v; checkValues) results ~= indexIn(v, values); 39 return results; 40 } 41 unittest { 42 assert([2, 3].indexIn([1,2,3,4]) == [1, 2]); 43 assert([20].indexIn([1,2,3,4]) == [-1]); 44 } 45 46 size_t[] positionsIn(T)(T value, T[] values) { 47 size_t[] results; 48 foreach(i, ref v; values) if (v == value) results ~= i; 49 return results; 50 } 51 unittest { 52 assert(2.positionsIn([1,2,3,2]) == [1,3]); 53 assert(20.positionsIn([1,2,3,4]) == []); 54 assert((2.1).positionsIn([1.5,2.1,3.3,2.1]) == [1,3]); 55 assert((20.1).positionsIn([1.5,2.1,3.3,4.6]) == []); 56 } 57 58 /// Copies rightValues to leftValues 59 V[K] copyFrom(V, K)(V[K] leftValues, V[K] rightValues) { // right will overright left 60 V[K] results = leftValues.dup; 61 foreach(k, v; rightValues) results[k] = v; 62 return results; } 63 unittest { 64 assert(["a":"b"].copyFrom(["c":"d"]) == ["a":"b", "c":"d"]); 65 } 66 67 /// Concat rightValues to leftValues 68 V[K] concatPrefixInValues(V, K)(V[K] leftValues, V preValue) { // right will overright left 69 V[K] results; 70 foreach(k, v; leftValues) results[k] = preValue~v; 71 return results; } 72 unittest { 73 assert(["a":"b"].concatPrefixInValues("abc") == ["a":"abcb"]); 74 assert(["a":[1, 2, 3]].concatPrefixInValues([0]) == ["a":[0, 1, 2, 3]]); 75 } 76 77 /// Concat rightValues to leftValues 78 V[K] concatPostfixInValues(V, K)(V[K] leftValues, V postValue) { // right will overright left 79 V[K] results; 80 foreach(k, v; leftValues) results[k] = v~postValue; 81 return results; } 82 unittest { 83 assert(["a":"b"].concatPostfixInValues("abc") == ["a":"babc"]); 84 assert(["a":[1, 2, 3]].concatPostfixInValues([4]) == ["a":[1, 2, 3, 4]]); 85 } 86 87 /// Concat rightValues to leftValues 88 V[K] concatPrefixInKeys(V, K)(V[K] leftValues, V preValue) { // right will overright left 89 V[K] results; 90 foreach(k, v; leftValues) results[preValue~k] = v; 91 return results; } 92 unittest { 93 assert(["a":"b"].concatPrefixInKeys("abc") == ["abca":"b"]); 94 } 95 96 /// Concat rightValues to leftValues 97 V[K] concatPostfixInKeys(V, K)(V[K] leftValues, V postValue) { // right will overright left 98 V[K] results; 99 foreach(k, v; leftValues) results[k~postValue] = v; 100 return results; } 101 unittest { 102 assert(["a":"b"].concatPostfixInKeys("abc") == ["aabc":"b"]); 103 }