1 module nxt.appender_stack;
2 
3 /** Stack.
4     See_Also: http://forum.dlang.org/thread/wswbtzakdvpgaebuhbom@forum.dlang.org
5 */
6 
7 struct Stack(T)
8 {
9     import std.array: Appender, appender;
10 
11     Appender!(T[]) _app;
12 
13     @property ref inout(T) top() inout { return _app.data[$ - 1]; };
14 
15     @property bool empty() const { return _app.data.length == 0; }
16 
17     void pop() { _app.shrinkTo(_app.data.length - 1); }
18 
19     T backPop() { T value = top; _app.shrinkTo(_app.data.length - 1); return value; }
20 
21     void push(T t) { _app.put(t); }
22 }
23 
24 @safe pure unittest
25 {
26     alias T = uint;
27 
28     Stack!T s;
29     assert(s.empty);
30 
31     // pushBack:
32 
33     s.push(13);
34     assert(!s.empty);
35     assert(s.top == 13);
36 
37     s.push(14);
38     assert(!s.empty);
39     assert(s.top == 14);
40 
41     s.push(15);
42     assert(!s.empty);
43     assert(s.top == 15);
44 
45     // pop:
46 
47     s.pop();
48     assert(!s.empty);
49     assert(s.top == 14);
50 
51     s.pop();
52     assert(!s.empty);
53     assert(s.top == 13);
54 
55     s.pop();
56     assert(s.empty);
57 
58     // push:
59 
60     s.push(13);
61     s.push(14);
62     s.push(15);
63     assert(!s.empty);
64     assert(s.top == 15);
65 
66     // backPop:
67 
68     assert(s.backPop() == 15);
69     assert(s.backPop() == 14);
70     assert(s.backPop() == 13);
71 
72     assert(s.empty);
73 }