@@ -21,24 +21,24 @@ import (
2121 "github.com/gohugoio/hugo/common/hiter"
2222)
2323
24- // Stack is a simple LIFO stack that is safe for concurrent use.
25- type Stack [T any ] struct {
24+ // StackThreadSafe is a simple LIFO stack that is safe for concurrent use.
25+ type StackThreadSafe [T any ] struct {
2626 items []T
2727 zero T
2828 mu sync.RWMutex
2929}
3030
31- func NewStack [T any ]() * Stack [T ] {
32- return & Stack [T ]{}
31+ func NewStackThreadSafe [T any ]() * StackThreadSafe [T ] {
32+ return & StackThreadSafe [T ]{}
3333}
3434
35- func (s * Stack [T ]) Push (item T ) {
35+ func (s * StackThreadSafe [T ]) Push (item T ) {
3636 s .mu .Lock ()
3737 defer s .mu .Unlock ()
3838 s .items = append (s .items , item )
3939}
4040
41- func (s * Stack [T ]) Pop () (T , bool ) {
41+ func (s * StackThreadSafe [T ]) Pop () (T , bool ) {
4242 s .mu .Lock ()
4343 defer s .mu .Unlock ()
4444 if len (s .items ) == 0 {
@@ -49,7 +49,7 @@ func (s *Stack[T]) Pop() (T, bool) {
4949 return item , true
5050}
5151
52- func (s * Stack [T ]) Peek () (T , bool ) {
52+ func (s * StackThreadSafe [T ]) Peek () (T , bool ) {
5353 s .mu .RLock ()
5454 defer s .mu .RUnlock ()
5555 if len (s .items ) == 0 {
@@ -58,26 +58,26 @@ func (s *Stack[T]) Peek() (T, bool) {
5858 return s .items [len (s .items )- 1 ], true
5959}
6060
61- func (s * Stack [T ]) Len () int {
61+ func (s * StackThreadSafe [T ]) Len () int {
6262 s .mu .RLock ()
6363 defer s .mu .RUnlock ()
6464 return len (s .items )
6565}
6666
6767// All returns all items in the stack, from bottom to top.
68- func (s * Stack [T ]) All () iter.Seq2 [int , T ] {
68+ func (s * StackThreadSafe [T ]) All () iter.Seq2 [int , T ] {
6969 return hiter .Lock2 (slices .All (s .items ), s .mu .RLock , s .mu .RUnlock )
7070}
7171
72- func (s * Stack [T ]) Drain () []T {
72+ func (s * StackThreadSafe [T ]) Drain () []T {
7373 s .mu .Lock ()
7474 defer s .mu .Unlock ()
7575 items := s .items
7676 s .items = nil
7777 return items
7878}
7979
80- func (s * Stack [T ]) DrainMatching (predicate func (T ) bool ) []T {
80+ func (s * StackThreadSafe [T ]) DrainMatching (predicate func (T ) bool ) []T {
8181 s .mu .Lock ()
8282 defer s .mu .Unlock ()
8383 var items []T
@@ -89,3 +89,47 @@ func (s *Stack[T]) DrainMatching(predicate func(T) bool) []T {
8989 }
9090 return items
9191}
92+
93+ // Stack is a simple LIFO stack that is not safe for concurrent use.
94+ type Stack [T any ] struct {
95+ items []T
96+ zero T
97+ }
98+
99+ func NewStack [T any ]() * Stack [T ] {
100+ return & Stack [T ]{}
101+ }
102+
103+ func (s * Stack [T ]) Push (item T ) {
104+ s .items = append (s .items , item )
105+ }
106+
107+ func (s * Stack [T ]) Pop () (T , bool ) {
108+ if len (s .items ) == 0 {
109+ return s .zero , false
110+ }
111+ item := s .items [len (s .items )- 1 ]
112+ s .items = s .items [:len (s .items )- 1 ]
113+ return item , true
114+ }
115+
116+ func (s * Stack [T ]) Peek () (T , bool ) {
117+ if len (s .items ) == 0 {
118+ return s .zero , false
119+ }
120+ return s .items [len (s .items )- 1 ], true
121+ }
122+
123+ func (s * Stack [T ]) Len () int {
124+ return len (s .items )
125+ }
126+
127+ func (s * Stack [T ]) All () iter.Seq2 [int , T ] {
128+ return slices .All (s .items )
129+ }
130+
131+ func (s * Stack [T ]) Drain () []T {
132+ items := s .items
133+ s .items = nil
134+ return items
135+ }
0 commit comments