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 }