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 }