Skip to content

Commit f604649

Browse files
author
Denis Karataev
committed
result of the 3rd session
1 parent 8a9313a commit f604649

File tree

3 files changed

+54
-6
lines changed

3 files changed

+54
-6
lines changed

coffeequeue/solution/channel_queue.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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+
}

coffeequeue/solution/queue_factory.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ import (
77
func NewQueue() core.IQueue {
88
// TODO: change DummyQueue here to your queue implementation
99
//return &CoffeeQueue{}
10-
return &SliceCoffeeQueue{}
10+
return &ChannelQueue{
11+
channel: make(chan core.IOrder, 2000),
12+
}
1113
}

coffeequeue/solution/slicequeue.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ package solution
33
import (
44
"go-coding-dojo/coffeequeue/core"
55
"errors"
6+
"sync"
67
)
78

89
var (
910
NilError = errors.New("Sorry guy, we don't accept nil order")
1011
)
1112

1213
type SliceCoffeeQueue struct {
14+
sync.RWMutex
1315
OrderQueue []core.IOrder
1416
}
1517

@@ -18,20 +20,25 @@ func (sq *SliceCoffeeQueue) Put(order core.IOrder) error {
1820
if nil == order {
1921
return NilError
2022
}
23+
sq.Lock()
24+
defer sq.Unlock()
2125
sq.OrderQueue = append(sq.OrderQueue, order)
2226
return nil
2327
}
2428

2529
func (sq *SliceCoffeeQueue) Get() core.IOrder {
26-
if len(sq.OrderQueue) > 0 {
27-
order := sq.OrderQueue[0]
2830

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 {
3038
sq.OrderQueue = sq.OrderQueue[1:]
3139
} else {
32-
sq.OrderQueue = make([]core.IOrder, 0, 100)
40+
sq.OrderQueue = sq.OrderQueue[0:0]
3341
}
34-
3542
return order
3643
}
3744
return nil

0 commit comments

Comments
 (0)