Clamp `adhoc-retract!` to not drop below zero.
This commit is contained in:
parent
2575b71db4
commit
ec0933ffdd
|
@ -36,9 +36,11 @@
|
|||
(begin (hash-set! b x new-count)
|
||||
(if (zero? old-count) 'absent->present 'present->present))))
|
||||
|
||||
(define (bag-change b x delta)
|
||||
(define (bag-change b x delta #:clamp? [clamp? #f])
|
||||
(define old-count (bag-ref b x))
|
||||
(define new-count (+ old-count delta))
|
||||
(define new-count (if clamp?
|
||||
(max 0 (+ old-count delta))
|
||||
(+ old-count delta)))
|
||||
(if (zero? new-count)
|
||||
(values (hash-remove b x)
|
||||
(if (zero? old-count) 'absent->absent 'present->absent))
|
||||
|
|
|
@ -549,13 +549,15 @@
|
|||
|
||||
(define (adhoc-retract! ac assertion)
|
||||
(when (not (void? assertion))
|
||||
(define-values (new-assertions summary) (bag-change (actor-adhoc-assertions ac) assertion -1))
|
||||
(define-values (new-assertions summary)
|
||||
(bag-change (actor-adhoc-assertions ac) assertion -1 #:clamp? #t))
|
||||
(set-actor-adhoc-assertions! ac new-assertions)
|
||||
(match summary
|
||||
;; 'absent->absent and 'absent->present absurd (if the call to
|
||||
;; `adhoc-retract!` matches a previous `adhoc-assert!`)
|
||||
;; 'absent->present absurd (if the call to `adhoc-retract!`
|
||||
;; matches a previous `adhoc-assert!`)
|
||||
['present->absent (retract! ac assertion)]
|
||||
['present->present (void)])))
|
||||
['present->present (void)]
|
||||
['absent->absent (void)]))) ;; can happen if we're exploiting the clamping
|
||||
|
||||
(define (adhoc-assert! ac assertion)
|
||||
(when (not (void? assertion))
|
||||
|
|
Loading…
Reference in New Issue