#| Copyright 2024 Peter McGoron | | Licensed under the Apache License, Version 2.0 (the "License"); | you may not use this file except in compliance with the License. | You may obtain a copy of the License at | | http://www.apache.org/licenses/LICENSE-2.0 | | Unless required by applicable law or agreed to in writing, software | distributed under the License is distributed on an "AS IS" BASIS, | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | See the License for the specific language governing permissions and | limitations under the License. |# (define-library (mcgoron weight-balanced-trees test random-number-vector) (import (scheme base) (srfi 158) (srfi 197) (srfi 252) (srfi 133) (srfi 26) (srfi 132)) (export in-order-vector-generator) (begin (define (random-number-vector of) ;; Generate a random vector of exact integers with at most `of` number ;; of elements. (vector-generator-of (exact-integer-generator) of)) (define (filter-non-empty-vectors gen) ;; Filter out the empty vector. (gremove (lambda (vec) (zero? (vector-length vec))) gen)) (define (remove-duplicates gen) ;; Filter out vectors with duplicate entries. (define (filter vec) (call/cc (lambda (return) (vector-fold (lambda (prev elem) (cond ((null? prev) elem) ((= elem prev) (return #f)) (else elem))) '() vec) #t))) (gfilter filter gen)) (define (make-in-order gen) ;; Sort all vectors to be in-order. (gmap (cut vector-sort < <>) gen)) (define (in-order-vector-generator of) (chain (random-number-vector of) (filter-non-empty-vectors _) (make-in-order _) (remove-duplicates _)))))