diff --git a/conversation.rkt b/conversation.rkt index 9927b63..eb0336a 100644 --- a/conversation.rkt +++ b/conversation.rkt @@ -29,18 +29,19 @@ (struct credit (who amount) #:prefab) ;; give someone an amount of credit -(struct room (name ch members) #:transparent) +(struct room (ch)) (struct blocking-box (ch)) +(struct room-state (name ch members) #:transparent) (struct binding (name in-ch out-ch disconnect-box queue-box thread) #:transparent) (define (make-room [name (gensym 'room)]) (define ch (make-channel)) - (thread (lambda () (room-main (room name ch '())))) - ch) + (thread (lambda () (room-main (room-state name ch '())))) + (room ch)) (define (join-room room [name (gensym 'peer)]) - (make-object membership% room name)) + (make-object membership% (room-ch room) name)) (define (make-blocking-box) (blocking-box (make-channel))) @@ -141,14 +142,14 @@ (handle-evt (thread-dead-evt (binding-thread b)) (lambda (dummy) (room-main (part state b 'EXIT)))))) - (handle-evt (room-ch state) + (handle-evt (room-state-ch state) (match-lambda (`(join ,name ,in-ch ,out-ch ,disconnect-box ,thread) (room-main (join state name in-ch out-ch disconnect-box thread))) (unexpected (log-warning (format "room-main: unexpected message ~v" unexpected)) (room-main state)))) - (room-members state)))) + (room-state-members state)))) (define (handle-binding-message state b message) (match message @@ -170,21 +171,21 @@ (define (membership-summary state) (map (lambda (member) (arrived (binding-name member))) - (room-members state))) + (room-state-members state))) (define (add-binding state b) - (struct-copy room state - [members (cons b (room-members state))])) + (struct-copy room-state state + [members (cons b (room-state-members state))])) (define (remove-binding state b) - (struct-copy room state - [members (remove b (room-members state) eq?)])) + (struct-copy room-state state + [members (remove b (room-state-members state) eq?)])) (define (broadcast state b message) (for-each (lambda (member) (when (not (eq? member b)) (enqueue-message! member message))) - (room-members state)) + (room-state-members state)) state) (define (enqueue-message! b message)