Demand matcher

This commit is contained in:
Tony Garnock-Jones 2013-10-26 19:14:11 +01:00
parent a357ee388c
commit 4faee90de2
1 changed files with 29 additions and 0 deletions

29
demand-matcher.rkt Normal file
View File

@ -0,0 +1,29 @@
#lang racket/base
(require "core.rkt")
(require "presence-detector.rkt")
(provide (except-out (struct-out demand-matcher) demand-matcher)
(rename-out [make-demand-matcher demand-matcher])
demand-matcher-update)
(struct demand-matcher (subscription-is-demand? increase-handler decrease-handler state)
#:transparent)
(define (default-decrease-handler removed state)
(error 'demand-matcher "Unexpected decrease in supply for route ~a" removed))
(define (make-demand-matcher increase-handler
[decrease-handler default-decrease-handler]
#:subscription-is-demand? [subscription-is-demand? #t])
(demand-matcher subscription-is-demand?
increase-handler
decrease-handler
(presence-detector)))
(define (demand-matcher-update d state0 rs)
(define-values (new-state added removed) (presence-detector-update (demand-matcher-state d)))
(define state1 (for/fold ([s state0]) ([r added]) ((demand-matcher-increase-handler d) r s)))
(define state2 (for/fold ([s state1]) ([r removed]) ((demand-matcher-decrease-handler d) r s)))
(values (struct-copy demand-matcher d [state new-state])
state2))