(define-module (bits) #:export (make-bits empty-bits bits-vector bits-len add-bit!)) (define (make-bits bv len) (cons bv len)) (define (bits-vector bits) (car bits)) (define (set-bits-vector! bits bv) (set-car! bits bv)) (define (bits-len bits) (cdr bits)) (define (set-bits-len! bits len) (set-cdr! bits len)) (define (empty-bits) (make-bits #* 0)) (define (grow-bits! bits) (let* ((len (bits-len bits)) (new-v (make-bitvector (if (zero? len) 1 (* len 2)) #f))) ;; see 39c5363b4 (bit-set*! new-v (bits-vector bits) #t) (set-bits-vector! bits new-v))) (define (add-bit! bits val) (let ((len (bits-len bits))) (if (= len (bitvector-length (bits-vector bits))) (grow-bits! bits)) (bitvector-set! (bits-vector bits) len val) (set-bits-len! bits (1+ len))))