User count; define/query-count

This commit is contained in:
Tony Garnock-Jones 2019-01-29 20:47:06 +00:00
parent 9c5d9768b4
commit 7e2284ac11
3 changed files with 35 additions and 29 deletions

View File

@ -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"))))

View File

@ -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))

View File

@ -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 ()