1 module esstool.arrayutil;
2 
3 import esstool.errors;
4 
5 T[] copy(T)(T[] origin, int start, int end)
6 {
7     if (end < start)
8         throw new IllegalArgumentError("The end cannot bigger than start!");
9 
10     if (end > len(origin))
11         throw new IllegalArgumentError("The end cannot bigger than arror origin!");
12 
13     return origin[start .. end];
14 }
15 
16 T[] copy(T)(T[] origin)
17 {
18     return copy(origin, 0, len(origin));
19 }
20 
21 void copyTo(T)(T[] origin, T[] target, int start, int end)
22 {
23     if (end < start)
24         throw new IllegalArgumentError("The end cannot bigger than start!");
25 
26     if (end > len(origin))
27         throw new IllegalArgumentError("The end cannot bigger than arror origin!");
28 
29     target[0 .. end - start] = origin[start .. end];
30 }
31 
32 void copyTo(T)(T[] origin, T[] target)
33 {
34     copyTo(origin, target, 0, len(origin));
35 }
36 
37 T[] expandAndInsert(T)(T[] arr, T obj, int index, T empty = null)
38 {
39     if (len(arr) <= index)
40     {
41         int count = index - (len(arr) - 1);
42         for (int i = 0; i < count; i++)
43         {
44             arr ~= empty;
45         }
46     }
47 
48     arr[index] = obj;
49 
50     return arr;
51 }
52 
53 T[] expandAndFill(T)(T[] arr, T obj, int index)
54 {
55     return expandAndInsert(arr = arr, obj = obj, index = index, empty = obj);
56 }
57 
58 bool contains(T)(T[] array, T obj)
59 {
60     foreach (T o; array)
61     {
62         if (o == obj)
63         {
64             return true;
65         }
66     }
67 
68     return false;
69 }
70 
71 int len(T)(T[] obj)
72 {
73     import std.conv : to;
74 
75     return to!int(obj.length);
76 }
77 
78 int count(T)(T[] obj)
79 {
80     import std.typecons;
81 
82     int counter = 0;
83     foreach (T o; obj)
84     {
85         auto j = o.nullable;
86         if (!j.isNull)
87         {
88             counter++;
89         }
90     }
91 
92     return counter;
93 }