diff --git a/syndicate/examples/ircd/channel.rkt b/syndicate/examples/ircd/channel.rkt index 5471a15..7d526fc 100644 --- a/syndicate/examples/ircd/channel.rkt +++ b/syndicate/examples/ircd/channel.rkt @@ -16,6 +16,9 @@ (field [topic #f]) (assert (ircd-channel-topic Ch (topic))) + (define/query-count user-count (ircd-channel-member Ch $who) 'any) + (assert (ircd-channel-user-count Ch (hash-ref (user-count) 'any 0))) + (on (message (ircd-action $who (irc-message _ "MODE" (list Ch "b") _))) (send! (ircd-event who (irc-message server-prefix 368 (list (lookup-nick who) Ch) "End of Channel Ban List")))) diff --git a/syndicate/examples/ircd/protocol.rkt b/syndicate/examples/ircd/protocol.rkt index 4ce19f4..5ba533c 100644 --- a/syndicate/examples/ircd/protocol.rkt +++ b/syndicate/examples/ircd/protocol.rkt @@ -7,6 +7,7 @@ (struct-out ircd-channel) (struct-out ircd-channel-member) (struct-out ircd-channel-topic) + (struct-out ircd-channel-user-count) (struct-out ircd-action) (struct-out ircd-event) @@ -22,6 +23,7 @@ (assertion-struct ircd-channel (channel)) (assertion-struct ircd-channel-member (channel conn)) (assertion-struct ircd-channel-topic (channel topic)) +(assertion-struct ircd-channel-user-count (channel count)) (message-struct ircd-action (conn message)) (message-struct ircd-event (conn message)) diff --git a/syndicate/syntax.rkt b/syndicate/syntax.rkt index 5273196..8bc38b4 100644 --- a/syndicate/syntax.rkt +++ b/syndicate/syntax.rkt @@ -32,17 +32,17 @@ query-set query-hash ;; query-hash-set - ;; query-count + query-count query-value* query-set* query-hash* ;; query-hash-set* - ;; query-count* + query-count* define/query-value define/query-set define/query-hash ;; define/query-hash-set - ;; define/query-count + define/query-count immediate-query send! @@ -69,6 +69,7 @@ (require "skeleton.rkt") (require "pattern.rkt") +(require racket/match) (require racket/set) (require syndicate/dataflow) (require syndicate/protocol/instance) @@ -554,38 +555,38 @@ ;; (F (hashset-remove (F) K V))))) ;; F))])) -;; (define-syntax (query-count stx) -;; (syntax-parse stx -;; [(_ field-name args ...) -;; (quasisyntax/loc stx -;; (let () -;; (field [field-name (hash)]) -;; (query-count* field-name args ...)))])) +(define-syntax (query-count stx) + (syntax-parse stx + [(_ field-name args ...) + (quasisyntax/loc stx + (let () + (field [field-name (hash)]) + (query-count* field-name args ...)))])) -;; (define-syntax (query-count* stx) -;; (syntax-parse stx -;; [(_ field-name P expr on-add:on-add on-remove:on-remove) -;; (quasisyntax/loc stx -;; (let ((F field-name)) -;; (on (asserted P) #:priority *query-priority* -;; (let ((E expr)) -;; #,@(schedule-query-handler-stxs (attribute on-add.expr)) -;; (F (hash-set (F) E (+ 1 (hash-ref (F) E 0)))))) -;; (on (retracted P) #:priority *query-priority-high* -;; (let ((E expr)) -;; #,@(schedule-query-handler-stxs (attribute on-remove.expr)) -;; (let ((F0 (F))) -;; (F (match (hash-ref F0 E 0) -;; [0 F0] ;; huh -;; [1 (hash-remove F0 E)] -;; [n (hash-set F0 E (- n 1))]))))) -;; F))])) +(define-syntax (query-count* stx) + (syntax-parse stx + [(_ field-name P expr on-add:on-add on-remove:on-remove) + (quasisyntax/loc stx + (let ((F field-name)) + (on (asserted P) #:priority *query-priority* + (let ((E expr)) + #,@(schedule-query-handler-stxs (attribute on-add.expr)) + (F (hash-set (F) E (+ 1 (hash-ref (F) E 0)))))) + (on (retracted P) #:priority *query-priority-high* + (let ((E expr)) + #,@(schedule-query-handler-stxs (attribute on-remove.expr)) + (let ((F0 (F))) + (F (match (hash-ref F0 E 0) + [0 F0] ;; huh + [1 (hash-remove F0 E)] + [n (hash-set F0 E (- n 1))]))))) + F))])) (define-syntax-rule (define/query-value id ae P x ...) (define id (query-value id ae P x ...))) (define-syntax-rule (define/query-set id P x ...) (define id (query-set id P x ...))) (define-syntax-rule (define/query-hash id P x ...) (define id (query-hash id P x ...))) ;; (define-syntax-rule (define/query-hash-set id P x ...) (define id (query-hash-set id P x ...))) -;; (define-syntax-rule (define/query-count id P x ...) (define id (query-count id P x ...))) +(define-syntax-rule (define/query-count id P x ...) (define id (query-count id P x ...))) (define-syntax (immediate-query stx) (syntax-case stx ()