; deque
(define (front-ptr deque) (car deque))
(define (rear-ptr deque) (cdr deque))
(define (set-front-ptr! deque item) (set-car! deque item))
(define (set-rear-ptr! deque item) (set-cdr! deque item))
(define (make-node item) (cons item (cons '() '())))
(define (prev-ptr node) (cadr node))
(define (next-ptr node) (cddr node))
(define (set-prev-ptr! node item) (set-car! (cdr node) item))
(define (set-next-ptr! node item) (set-cdr! (cdr node) item))

; constructor
(define (make-deque) (cons '() '()))

; selectors
(define (empty-deque? deque)
  (or (null? (front-ptr deque)) (null? (rear-ptr deque))))

(define (front deque)
  (if (empty-deque? deque)
      (error "FRONT called with an empty deque" deque)
      (car (front-ptr deque))))

(define (rear deque)
  (if (empty-deque? deque)
      (error "REAR called with an empty deque" deque)
      (car (rear-ptr deque))))

; mutators
(define (rear-insert-deque! deque item)
  (let ((new-node (make-node item)))
    (cond ((empty-deque? deque)
           (set-front-ptr! deque new-node)
           (set-rear-ptr! deque new-node)
           'ok)
          (else
            (set-next-ptr! (rear-ptr deque) new-node)
            (set-prev-ptr! new-node (rear-ptr deque))
            (set-rear-ptr! deque new-node)
            'ok))))

(define (front-insert-deque! deque item)
  ;<???>
  )

(define (front-delete-deque! deque)
  (cond ((empty-deque? deque)
         (error "Delete called with an empty deque" deque))
        (else
          ;<???>
          )))

(define (rear-delete-deque! deque)
  ;<???>
  )
  
(define (print-deque deque)
  ;<???>
  )
  