1 module onsdata.cell;
2 
3 import std.conv;
4 import onsdata;
5 
6 /+ +/
7 T checkFor(T, S)(S value, T minValue = T.min, T maxValue = T.max) if (isIntegral!S) {
8 	import std.conv;
9 	if (value < minValue) return minValue;
10 	if (value > maxValue) return maxValue;
11 	return to!T(value);
12 }
13 T checkFor(T, S)(S value, T minValue = T.min, T maxValue = T.max) if (isFloatingPoint!S) {
14 	import std.conv;
15 	if (value== S.nan) return 0; 
16 	if (value < minValue) return minValue;
17 	if (value > maxValue) return maxValue;
18 	return to!T(value);
19 }
20 /+ +/
21 T toggle(T, S)(S value) if (isBoolean!S) { return !S; }
22 T toggle(T, S)(S value, T defValue = 1, T zeroValue = 0) if (isNumeric!S) { 
23 	if (value != zeroValue) return zeroValue;
24 	return defValue;
25 }
26 /+ +/
27 T min(T)(T[] values...) if (isNumeric(T)) {
28 	if (values) {
29 		T result = values[0];
30 		foreach(value; values) if (result > value) result = value;
31 		return result;
32 	}
33 	return 0;
34 }
35 /+ avg - returns the average value of values +/
36 T avg(T)(T[] values...) {
37 	if (values) return to!T(sum!T(values)/values.length);
38 	return 0;
39 } 
40 /+ +/
41 T max(T)(T[] values...) {
42 	if (values) {
43 		T result = values[0];
44 		foreach(value; values) if (result < value) result = value;
45 		return result;
46 	}
47 	return 0;
48 } 
49 /+ +/
50 T sum(T)(T[] values...) {
51 	T result = 0;
52 	foreach(value; values) result += value;
53 	return result;
54 } 
55 /+ +/
56 T delta(T)(T left, T right) { return right-left; }
57 /+ +/
58 T div(T)(T left, T right, T distance) {
59 	if (distance) to!T(delta(left, right)/distance);
60 	return 0;
61 }