Renamings; clear-all-marks; remove next/prev distinction
This commit is contained in:
parent
e66e2fba4a
commit
8a275ebdf9
|
@ -26,14 +26,13 @@
|
||||||
(struct-out mark-type)
|
(struct-out mark-type)
|
||||||
|
|
||||||
has-mark?
|
has-mark?
|
||||||
find-next-mark
|
find-mark
|
||||||
find-prev-mark
|
find-mark-pos
|
||||||
find-next-mark-pos
|
find-all-marks/type
|
||||||
find-prev-mark-pos
|
|
||||||
find-all-marks
|
|
||||||
set-mark
|
set-mark
|
||||||
clear-mark
|
clear-mark
|
||||||
replace-mark)
|
replace-mark
|
||||||
|
clear-all-marks)
|
||||||
|
|
||||||
(require racket/set)
|
(require racket/set)
|
||||||
(require racket/match)
|
(require racket/match)
|
||||||
|
@ -63,8 +62,8 @@
|
||||||
left ;; Rope or #f
|
left ;; Rope or #f
|
||||||
right ;; Rope or #f
|
right ;; Rope or #f
|
||||||
size* ;; Number, total length of this rope
|
size* ;; Number, total length of this rope
|
||||||
marks* ;; Set of Mark
|
marks* ;; Set of MarkType
|
||||||
mark-index ;; (Hash Mark (Hash Number (Setof Any))), marks in this span
|
mark-index ;; (Hash MarkType (Hash Number (Setof Any))), marks in this span
|
||||||
) #:transparent)
|
) #:transparent)
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -207,7 +206,7 @@
|
||||||
|
|
||||||
;; Searches from pos (inclusive) in the direction indicated.
|
;; Searches from pos (inclusive) in the direction indicated.
|
||||||
;; Pos points to a mark-position, not a character-position.
|
;; Pos points to a mark-position, not a character-position.
|
||||||
(define (find-mark r forward? mtype start-pos)
|
(define (find-mark* r forward? mtype start-pos)
|
||||||
(define (search-here r start-pos)
|
(define (search-here r start-pos)
|
||||||
(define marks (hash-ref (rope-mark-index r) mtype #f))
|
(define marks (hash-ref (rope-mark-index r) mtype #f))
|
||||||
(define lo (rope-lo r))
|
(define lo (rope-lo r))
|
||||||
|
@ -239,24 +238,24 @@
|
||||||
(define (has-mark? r mtype)
|
(define (has-mark? r mtype)
|
||||||
(and r (set-member? (rope-marks r) mtype)))
|
(and r (set-member? (rope-marks r) mtype)))
|
||||||
|
|
||||||
(define (find-mark* r forward? mtype start-pos)
|
(define (find-mark r mtype
|
||||||
(define maybe-pos+val (find-mark r forward? mtype start-pos))
|
#:forward? [forward? #t]
|
||||||
|
#:position [start-pos (if forward? 0 (rope-size r))])
|
||||||
|
(define maybe-pos+val (find-mark* r forward? mtype start-pos))
|
||||||
(if maybe-pos+val
|
(if maybe-pos+val
|
||||||
(values (car maybe-pos+val) (cdr maybe-pos+val))
|
(values (car maybe-pos+val) (cdr maybe-pos+val))
|
||||||
(values #f #f)))
|
(values #f #f)))
|
||||||
|
|
||||||
(define (find-next-mark r mtype [pos 0]) (find-mark* r #t mtype pos))
|
(define (find-mark-pos r mtype
|
||||||
(define (find-prev-mark r mtype [pos (rope-size r)]) (find-mark* r #f mtype pos))
|
#:forward? [forward? #t]
|
||||||
|
#:position [start-pos (if forward? 0 (rope-size r))])
|
||||||
(define (find-next-mark-pos r mtype [pos 0])
|
(cond [(find-mark* r forward? mtype start-pos) => car]
|
||||||
(cond [(find-mark r #t mtype pos) => car] [else #f]))
|
[else #f]))
|
||||||
(define (find-prev-mark-pos r mtype [pos (rope-size r)])
|
|
||||||
(cond [(find-mark r #f mtype pos) => car] [else #f]))
|
|
||||||
|
|
||||||
(define (mark-union h1 h2 offset)
|
(define (mark-union h1 h2 offset)
|
||||||
(for/fold [(h h1)] [((pos val) (in-hash h2))] (hash-set h (+ offset pos) val)))
|
(for/fold [(h h1)] [((pos val) (in-hash h2))] (hash-set h (+ offset pos) val)))
|
||||||
|
|
||||||
(define (find-all-marks r mtype)
|
(define (find-all-marks/type r mtype)
|
||||||
(define (walk r)
|
(define (walk r)
|
||||||
(if (set-member? (rope-marks r) mtype)
|
(if (set-member? (rope-marks r) mtype)
|
||||||
(let-values (((lo hi) (rope-lo+hi r)))
|
(let-values (((lo hi) (rope-lo+hi r)))
|
||||||
|
@ -306,10 +305,18 @@
|
||||||
(hash-set old-marks mtype new-mark)))]))))
|
(hash-set old-marks mtype new-mark)))]))))
|
||||||
|
|
||||||
(define (replace-mark r0 mtype new-pos new-value)
|
(define (replace-mark r0 mtype new-pos new-value)
|
||||||
(define pos (find-next-mark-pos r0 mtype))
|
(define pos (find-mark-pos r0 mtype))
|
||||||
(when (not pos) (error 'replace-mark "Mark ~a not found" mtype))
|
(when (not pos) (error 'replace-mark "Mark ~a not found" mtype))
|
||||||
(set-mark (clear-mark r0 mtype pos) mtype new-pos new-value))
|
(set-mark (clear-mark r0 mtype pos) mtype new-pos new-value))
|
||||||
|
|
||||||
|
(define (clear-all-marks r)
|
||||||
|
(and r
|
||||||
|
(struct-copy rope r
|
||||||
|
[marks* (set)]
|
||||||
|
[mark-index (hash)]
|
||||||
|
[left (clear-all-marks (rope-left r))]
|
||||||
|
[right (clear-all-marks (rope-right r))])))
|
||||||
|
|
||||||
(define (rope-size r)
|
(define (rope-size r)
|
||||||
(if r (rope-size* r) 0))
|
(if r (rope-size* r) 0))
|
||||||
|
|
||||||
|
@ -448,42 +455,42 @@
|
||||||
|
|
||||||
(let*-values (((r) (set-mark (rope-concat rope-pieces) mtype1 9 "original"))
|
(let*-values (((r) (set-mark (rope-concat rope-pieces) mtype1 9 "original"))
|
||||||
((_) (check-equal? (rope->string r) text))
|
((_) (check-equal? (rope->string r) text))
|
||||||
((pos val) (find-next-mark r mtype1))
|
((pos val) (find-mark r mtype1))
|
||||||
((_) (check-equal? pos 9))
|
((_) (check-equal? pos 9))
|
||||||
((_) (check-equal? val "original"))
|
((_) (check-equal? val "original"))
|
||||||
((r) (clear-mark r mtype1 pos))
|
((r) (clear-mark r mtype1 pos))
|
||||||
((_) (check-equal? (find-all-marks r mtype1) (hash)))
|
((_) (check-equal? (find-all-marks/type r mtype1) (hash)))
|
||||||
((pos val) (find-next-mark r mtype1))
|
((pos val) (find-mark r mtype1))
|
||||||
((_) (check-false pos))
|
((_) (check-false pos))
|
||||||
((_) (check-false val))
|
((_) (check-false val))
|
||||||
((r) (set-mark r mtype1 9 "second"))
|
((r) (set-mark r mtype1 9 "second"))
|
||||||
((pos val) (find-next-mark r mtype1))
|
((pos val) (find-mark r mtype1))
|
||||||
((_) (check-equal? pos 9))
|
((_) (check-equal? pos 9))
|
||||||
((_) (check-equal? val "second"))
|
((_) (check-equal? val "second"))
|
||||||
((r) (set-mark r mtype1 6 "first"))
|
((r) (set-mark r mtype1 6 "first"))
|
||||||
((r) (set-mark r mtype2 6 "third"))
|
((r) (set-mark r mtype2 6 "third"))
|
||||||
((_) (check-equal? (find-all-marks r mtype1) (hash 6 "first" 9 "second")))
|
((_) (check-equal? (find-all-marks/type r mtype1) (hash 6 "first" 9 "second")))
|
||||||
((_) (check-equal? (find-all-marks r mtype2) (hash 6 "third")))
|
((_) (check-equal? (find-all-marks/type r mtype2) (hash 6 "third")))
|
||||||
((pos val) (find-prev-mark r mtype1))
|
((pos val) (find-mark r mtype1 #:forward? #f))
|
||||||
((_) (check-equal? pos 9))
|
((_) (check-equal? pos 9))
|
||||||
((_) (check-equal? val "second"))
|
((_) (check-equal? val "second"))
|
||||||
((pos val) (find-next-mark r mtype1))
|
((pos val) (find-mark r mtype1))
|
||||||
((_) (check-equal? pos 6))
|
((_) (check-equal? pos 6))
|
||||||
((_) (check-equal? val "first"))
|
((_) (check-equal? val "first"))
|
||||||
((l r) (rope-split r pos))
|
((l r) (rope-split r pos))
|
||||||
((_) (check-equal? (find-all-marks r mtype1) (hash 3 "second")))
|
((_) (check-equal? (find-all-marks/type r mtype1) (hash 3 "second")))
|
||||||
((_) (check-equal? (find-all-marks l mtype1) (hash 6 "first")))
|
((_) (check-equal? (find-all-marks/type l mtype1) (hash 6 "first")))
|
||||||
((_) (check-equal? (find-all-marks r mtype2) (hash 0 "third")))
|
((_) (check-equal? (find-all-marks/type r mtype2) (hash 0 "third")))
|
||||||
((_) (check-equal? (find-all-marks l mtype2) (hash)))
|
((_) (check-equal? (find-all-marks/type l mtype2) (hash)))
|
||||||
((_) (check-equal? (rope->string l) (substring text 0 6)))
|
((_) (check-equal? (rope->string l) (substring text 0 6)))
|
||||||
((_) (check-equal? (rope->string r) (substring text 6 (string-length text))))
|
((_) (check-equal? (rope->string r) (substring text 6 (string-length text))))
|
||||||
((_) (check-equal? (rope-marks l) (set mtype1)))
|
((_) (check-equal? (rope-marks l) (set mtype1)))
|
||||||
((_) (check-equal? (rope-marks r) (set mtype1 mtype2)))
|
((_) (check-equal? (rope-marks r) (set mtype1 mtype2)))
|
||||||
((l r) (rope-split r 3))
|
((l r) (rope-split r 3))
|
||||||
((_) (check-equal? (find-all-marks r mtype1) (hash)))
|
((_) (check-equal? (find-all-marks/type r mtype1) (hash)))
|
||||||
((_) (check-equal? (find-all-marks l mtype1) (hash 3 "second")))
|
((_) (check-equal? (find-all-marks/type l mtype1) (hash 3 "second")))
|
||||||
((_) (check-equal? (find-all-marks r mtype2) (hash)))
|
((_) (check-equal? (find-all-marks/type r mtype2) (hash)))
|
||||||
((_) (check-equal? (find-all-marks l mtype2) (hash 0 "third")))
|
((_) (check-equal? (find-all-marks/type l mtype2) (hash 0 "third")))
|
||||||
((_) (check-equal? (rope->string l) (substring text 6 9)))
|
((_) (check-equal? (rope->string l) (substring text 6 9)))
|
||||||
((_) (check-equal? (rope->string r) (substring text 9 (string-length text)))))
|
((_) (check-equal? (rope->string r) (substring text 9 (string-length text)))))
|
||||||
(void)))
|
(void)))
|
||||||
|
|
Loading…
Reference in New Issue