-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathqueue.go
More file actions
67 lines (59 loc) · 1.34 KB
/
queue.go
File metadata and controls
67 lines (59 loc) · 1.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package queue
import (
"errors"
"fmt"
)
// Queue is extension of slice as FIFO and FILO
// index 0,1,2,3,4,5
// front [0,2,4,5,3,5] back
type Queue[T any] []T
var (
// empty error
ErrEmpty = errors.New("empty")
)
func (q *Queue[T]) PushBack(v ...T) {
*q = append(*q, v...)
}
// PopFront pop from FIFO,Queue.
//
// if len(queue) == 0 ,return (queue[0],`nil`) and shorten queue.
// if not return (new(T), empty error)
func (q *Queue[T]) PopFront() (T, error) {
if len(*q) == 0 {
var v T
return v, fmt.Errorf("Queue: %w", ErrEmpty)
}
defer func() { *q = (*q)[1:] }()
return (*q)[0], nil
}
// PopBack pop from FILO,stack.
//
// if len(queue) == 0, return (last element,`nil`) and shorten queue.
// if not return (new(T), `empty` error)
func (q *Queue[T]) PopBack() (T, error) {
if len(*q) == 0 {
var v T
return v, fmt.Errorf("Queue: %w", ErrEmpty)
}
n := len(*q) - 1
defer func() { *q = (*q)[:n] }()
return (*q)[n], nil
}
// Remove remove q[i] and shorten queue
func (q *Queue[T]) Remove(i int) error {
if len(*q) == 0 {
return fmt.Errorf("Queue: %w", ErrEmpty)
}
*q = append((*q)[0:i], (*q)[i+1:]...)
return nil
}
// Last return last element
// if Queue is empty,return `empty` error
func (q *Queue[T]) Last() (T, error) {
len := len(*q)
if len == 0 {
var v T
return v, fmt.Errorf("Queue: %w", ErrEmpty)
}
return (*q)[len-1], nil
}