package deque
import (
"errors"
)
var ErrEmptyDequeue = errors.New("DoublyEnded queue is empty, so can't perform this operation")
type DoublyEndedQueue[T any] struct {
deque []T
}
func New[T any]() *DoublyEndedQueue[T] {
return &DoublyEndedQueue[T]{deque: make([]T, 0)}
}
func (dq *DoublyEndedQueue[T]) EnqueueFront(item T) {
dq.deque = append([]T{item}, dq.deque...)
}
func (dq *DoublyEndedQueue[T]) EnqueueRear(item T) {
dq.deque = append(dq.deque, item)
}
func (dq *DoublyEndedQueue[T]) DequeueFront() (T, error) {
if len(dq.deque) == 0 {
var zeroVal T
return zeroVal, ErrEmptyDequeue
}
frontElement := dq.deque[0]
dq.deque = dq.deque[1:]
return frontElement, nil
}
func (dq *DoublyEndedQueue[T]) DequeueRear() (T, error) {
if len(dq.deque) == 0 {
var zeroVal T
return zeroVal, ErrEmptyDequeue
}
rearElement := dq.deque[len(dq.deque)-1]
dq.deque = dq.deque[:len(dq.deque)-1]
return rearElement, nil
}
func (dq *DoublyEndedQueue[T]) Front() (T, error) {
if (len(dq.deque)) == 0 {
var zeroVal T
return zeroVal, ErrEmptyDequeue
}
return dq.deque[0], nil
}
func (dq *DoublyEndedQueue[T]) Rear() (T, error) {
if (len(dq.deque)) == 0 {
var zeroVal T
return zeroVal, ErrEmptyDequeue
}
return dq.deque[len(dq.deque)-1], nil
}
func (dq *DoublyEndedQueue[T]) IsEmpty() bool {
return len(dq.deque) == 0
}
func (dq *DoublyEndedQueue[T]) Length() int {
return len(dq.deque)
}