1 /// Small array utils 2 module sily.array; 3 4 import std.traits: isArray; 5 import std.algorithm: map, each; 6 import std.range: ElementType; 7 import std.array: array; 8 9 /** 10 Returns true if `val` is one of `vals` 11 Params: 12 val = Value to check 13 vals = Array or sequence of values to check against 14 */ 15 bool isOneOf(T)(T val, T[] vals ...) { 16 foreach (T i; vals) { 17 if (val == i) return true; 18 } 19 return false; 20 } 21 22 /** 23 Fills array with values `val` up to `size` if it's not 0 24 Params: 25 arr = Array to fill 26 val = Values to fill with 27 Returns: Filled array 28 */ 29 T[] fill(T)(T[] arr, T val){ 30 31 arr = arr.dup; 32 33 for (int i = 0; i < arr.length; i ++) { 34 arr[i] = val; 35 } 36 37 return arr; 38 } 39 40 /** 41 Fills and returns new array with values `val` up to `size` 42 Params: 43 val = Values to fill with 44 size = Amount of pos to fill 45 Returns: Filled array 46 */ 47 T[] fill(T)(T val, size_t size){ 48 T[] arr = new T[](size); 49 50 for (int i = 0; i < size; i ++) { 51 arr[i] = val; 52 } 53 54 return arr; 55 } 56 /// Ditto 57 alias repeat = fill; 58 59 /// Returns product of all lengths of array ([[1, 2, 3], [1, 3]].deepLength -> 6) 60 size_t deepLength(T)(T arr) if (isArray!T) { 61 static if (isArray!(ElementType!T)) { 62 size_t r = arr.length; 63 size_t m = 0; 64 // arr.map!(a => a.deepLength).array.each!(n => m = r > m ? r : m); 65 foreach (a; arr) { 66 size_t s = deepLength(a); 67 if (s > m) m = s; 68 } 69 r = r * m; 70 return r; 71 } else { 72 return arr.length; 73 } 74 } 75 76 77 /// Returns base type of array (int[3][2][5] -> int) 78 template ArrayBaseType(T) { 79 static if (isArray!(ElementType!T)) { 80 alias ArrayBaseType = ArrayBaseType!(ElementType!T); 81 } else { 82 alias ArrayBaseType = ElementType!T; 83 } 84 }