2021-06-09 13:06:58 +00:00
|
|
|
#lang racket/base
|
|
|
|
;;; SPDX-License-Identifier: LGPL-3.0-or-later
|
2023-01-16 14:57:29 +00:00
|
|
|
;;; SPDX-FileCopyrightText: Copyright © 2021-2023 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
|
2021-06-09 13:06:58 +00:00
|
|
|
|
2021-06-16 19:41:53 +00:00
|
|
|
(provide (except-out (struct-out entity) entity)
|
|
|
|
(rename-out [make-entity entity] [entity <entity>])
|
|
|
|
|
|
|
|
(struct-out actor)
|
|
|
|
(struct-out facet)
|
|
|
|
(struct-out entity-ref)
|
|
|
|
|
2021-07-27 14:01:12 +00:00
|
|
|
parse-Cap!)
|
2021-06-09 13:06:58 +00:00
|
|
|
|
2021-06-16 19:41:53 +00:00
|
|
|
(require racket/match)
|
|
|
|
(require (only-in racket/string string-join))
|
|
|
|
|
|
|
|
(require struct-defaults)
|
|
|
|
(require "support/counter.rkt")
|
|
|
|
(require "engine.rkt")
|
|
|
|
|
|
|
|
(struct entity (id name assert retract message sync data)
|
2021-06-17 11:38:30 +00:00
|
|
|
#:transparent
|
2021-06-16 19:41:53 +00:00
|
|
|
#:methods gen:custom-write
|
|
|
|
[(define (write-proc e port mode)
|
|
|
|
(fprintf port "#<entity:~a:~a>" (entity-id e) (entity-name e)))])
|
|
|
|
|
|
|
|
(define generate-entity-id (make-counter))
|
|
|
|
|
|
|
|
(define-struct-defaults make-entity entity
|
|
|
|
(#:_id [entity-id (generate-entity-id)]
|
|
|
|
#:name [entity-name '?]
|
|
|
|
#:assert [entity-assert #f]
|
|
|
|
#:retract [entity-retract #f]
|
|
|
|
#:message [entity-message #f]
|
|
|
|
#:sync [entity-sync #f]
|
|
|
|
#:data [entity-data (void)]))
|
|
|
|
|
|
|
|
(struct actor (id
|
|
|
|
name
|
|
|
|
engine
|
|
|
|
[daemon? #:mutable]
|
|
|
|
dataflow
|
|
|
|
[root #:mutable]
|
|
|
|
[exit-reason #:mutable] ;; #f -> running, #t -> terminated OK, exn -> error
|
|
|
|
[exit-hooks #:mutable])
|
|
|
|
#:methods gen:custom-write
|
|
|
|
[(define (write-proc a port mode)
|
|
|
|
(fprintf port "#<actor:~a/~a:~a>" (engine-id (actor-engine a)) (actor-id a) (actor-name a)))])
|
|
|
|
|
|
|
|
(define (facet-path-to-root f)
|
|
|
|
(string-join (reverse (let loop ((f f))
|
|
|
|
(if (facet-parent f)
|
|
|
|
(cons (number->string (facet-id f)) (loop (facet-parent f)))
|
|
|
|
'())))
|
|
|
|
"/"))
|
|
|
|
|
|
|
|
(define (facet-liveness f)
|
|
|
|
(if (facet-live? f)
|
|
|
|
""
|
|
|
|
":(DEAD)"))
|
|
|
|
|
|
|
|
(struct facet (id
|
|
|
|
actor
|
|
|
|
parent
|
|
|
|
children
|
|
|
|
outbound
|
|
|
|
[end-of-turn-actions #:mutable]
|
|
|
|
[shutdown-actions #:mutable]
|
|
|
|
[live? #:mutable]
|
|
|
|
[inert-check-preventers #:mutable])
|
|
|
|
#:methods gen:custom-write
|
|
|
|
[(define (write-proc f port mode)
|
|
|
|
(local-require (only-in racket/string string-join))
|
|
|
|
(fprintf port "#<facet:~a/~a:~a:~a~a>"
|
|
|
|
(engine-id (actor-engine (facet-actor f)))
|
|
|
|
(actor-id (facet-actor f))
|
|
|
|
(actor-name (facet-actor f))
|
|
|
|
(facet-path-to-root f)
|
|
|
|
(facet-liveness f)))])
|
|
|
|
|
|
|
|
(struct entity-ref (relay target attenuation)
|
|
|
|
#:transparent
|
|
|
|
#:methods gen:custom-write
|
|
|
|
[(define (write-proc r port mode)
|
|
|
|
(match-define (entity-ref f e a) r)
|
|
|
|
(fprintf port "#<ref:~a:~a:~a/~a:~a:~a~a~a>"
|
|
|
|
(entity-id e)
|
|
|
|
(entity-name e)
|
|
|
|
(engine-id (actor-engine (facet-actor f)))
|
|
|
|
(actor-id (facet-actor f))
|
|
|
|
(actor-name (facet-actor f))
|
|
|
|
(facet-path-to-root f)
|
|
|
|
(facet-liveness f)
|
|
|
|
(if (null? a)
|
|
|
|
""
|
|
|
|
(format " ~s" a))))])
|
2021-06-09 13:06:58 +00:00
|
|
|
|
2021-07-27 14:01:12 +00:00
|
|
|
(define (parse-Cap! r)
|
2021-06-09 13:06:58 +00:00
|
|
|
(if (entity-ref? r)
|
|
|
|
r
|
|
|
|
(error 'parse-Ref! "Expected entity-ref; got ~v" r)))
|