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