#lang scheme (require tests/eli-tester "main.ss") (define-syntax deque-seq (syntax-rules (push unshift) [(_) deque-empty] [(_ [push v] . rest) (deque-push v (deque-seq . rest))] [(_ [unshift v] . rest) (deque-unshift v (deque-seq . rest))])) (define (deque-elements* q) (for/list ([v q]) v)) (test (deque-empty? deque-empty) => #t (deque-empty? (deque-push 1 deque-empty)) => #f (deque-empty? (deque-unshift 1 deque-empty)) => #f (deque-pop deque-empty) =error> "contract" (deque-shift deque-empty) =error> "contract" (deque-empty? (deque-pop (deque-push 1 deque-empty))) => #t (deque-empty? (deque-pop (deque-unshift 1 deque-empty))) => #t (deque-empty? (deque-shift (deque-push 1 deque-empty))) => #t (deque-empty? (deque-shift (deque-unshift 1 deque-empty))) => #t (deque-length deque-empty) => 0 (deque-length (deque-seq [push 1] [push 2] [push 3])) => 3 (deque-first (deque-seq [push 1] [push 2] [push 3])) => 3 (deque-first (deque-seq [unshift 1] [unshift 2] [unshift 3])) => 1 (deque-first (deque-seq [push 1] [unshift 4] [push 2] [push 3])) => 4 (deque-first (deque-seq [unshift 1] [push 4] [unshift 2] [unshift 3])) => 1 (deque-first (deque-seq [push 1] [unshift 4] [push 2] [unshift 5] [push 3])) => 4 (deque-first (deque-seq [unshift 1] [push 4] [unshift 2] [push 5] [unshift 3])) => 1 (deque-last (deque-seq [push 1] [push 2] [push 3])) => 1 (deque-last (deque-seq [unshift 1] [unshift 2] [unshift 3])) => 3 (deque-last (deque-seq [push 1] [unshift 4] [push 2] [push 3])) => 1 (deque-last (deque-seq [unshift 1] [push 4] [unshift 2] [unshift 3])) => 4 (deque-last (deque-seq [push 1] [unshift 4] [push 2] [unshift 5] [push 3])) => 1 (deque-last (deque-seq [unshift 1] [push 4] [unshift 2] [push 5] [unshift 3])) => 4 (deque-elements (deque-seq [push 1] [push 2] [push 3])) => (list 3 2 1) (deque-elements (deque-seq [unshift 1] [unshift 2] [unshift 3])) => (list 1 2 3) (deque-elements (deque-seq [push 1] [unshift 4] [push 2] [push 3])) => (list 4 3 2 1) (deque-elements (deque-seq [unshift 1] [push 4] [unshift 2] [unshift 3])) => (list 1 2 3 4) (deque-elements (deque-seq [push 1] [unshift 4] [push 2] [unshift 5] [push 3])) => (list 4 5 3 2 1) (deque-elements (deque-seq [unshift 1] [push 4] [unshift 2] [push 5] [unshift 3])) => (list 1 2 3 5 4) (deque-elements* (deque-seq [push 1] [push 2] [push 3])) => (list 3 2 1) (deque-elements* (deque-seq [unshift 1] [unshift 2] [unshift 3])) => (list 1 2 3) (deque-elements* (deque-seq [push 1] [unshift 4] [push 2] [push 3])) => (list 4 3 2 1) (deque-elements* (deque-seq [unshift 1] [push 4] [unshift 2] [unshift 3])) => (list 1 2 3 4) (deque-elements* (deque-seq [push 1] [unshift 4] [push 2] [unshift 5] [push 3])) => (list 4 5 3 2 1) (deque-elements* (deque-seq [unshift 1] [push 4] [unshift 2] [push 5] [unshift 3])) => (list 1 2 3 5 4) (deque-elements (deque-shift (deque-seq [push 1] [push 2] [push 3]))) => (list 2 1) (deque-elements (deque-shift (deque-seq [unshift 1] [unshift 2] [unshift 3]))) => (list 2 3) (deque-elements (deque-shift (deque-seq [push 1] [unshift 4] [push 2] [push 3]))) => (list 3 2 1) (deque-elements (deque-shift (deque-seq [unshift 1] [push 4] [unshift 2] [unshift 3]))) => (list 2 3 4) (deque-elements (deque-shift (deque-seq [push 1] [unshift 4] [push 2] [unshift 5] [push 3]))) => (list 5 3 2 1) (deque-elements (deque-shift (deque-seq [unshift 1] [push 4] [unshift 2] [push 5] [unshift 3]))) => (list 2 3 5 4) (deque-elements (deque-pop (deque-seq [push 1] [push 2] [push 3]))) => (list 3 2) (deque-elements (deque-pop (deque-seq [unshift 1] [unshift 2] [unshift 3]))) => (list 1 2) (deque-elements (deque-pop (deque-seq [push 1] [unshift 4] [push 2] [push 3]))) => (list 4 3 2) (deque-elements (deque-pop (deque-seq [unshift 1] [push 4] [unshift 2] [unshift 3]))) => (list 1 2 3) (deque-elements (deque-pop (deque-seq [push 1] [unshift 4] [push 2] [unshift 5] [push 3]))) => (list 4 5 3 2) (deque-elements (deque-pop (deque-seq [unshift 1] [push 4] [unshift 2] [push 5] [unshift 3]))) => (list 1 2 3 5) )