Toy file server example

This commit is contained in:
Tony Garnock-Jones 2015-10-09 18:45:23 -04:00
parent 457d53fc54
commit 5280f1eb5c
2 changed files with 36 additions and 1 deletions

View File

@ -436,7 +436,7 @@
#`(#:when #,condition)
#'())
(#,(if pub? #'pub #'sub) #,gestalt-stx
#:meta-level #,meta-level)))))
#:meta-level #,(or meta-level 0))))))
(define (push-action! action-stx)
(define-temporaries [temp action-stx])

View File

@ -0,0 +1,35 @@
#lang minimart
(struct save (filename body) #:prefab)
(struct contents (filename body) #:prefab)
(actor #:name file-server
#:state [files (hash)]
(subscribe (save ($ filename) ($ body))
#:update [files (hash-set files filename body)]
#:update-routes)
(observe-subscribers (contents ($ filename) ?)
#:level 1
#:name observed-filenames
#:set filename)
(for/advertise [(filename observed-filenames)
#:when (hash-has-key? files filename)]
(contents filename (hash-ref files filename))))
(define (spawn-file-watcher filename)
(actor #:name observer-of-files
(observe-advertisers (contents filename ($ file-contents))
#:name file-contents
#:set file-contents
(printf "Contents of ~a: ~v\n" filename file-contents))))
(spawn-file-watcher 'a)
(spawn-file-watcher 'b)
(spawn-file-watcher 'c)
(send (save 'a "first file"))
(send (save 'b "second file"))
(send (save 'c "third file"))
(send (save 'b "second file, second version"))