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 }