File tree Expand file tree Collapse file tree 3 files changed +54
-6
lines changed Expand file tree Collapse file tree 3 files changed +54
-6
lines changed Original file line number Diff line number Diff line change
1
+ package solution
2
+
3
+ import (
4
+ "go-coding-dojo/coffeequeue/core"
5
+ "time"
6
+ "errors"
7
+ )
8
+
9
+ type ChannelQueue struct {
10
+ channel chan core.IOrder
11
+ }
12
+
13
+ func (dq ChannelQueue ) Put (order core.IOrder ) error {
14
+ // Prevent nil order
15
+ if nil == order {
16
+ return NilError
17
+ }
18
+
19
+ select {
20
+ case dq .channel <- order :
21
+ return nil
22
+ case <- time .After (10000 * time .Millisecond ):
23
+ return errors .New ("Queue is full" )
24
+ default :
25
+
26
+ }
27
+
28
+ return nil
29
+ }
30
+
31
+ func (dq ChannelQueue ) Get () core.IOrder {
32
+ select {
33
+ case ret := <- dq .channel :
34
+ return ret
35
+ case <- time .After (1000 * time .Millisecond ):
36
+ return nil
37
+ }
38
+ return nil
39
+ }
Original file line number Diff line number Diff line change 7
7
func NewQueue () core.IQueue {
8
8
// TODO: change DummyQueue here to your queue implementation
9
9
//return &CoffeeQueue{}
10
- return & SliceCoffeeQueue {}
10
+ return & ChannelQueue {
11
+ channel : make (chan core.IOrder , 2000 ),
12
+ }
11
13
}
Original file line number Diff line number Diff line change @@ -3,13 +3,15 @@ package solution
3
3
import (
4
4
"go-coding-dojo/coffeequeue/core"
5
5
"errors"
6
+ "sync"
6
7
)
7
8
8
9
var (
9
10
NilError = errors .New ("Sorry guy, we don't accept nil order" )
10
11
)
11
12
12
13
type SliceCoffeeQueue struct {
14
+ sync.RWMutex
13
15
OrderQueue []core.IOrder
14
16
}
15
17
@@ -18,20 +20,25 @@ func (sq *SliceCoffeeQueue) Put(order core.IOrder) error {
18
20
if nil == order {
19
21
return NilError
20
22
}
23
+ sq .Lock ()
24
+ defer sq .Unlock ()
21
25
sq .OrderQueue = append (sq .OrderQueue , order )
22
26
return nil
23
27
}
24
28
25
29
func (sq * SliceCoffeeQueue ) Get () core.IOrder {
26
- if len (sq .OrderQueue ) > 0 {
27
- order := sq .OrderQueue [0 ]
28
30
29
- if len (sq .OrderQueue ) > 1 {
31
+ sq .Lock ()
32
+ defer sq .Unlock ()
33
+ lenq := len (sq .OrderQueue )
34
+
35
+ if lenq > 0 {
36
+ order := sq .OrderQueue [0 ]
37
+ if lenq > 1 {
30
38
sq .OrderQueue = sq .OrderQueue [1 :]
31
39
} else {
32
- sq .OrderQueue = make ([]core. IOrder , 0 , 100 )
40
+ sq .OrderQueue = sq . OrderQueue [ 0 : 0 ]
33
41
}
34
-
35
42
return order
36
43
}
37
44
return nil
You can’t perform that action at this time.
0 commit comments