|
| 1 | +(library (capy deque) |
| 2 | + (export |
| 3 | + make-deque |
| 4 | + deque |
| 5 | + deque-capacity |
| 6 | + deque-length |
| 7 | + deque-push-back! |
| 8 | + deque-push-front! |
| 9 | + deque-pop-back! |
| 10 | + deque-pop-front! |
| 11 | + deque-ref |
| 12 | + deque-set! |
| 13 | + deque->vector |
| 14 | + vector->deque |
| 15 | + list->deque |
| 16 | + deque-append!) |
| 17 | + (import (rnrs) |
| 18 | + (core struct) |
| 19 | + (only (scheme base) vector-copy) |
| 20 | + (only (scheme r5rs) modulo) |
| 21 | + (only (capy) register-tuple-printer! print)) |
| 22 | + |
| 23 | + (define-struct %deque |
| 24 | + (buf head len)) |
| 25 | + |
| 26 | + (register-tuple-printer! |
| 27 | + 'type:%deque |
| 28 | + (lambda (obj port quote?) |
| 29 | + (display "#<deque " port) |
| 30 | + (let ((len (deque-length obj)) |
| 31 | + (last (- (deque-length obj) 1))) |
| 32 | + (let loop ((i 0)) |
| 33 | + (when (< i len) |
| 34 | + (print (deque-ref obj i) port quote?) |
| 35 | + (when (< i last) |
| 36 | + (display " " port)) |
| 37 | + (loop (+ i 1))))) |
| 38 | + (display ">" port))) |
| 39 | + |
| 40 | + |
| 41 | + (define (make-deque capacity) |
| 42 | + (let ((initial-capacity (if (>= capacity 1) |
| 43 | + capacity |
| 44 | + 8))) |
| 45 | + (make-%deque (make-vector initial-capacity) 0 0))) |
| 46 | + |
| 47 | + (define (deque . args) |
| 48 | + (let ((dq (make-deque (max 8 (length args))))) |
| 49 | + (for-each (lambda (v) (deque-push-back! dq v)) args) |
| 50 | + dq)) |
| 51 | + |
| 52 | + (define (grow! dq) |
| 53 | + (let* ((old-buf (%deque-buf dq)) |
| 54 | + (old-cap (vector-length old-buf)) |
| 55 | + (new-cap (* 2 old-cap)) |
| 56 | + (new-buf (make-vector new-cap))) |
| 57 | + ;; Copy elements linearly to the new buffer |
| 58 | + (do ((i 0 (+ i 1))) |
| 59 | + ((= i (deque-len dq))) |
| 60 | + (vector-set! new-buf i |
| 61 | + (vector-ref old-buf |
| 62 | + (modulo (+ (deque-head dq) i) old-cap)))) |
| 63 | + (deque-buf-set! dq new-buf) |
| 64 | + (deque-head-set! dq 0))) |
| 65 | + (define (deque-capacity dq) |
| 66 | + (vector-length (%deque-buf dq))) |
| 67 | + (define (deque-length dq) |
| 68 | + (%deque-len dq)) |
| 69 | + |
| 70 | + (define (deque-push-back! dq value) |
| 71 | + (when (= (%deque-len dq) (deque-capacity dq)) |
| 72 | + (grow! dq)) |
| 73 | + (let* ((buf (%deque-buf dq)) |
| 74 | + (head (%deque-head dq)) |
| 75 | + (len (%deque-len dq)) |
| 76 | + (cap (vector-length buf)) |
| 77 | + (tail-index (modulo (+ head len) cap))) |
| 78 | + (vector-set! buf tail-index value) |
| 79 | + (%deque-len-set! dq (+ len 1)))) |
| 80 | + |
| 81 | + (define (deque-push-front! dq value) |
| 82 | + (when (= (%deque-len dq) (deque-capacity dq)) |
| 83 | + (grow! dq)) |
| 84 | + (let* ((buf (%deque-buf dq)) |
| 85 | + (head (%deque-head dq)) |
| 86 | + (len (%deque-len dq)) |
| 87 | + (cap (vector-length buf)) |
| 88 | + (new-head (modulo (+ head (- cap 1)) cap))) |
| 89 | + (vector-set! buf new-head value) |
| 90 | + (%deque-head-set! dq new-head) |
| 91 | + (%deque-len-set! dq (+ len 1)))) |
| 92 | + |
| 93 | + (define (deque-pop-back! dq) |
| 94 | + (unless (> (%deque-len dq) 0) |
| 95 | + (error 'deque-pop-back! "empty deque")) |
| 96 | + |
| 97 | + (let* ((buf (%deque-buf dq)) |
| 98 | + (head (%deque-head dq)) |
| 99 | + (len (%deque-len dq)) |
| 100 | + (cap (vector-length buf)) |
| 101 | + (tail-index (modulo (+ head (- len 1)) cap)) |
| 102 | + (value (vector-ref buf tail-index))) |
| 103 | + (%deque-len-set! dq (- len 1)) |
| 104 | + value)) |
| 105 | + |
| 106 | + (define (deque-pop-front! dq) |
| 107 | + (unless (> (%deque-len dq) 0) |
| 108 | + (error 'deque-pop-front! "empty deque")) |
| 109 | + |
| 110 | + (let* ((buf (%deque-buf dq)) |
| 111 | + (head (%deque-head dq)) |
| 112 | + (len (%deque-len dq)) |
| 113 | + (cap (vector-length buf)) |
| 114 | + (value (vector-ref buf head)) |
| 115 | + (new-head (modulo (+ head 1) cap))) |
| 116 | + (%deque-head-set! dq new-head) |
| 117 | + (%deque-len-set! dq (- len 1)) |
| 118 | + value)) |
| 119 | + |
| 120 | + (define (deque-ref dq index) |
| 121 | + (unless (and (>= index 0) (< index (%deque-len dq))) |
| 122 | + (error 'deque-ref "index out of bounds")) |
| 123 | + (let* ((buf (%deque-buf dq)) |
| 124 | + (head (%deque-head dq)) |
| 125 | + (cap (vector-length buf)) |
| 126 | + (real-index (modulo (+ head index) cap))) |
| 127 | + (vector-ref buf real-index))) |
| 128 | + |
| 129 | + (define (deque-set! dq index value) |
| 130 | + (unless (and (>= index 0) (< index (%deque-len dq))) |
| 131 | + (error 'deque-set! "index out of bounds")) |
| 132 | + (let* ((buf (%deque-buf dq)) |
| 133 | + (head (%deque-head dq)) |
| 134 | + (cap (vector-length buf)) |
| 135 | + (real-index (modulo (+ head index) cap))) |
| 136 | + (vector-set! buf real-index value))) |
| 137 | + |
| 138 | + (define (deque->vector dq) |
| 139 | + (let* ((buf (%deque-buf dq)) |
| 140 | + (head (%deque-head dq)) |
| 141 | + (len (%deque-len dq)) |
| 142 | + (cap (vector-length buf)) |
| 143 | + (result (make-vector len))) |
| 144 | + (do ((i 0 (+ i 1))) |
| 145 | + ((= i len) result) |
| 146 | + (vector-set! result i |
| 147 | + (vector-ref buf |
| 148 | + (modulo (+ head i) cap)))))) |
| 149 | + |
| 150 | + (define (vector->deque vec) |
| 151 | + (let* ((len (vector-length vec)) |
| 152 | + (dq (make-deque len))) |
| 153 | + (do ((i 0 (+ i 1))) |
| 154 | + ((= i len) dq) |
| 155 | + (deque-push-back! dq (vector-ref vec i))))) |
| 156 | + |
| 157 | + (define (list->deque lst) |
| 158 | + (let ((dq (make-deque (max 8 (length lst))))) |
| 159 | + (for-each (lambda (v) (deque-push-back! dq v)) lst) |
| 160 | + dq)) |
| 161 | + |
| 162 | + (define (deque-append! dq1 dq2) |
| 163 | + (do ((i 0 (+ i 1))) |
| 164 | + ((= i (deque-length dq2))) |
| 165 | + (deque-push-back! dq1 (deque-ref dq2 i))))) |
| 166 | + |
0 commit comments