1 module plot2d.chart.types; 2 3 import std.algorithm; 4 import std.array; 5 import std.range; 6 7 public import plot2d.types : Point; 8 9 private alias P = Point; 10 11 struct TreStat 12 { 13 double tm, max, val, min; 14 const pure nothrow @nogc @safe @property: 15 P[3] points() { return [maxPnt, valPnt, minPnt]; } 16 P maxPnt() { return P(tm, max); } 17 P minPnt() { return P(tm, min); } 18 P valPnt() { return P(tm, val); } 19 20 bool check() 21 { 22 return tm == tm && 23 max == max && 24 val == val && 25 min == min; 26 } 27 } 28 29 struct BoxStat 30 { 31 double tm, dtm, min, q1, med, q3, max, start, end; 32 33 void set(R)(double tm, double dtm, R rng) 34 if (isForwardRange!R && hasLength!R) 35 { 36 this.tm = tm; 37 this.dtm = dtm; 38 auto arr = rng.save.array; 39 start = arr[0]; 40 end = arr[$-1]; 41 auto sarr = arr.sort; 42 min = sarr[0]; 43 q1 = sarr[$/4*1]; 44 med = sarr[$/4*2]; 45 q3 = sarr[$/4*3]; 46 max = sarr[$-1]; 47 } 48 49 static BoxStat Set(R)(double tm, double dtm, R rng) 50 if (isForwardRange!R && hasLength!R) 51 { 52 BoxStat ret; 53 ret.set(tm, dtm, rng); 54 return ret; 55 } 56 57 const @nogc @property pure nothrow: 58 P[2] points() { return [minPnt, maxPnt]; } 59 P minPnt() { return P(tm, min); } 60 P q1Pnt() { return P(tm, q1); } 61 P medPnt() { return P(tm, med); } 62 P q3Pnt() { return P(tm, q3); } 63 P maxPnt() { return P(tm, max); } 64 }