add vec.scm
This commit is contained in:
parent
729662be8e
commit
3a46a24b2f
1 changed files with 79 additions and 0 deletions
79
misc/data_structures/vec.scm
Normal file
79
misc/data_structures/vec.scm
Normal file
|
@ -0,0 +1,79 @@
|
|||
;;;; Vector
|
||||
|
||||
(define (vector-each-impl fn vec veclen)
|
||||
(do ((i 0 (+ i 1))) ((= i veclen))
|
||||
(fn (vector-ref vec i))))
|
||||
|
||||
(define (vector-each fn vec)
|
||||
(vector-each-impl fn vec (vector-length vec)))
|
||||
|
||||
(define (vector-each-neigh fn vec)
|
||||
(void))
|
||||
|
||||
;;; Asserts that both `invec` and `outvec` are of the same length
|
||||
;;; `invec` and `outvec` can be the same vector
|
||||
(define (vector-do fn invec outvec len)
|
||||
(do ((i 0 (+ i 1))) ((= i len))
|
||||
(vector-set! outvec i (fn (vector-ref invec i)))))
|
||||
|
||||
(define (vector-map fn vec)
|
||||
(let* ((veclen (vector-length vec))
|
||||
(resv (make-vector veclen)))
|
||||
(vector-do fn vec resv veclen)
|
||||
resv))
|
||||
|
||||
;;; In-place map
|
||||
(define (vector-map! fn vec)
|
||||
(vector-do fn vec vec (vector-length vec)))
|
||||
|
||||
;;;; Dynamic vector
|
||||
|
||||
;;; Make a dynamic vector
|
||||
(define (make-dynvec len cap)
|
||||
(cons len (make-vector cap)))
|
||||
|
||||
(define (dynvec-length dvec)
|
||||
(car dvec))
|
||||
|
||||
(define (dynvec-ref dvec i)
|
||||
(vector-ref (cdr dvec) i))
|
||||
|
||||
(define (dynvec->vec dvec)
|
||||
(cdr dvec))
|
||||
|
||||
(define (dynvec-vec dvec)
|
||||
(cdr dvec))
|
||||
|
||||
(define (dynvec-append! dvec . args)
|
||||
(let ((i (dynvec-length dvec)))
|
||||
(for-each
|
||||
(lambda (v)
|
||||
(vector-set! (dynvec-vec dvec) i v)
|
||||
(set! i (+ i 1)))
|
||||
args)
|
||||
(set-car! dvec i)))
|
||||
|
||||
(define (dynvec-each fn dvec)
|
||||
(vector-each-impl fn (dynvec-vec dvec) (dynvec-length dvec)))
|
||||
|
||||
(define (dynvec-map fn dvec)
|
||||
(let* ((len (dynvec-length dvec))
|
||||
(resdv (make-dynvec len len)))
|
||||
(vector-do
|
||||
fn
|
||||
(dynvec-vec dvec)
|
||||
(dynvec-vec resdv)
|
||||
len)
|
||||
resdv))
|
||||
|
||||
(define (dynvec-map! fn dvec)
|
||||
(let ((vec (dynvec-ref dvec)))
|
||||
(vector-do fn vec vec (dynvec-length dvec))))
|
||||
|
||||
(define (dynvec-to-list-rec dvec lst i)
|
||||
(if (< i 0)
|
||||
lst
|
||||
(dynvec-to-list-rec dvec (cons (dynvec-ref dvec i) lst) (- i 1))))
|
||||
|
||||
(define (dynvec->list dvec)
|
||||
(dynvec-to-list-rec dvec '() (- (dynvec-length dvec) 1)))
|
Loading…
Add table
Reference in a new issue