#lang racket/base (require racket/match) (require "main.rkt") (require "dataspace.rkt") (require "schemas/gen/box-protocol.rkt") (require (only-in "pattern.rkt" :pattern)) (define box (action (ds LIMIT REPORT_EVERY) (spawn (define root-facet this-facet) (define-field value 0) (define start-time (current-inexact-milliseconds)) (define prev-value 0) (at ds (assert (BoxState (value))) (when (message (SetBox $new-value)) (when (zero? (remainder new-value REPORT_EVERY)) (define end-time (current-inexact-milliseconds)) (define delta (/ (- end-time start-time) 1000.0)) (define count (- new-value prev-value)) (set! prev-value new-value) (set! start-time end-time) (log-info "Box got ~a (~a Hz)" new-value (/ count delta))) (when (= new-value LIMIT) (stop-facet root-facet)) (value new-value)))))) (define client (action (ds) (spawn (define root-facet this-facet) (define count 0) (at ds (when (asserted (BoxState $value)) (send! ds (SetBox->preserves (SetBox (+ value 1))))) ;; (during (BoxState _) ;; (on-start (set! count (+ count 1))) ;; (on-stop (set! count (- count 1)) ;; (when (zero? count) ;; (log-info "Client detected box termination") ;; (stop-facet root-facet)))) (assert (Observe (:pattern (BoxState _)) (ref (entity #:assert (action (_v _h) (set! count (+ count 1))) #:retract (action (_h) (set! count (- count 1)) (when (zero? count) (log-info "Client detected box termination") (stop-facet root-facet))))))) ;; (during (BoxState _) ;; (on-stop (log-info "Client detected box termination") ;; (stop-facet root-facet))) )))) (module+ main (time (actor-system (define disarm (facet-prevent-inert-check! this-facet)) (define ds (ref (dataspace))) (box this-turn ds 500000 100000) (client this-turn ds))))