#lang scheme/base ;; owned by ryanc (require scheme/contract scheme/promise scheme/dict unstable/skip-list) ;; NOTE-1 ;; I need to be able to split intervals. So I can either have ;; closed intervals on the integers or half-open intervals of ;; arbitrary total orders. I'm going to do half-open intervals. ;; An interval-map is (make-interval-map skip-list =? (cons End Value) ;; Invariant: intervals are disjoint (but the end of one interval ;; can be the same as the start of the next, since half-open). (define make-interval-map* (let ([make-interval-map (lambda (=? =? s start)]) (let ([ixstart (and ix (skip-list-iterate-key s ix))]) (cond [(and ix (=? s start)]) (when ix (let ([ixstart (skip-list-iterate-key s ix)]) (when ( make-interval-map-iter] [else #f])) (define (interval-map-iterate-next im iter) (cond [(skip-list-iterate-next (interval-map-s im) (interval-map-iter-si iter)) => make-interval-map-iter] [else #f])) (define (interval-map-iterate-key im iter) (let ([s (interval-map-s im)] [is (interval-map-iter-si iter)]) (cons (skip-list-iterate-key s is) (car (skip-list-iterate-value s is))))) (define (interval-map-iterate-value im iter) (let ([s (interval-map-s im)] [is (interval-map-iter-si iter)]) (cdr (skip-list-iterate-value s is)))) ;; Interval map (define-struct interval-map (s =? =? s to)]) (when ix (let* ([ixkey (skip-list-iterate-key s ix)] [ixvalue (skip-list-iterate-value s ix)]) (skip-list-iterate-set-key! s ix (translate ixkey)) (skip-list-iterate-set-value! s ix (cons (translate (car ixvalue)) (cdr ixvalue)))) (loop (skip-list-iterate-next s ix))))) (provide/contract [rename make-interval-map* make-interval-map (-> procedure? procedure? interval-map?)] [make-numeric-interval-map (-> interval-map-with-translate?)] [interval-map? (-> any/c any)] [interval-map-with-translate? (-> any/c any)] [interval-map-ref (->* (interval-map? any/c) (any/c) any)] [interval-map-set! (-> interval-map? any/c any/c any/c any)] [interval-map-update*! (->* (interval-map? any/c any/c (-> any/c any/c)) (any/c) any)] [interval-map-cons*! (->* (interval-map? any/c any/c any/c) (any/c) any)] [interval-map-remove! (-> interval-map? any/c any/c any)] [interval-map-contract! (-> interval-map-with-translate? any/c any/c any)] [interval-map-expand! (-> interval-map-with-translate? any/c any/c any)] [interval-map-iterate-first (-> interval-map? (or/c interval-map-iter? #f))] [interval-map-iterate-next (-> interval-map? interval-map-iter? (or/c interval-map-iter? #f))] [interval-map-iterate-key (-> interval-map? interval-map-iter? any)] [interval-map-iterate-value (-> interval-map? interval-map-iter? any)] [interval-map-iter? (-> any/c any)]) #| ;; Testing (define (dump im) (dict-map (interval-map-s im) list)) (define im (make-interval-map* = <)) (interval-map-set! im 1 3 '(a)) (interval-map-set! im 4 7 '(b)) (dump im) ;;(interval-map-remove! im 2 5) (interval-map-cons*! im 2 5 'c null) (dump im) |# #| (define sim (make-interval-map* string=? string