2021-06-02 13:00:25 +00:00
|
|
|
#lang racket/base
|
2021-06-04 14:20:14 +00:00
|
|
|
;;; SPDX-License-Identifier: LGPL-3.0-or-later
|
|
|
|
;;; SPDX-FileCopyrightText: Copyright © 2021 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
|
2021-06-02 13:00:25 +00:00
|
|
|
|
|
|
|
(provide (all-from-out "schemas/gen/dataspace.rkt")
|
|
|
|
(all-from-out "schemas/gen/dataspace-patterns.rkt")
|
|
|
|
(all-from-out "schemas/gen/dataspace-patterns.meta.rkt")
|
|
|
|
|
2021-06-03 20:40:51 +00:00
|
|
|
dataspace
|
|
|
|
actor-system/dataspace)
|
2021-06-02 13:00:25 +00:00
|
|
|
|
|
|
|
(require racket/match)
|
|
|
|
|
|
|
|
(require preserves)
|
|
|
|
|
|
|
|
(require "bag.rkt")
|
|
|
|
(require "main.rkt")
|
2021-06-03 13:59:17 +00:00
|
|
|
(require "skeleton.rkt")
|
2021-06-02 13:00:25 +00:00
|
|
|
|
|
|
|
(require "schemas/gen/dataspace.rkt")
|
|
|
|
(require "schemas/gen/dataspace-patterns.rkt")
|
|
|
|
(require "schemas/gen/dataspace-patterns.meta.rkt")
|
|
|
|
|
2021-06-03 13:59:17 +00:00
|
|
|
(define-logger syndicate/dataspace)
|
|
|
|
|
2021-06-03 20:38:11 +00:00
|
|
|
(define (dataspace #:name [name (gensym 'dataspace)])
|
2021-06-02 13:00:25 +00:00
|
|
|
(define handles (make-hash))
|
|
|
|
(define assertions (make-bag))
|
2021-06-03 13:59:17 +00:00
|
|
|
(define skeleton (make-empty-skeleton))
|
|
|
|
(define ds-e
|
2021-06-03 20:38:11 +00:00
|
|
|
(entity #:name name
|
2021-06-10 09:42:07 +00:00
|
|
|
#:assert (lambda (value handle)
|
2021-06-03 13:59:17 +00:00
|
|
|
(log-syndicate/dataspace-debug "~v + ~v ~v" ds-e handle value)
|
|
|
|
(define maybe-observe (parse-Observe value))
|
|
|
|
(hash-set! handles handle (cons value maybe-observe))
|
|
|
|
(when (eq? (bag-change! assertions value +1) 'absent->present)
|
|
|
|
(match maybe-observe
|
2021-06-02 13:00:25 +00:00
|
|
|
[(? eof-object?) (void)]
|
2021-06-03 13:59:17 +00:00
|
|
|
[(Observe pat ref) (add-interest! this-turn skeleton pat ref)])
|
|
|
|
(add-assertion! this-turn skeleton value)))
|
2021-06-10 09:42:07 +00:00
|
|
|
#:retract (lambda (upstream-handle)
|
2021-06-03 13:59:17 +00:00
|
|
|
(match (hash-ref handles upstream-handle #f)
|
|
|
|
[#f (error 'dataspace "Peer retracted unknown handle ~v" upstream-handle)]
|
|
|
|
[(cons value maybe-observe)
|
|
|
|
(log-syndicate/dataspace-debug "~v - ~v ~v" ds-e upstream-handle value)
|
|
|
|
(hash-remove! handles upstream-handle)
|
|
|
|
(when (eq? (bag-change! assertions value -1) 'present->absent)
|
|
|
|
(remove-assertion! this-turn skeleton value)
|
|
|
|
(match maybe-observe
|
|
|
|
[(? eof-object?) (void)]
|
|
|
|
[(Observe pat ref) (remove-interest! this-turn skeleton pat ref)]))]))
|
2021-06-10 09:42:07 +00:00
|
|
|
#:message (lambda (message)
|
2021-06-03 13:59:17 +00:00
|
|
|
(log-syndicate/dataspace-debug "~v ! ~v" ds-e message)
|
|
|
|
(send-assertion! this-turn skeleton message))))
|
2021-06-13 05:55:50 +00:00
|
|
|
(ref ds-e))
|
2021-06-03 20:40:51 +00:00
|
|
|
|
|
|
|
(define-syntax actor-system/dataspace
|
|
|
|
(syntax-rules ()
|
|
|
|
[(_ (ds) expr ...)
|
|
|
|
(actor-system
|
|
|
|
#:name 'dataspace
|
|
|
|
(facet-prevent-inert-check! this-facet)
|
2021-06-13 05:55:50 +00:00
|
|
|
(define ds (dataspace))
|
2021-06-03 20:40:51 +00:00
|
|
|
expr ...)]))
|