2016-07-13 01:17:07 +00:00
|
|
|
#lang syndicate/actor
|
|
|
|
|
|
|
|
(require racket/set)
|
|
|
|
|
2016-07-13 20:34:16 +00:00
|
|
|
(require (submod syndicate/actor priorities))
|
|
|
|
|
2016-07-13 20:35:55 +00:00
|
|
|
(define-syntax-rule (query-set field-name P expr)
|
2016-07-13 01:17:07 +00:00
|
|
|
(let ()
|
|
|
|
(field [field-name (set)])
|
2016-07-13 20:35:55 +00:00
|
|
|
(on (asserted P) #:priority *query-priority* (field-name (set-add (field-name) expr)))
|
|
|
|
(on (retracted P) #:priority *query-priority* (field-name (set-remove (field-name) expr)))
|
2016-07-13 01:17:07 +00:00
|
|
|
field-name))
|
|
|
|
|
2016-07-13 20:35:55 +00:00
|
|
|
(define-syntax-rule (query-hash field-name P key-expr value-expr)
|
2016-07-13 01:17:07 +00:00
|
|
|
(let ()
|
|
|
|
(field [field-name (hash)])
|
|
|
|
(on (asserted P)
|
|
|
|
(let ((key key-expr))
|
|
|
|
(when (hash-has-key? (field-name) key)
|
2016-07-13 20:35:55 +00:00
|
|
|
(log-warning "query-hash: ~a: overwriting existing entry ~v"
|
2016-07-13 01:17:07 +00:00
|
|
|
'field-name
|
|
|
|
key))
|
|
|
|
(field-name (hash-set (field-name) key value-expr))))
|
|
|
|
(on (retracted P) (field-name (hash-remove (field-name) key-expr)))
|
|
|
|
field-name))
|
|
|
|
|
2016-07-13 20:35:55 +00:00
|
|
|
(define-syntax-rule (query-hash-set field-name P key-expr value-expr)
|
2016-07-13 01:17:07 +00:00
|
|
|
(let ()
|
|
|
|
(field [field-name (hash)])
|
|
|
|
(on (asserted P)
|
|
|
|
(let ((key key-expr))
|
|
|
|
(field-name (hash-set (field-name)
|
|
|
|
key
|
|
|
|
(set-add (hash-ref (field-name) key set)
|
|
|
|
value-expr)))))
|
|
|
|
(on (retracted P)
|
|
|
|
(let ((key key-expr))
|
|
|
|
(let ((new-entries (set-remove (hash-ref (field-name) key set)
|
|
|
|
value-expr)))
|
|
|
|
(field-name (if (set-empty? new-entries)
|
|
|
|
(hash-remove (field-name) key)
|
|
|
|
(hash-set (field-name) key new-entries))))))
|
|
|
|
field-name))
|
|
|
|
|
2016-07-13 20:35:55 +00:00
|
|
|
(actor #:name 'queryer
|
2016-07-13 01:17:07 +00:00
|
|
|
(forever
|
2016-07-13 20:35:55 +00:00
|
|
|
(define as-set (query-set as-set `(item ,$a ,$b) (list a b)))
|
|
|
|
(define as-hash (query-hash as-hash `(item ,$a ,$b) a b))
|
|
|
|
(define as-hash-set (query-hash-set as-hash-set `(item ,$a ,$b) a b))
|
2016-07-13 01:17:07 +00:00
|
|
|
|
|
|
|
(on (message 'dump)
|
|
|
|
(printf "----------------------------------------\n")
|
2016-07-13 20:35:55 +00:00
|
|
|
(printf "Queried as-set:\n")
|
2016-07-13 01:17:07 +00:00
|
|
|
(for [(item (as-set))]
|
|
|
|
(match-define (list a b) item)
|
|
|
|
(printf " ~v -> ~v\n" a b))
|
|
|
|
(newline)
|
2016-07-13 20:35:55 +00:00
|
|
|
(printf "Queried as-hash:\n")
|
2016-07-13 01:17:07 +00:00
|
|
|
(for [((k v) (in-hash (as-hash)))]
|
|
|
|
(printf " ~v -> ~v\n" k v))
|
|
|
|
(newline)
|
2016-07-13 20:35:55 +00:00
|
|
|
(printf "Queried as-hash-set:\n")
|
2016-07-13 01:17:07 +00:00
|
|
|
(for [((k vs) (in-hash (as-hash-set)))]
|
|
|
|
(printf " ~v -> ~v\n" k vs))
|
|
|
|
(printf "----------------------------------------\n")
|
|
|
|
(flush-output))))
|
|
|
|
|
|
|
|
(actor #:name 'mutator
|
|
|
|
(assert! `(item a 1))
|
|
|
|
(assert! `(item b 2))
|
|
|
|
(assert! `(item b 3))
|
|
|
|
(send! 'dump)
|
|
|
|
(retract! `(item b ,?))
|
|
|
|
(send! 'dump)
|
|
|
|
(assert! `(item c 1))
|
|
|
|
(assert! `(item c 4))
|
|
|
|
(send! 'dump)
|
|
|
|
(forever))
|