1 /***********************************************************************************************
2 *	Copyright: © 2017-2021 UI Manufaktur UG
3 *	License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file.
4 *	Authors: UI Manufaktur Team
5 *	Documentation [DE]: https://ui-manufaktur.com/docu/uim-core/overview
6 ************************************************************************************************/
7 module uim.core;
8 
9 public import std.stdio;
10 public import std.conv;
11 public import std.datetime;
12 public import std.file;
13 public import std..string;
14 public import std.array;
15 public import std.algorithm;
16 public import std.traits;
17 public import std.uuid;
18 
19 // public import colored;
20 public import vibe.d;
21 
22 public import uim.core.classes;
23 public import uim.core.containers;
24 public import uim.core.datatypes;
25 public import uim.core.dlang;
26 public import uim.core.io;
27 public import uim.core.mixins;
28 public import uim.core.web;
29 
30 alias STRINGAA = string[string];
31 alias INTAA = int[int];
32 alias DOUBLEAA = double[double];
33 
34 /+  +/
35 T toggle(T, S)(S value) if (isBoolean!S) { return !S; }
36 T toggle(T, S)(S value, T defValue = 1, T zeroValue = 0) if (isNumeric!S) { 
37 	if (value != zeroValue) return zeroValue;
38 	return defValue;
39 }
40 
41 /+ toggle between values +/
42 T toggle(T)(T value, T value0, T value1) { return (value == value0) ? value1 : value0; }
43 
44 /+ +/
45 /// select values in array
46 // get all values in array are equal to value
47 T[] eqValues(T)(T value, T[] values) {
48 	T[] result;
49 	foreach(v; values) if (value == v) result ~= v;
50 	return result;
51 } 
52 // get all values in array are not equal to value
53 T[] neqValues(T)(T value, T[] values) {
54 	T[] result;
55 	foreach(v; values) if (value != v) result ~= v;
56 	return result;
57 } 
58 // get all values in array are greater then value
59 T[]  gtValues(T)(T value, T[] values) if (isNumeric!T) {
60 	T[] result;
61 	foreach(v; values) if (value > v) result ~= v;
62 	return result;
63 } 
64 // get all values in array are greater equal value
65 T[] geValues(T)(T value, T[] values) if (isNumeric!T) {
66 	T[] result;
67 	foreach(v; values) if (value >= v) result ~= v;
68 	return result;
69 } 
70 // get all values in array are less then value
71 T[] ltValues(T)(T value, T[] values) if (isNumeric!T) {
72 	T[] result;
73 	foreach(v; values) if (value < v) result ~= v;
74 	return result;
75 } 
76 // get all values in array are less equal value
77 T[] leValues(T)(T value, T[] values) if (isNumeric!T) {
78 	T[] result;
79 	foreach(v; values) if (value <= v) result ~= v;
80 	return result;
81 } 
82 
83 /// compare values in array
84 // all values in array are equal to value
85 bool eqAll(T)(T value, T[] values) {
86 	foreach(v; values) if (value == v) continue; else return false;
87 	return true;
88 } 
89 // all values in array are not equal to value
90 bool neqAll(T)(T value, T[] values) {
91 	foreach(v; values) if (value != v) continue; else return false;
92 	return true;
93 } 
94 // all values in array are greater then value
95 bool gtAll(T)(T value, T[] values) if (isNumeric!T) {
96 	foreach(v; values) if (value > v) continue; else return false;
97 	return true;
98 } 
99 // all values in array are greater equal value
100 bool geAll(T)(T value, T[] values) if (isNumeric!T) {
101 	foreach(v; values) if (value >= v) continue; else return false;
102 	return true;
103 } 
104 // all values in array are less then value
105 bool ltAll(T)(T value, T[] values) if (isNumeric!T) {
106 	foreach(v; values) if (value < v) continue; else return false;
107 	return true;
108 } 
109 // all values in array are less equal value
110 bool leAll(T)(T value, T[] values) if (isNumeric!T) {
111 	foreach(v; values) if (value <= v) continue; else return false;
112 	return true;
113 } 
114 
115 bool equal(T)(T[] leftCells, T[] rightCells) {
116 	if (leftCells.length == rightCells.length) {
117 		foreach(i; 0..leftCells.length) 
118 			if (leftCells[i] != rightCells[i]) return false;
119 		return true;
120 	}
121 	return false;  }
122 
123 
124 T limit(T)(T value, T left, T right) if (isNumeric!T) {
125 	T result = value;
126 	if (left < right) {
127 	if (result > right) result = right; 
128 	if (result < left) result = left; 
129 	}
130 	else {
131 		if (result > left) result = left; 
132 		if (result < right) result = right; 
133 	}
134 	return result;
135 } 
136 
137 T[2] arrayLimits(T, S)(T from, T to, S[] values) if (isNumeric!T) { return arrayLimits(from, to, 0, values.length); } 
138 T[2] arrayLimits(T)(T from, T to, T left, T right) if (isNumeric!T) {
139 	T[2] result;
140 	result[0] = limit(from, left, right-1);
141 	result[1] = limit(to, left, right);
142 	return result;
143 } 
144 
145 string[] stringAA2Array(string[string] values, string sep = ":") {
146 	string[] results;
147 	foreach(k, v; values) results ~= k~sep~v;
148 	return results;
149 }  
150 
151 template CascadeNotNull(alias A) {
152 	const bool CascadeNotNull = (A) ? true : false; 
153 }
154 
155 template CascadeNotNull(alias A, alias B) {
156 	const bool CascadeNotNull = (A) ? (CascadeNotNull!(A.B)) : false; 
157 }
158 
159 template CascadeNotNull(alias A, alias B, alias C) {
160 	const bool CascadeNotNull = (CascadeNotNull!(A, B)) ? (CascadeNotNull!(A.B, C)) : false; 
161 }
162 
163 template CascadeNotNull(alias A, alias B, alias C, alias D) {
164 	const bool CascadeNotNull = (CascadeNotNull!(A, B, C)) ? (CascadeNotNull!(A.B.C, D)) : false; 
165 }
166 
167 unittest {
168 	assert(stringAA2Array(["A":"B", "C":"D"], "/")==["A/B", "C/D"]);
169 }
170