#lang syndicate
;;; SPDX-License-Identifier: LGPL-3.0-or-later
;;; SPDX-FileCopyrightText: Copyright © 2021 Tony Garnock-Jones <tonyg@leastfixedpoint.com>

(require "protocol.rkt")
(require "stats.rkt")

(define (box ds LIMIT REPORT_EVERY)
  (spawn #:name 'box
         (define-field value 0)
         (define reporter (report-stats REPORT_EVERY))
         (at ds
           (assert (BoxState (value)))
           (when (message (SetBox $new-value))
             (reporter new-value)
             (when (= new-value LIMIT) (stop-current-facet))
             (value new-value)))))

(define (client ds)
  (spawn #:name 'client
         (define root-facet this-facet)
         (at ds
           (when (asserted (BoxState $value)) (send! ds (SetBox (+ value 1))))
           (during (BoxState _)
             (on-stop (log-info "Client detected box termination")
                      (stop-facet root-facet))))))

(module+ main
  (time
   (actor-system/dataspace (ds)
     (box ds 500000 100000)
     (client ds))))
