actors: Export simple-dispatcher.
[8sync.git] / 8sync / systems / actors.scm
index a5033135653422a8c8feb7db452a766fe9288d4c..e2fd27eac767c1464d38e0fb31d8cd00659052e1 100644 (file)
@@ -48,7 +48,7 @@
             actor-id-string
 
             mlambda define-mhandler
-            make-action-dispatch
+            simple-dispatcher build-actions make-action-dispatch
             define-simple-actor
 
             <hive>
@@ -316,6 +316,12 @@ If key not found and DFLT not provided, throw an error."
 ;;; Actor utilities
 ;;; ===============
 
+
+(define-syntax-rule (with-message-args (message message-arg ...)
+                                       body body* ...)
+  (let ((message-arg (message-ref message (quote message-arg))) ...)
+    body body* ...))
+
 (define-syntax mlambda
   (syntax-rules ()
     "A lambda for building message handlers.
@@ -331,8 +337,7 @@ Which is like doing manually:
     ((_ (actor message message-arg ...)
         body body* ...)
      (lambda (actor message)
-       (let ((message-arg (message-ref message (quote message-arg))) ...)
-         body body* ...)))))
+       (with-message-args (message message-arg ...) body body* ...)))))
 
 ;; @@: Sadly, docstrings won't work with this...
 ;;   I think we need to bust out syntax-case to make that happen...
@@ -347,6 +352,8 @@ Which is like doing manually:
     (let* ((action (message-action message))
            (method (assoc-ref action-map action)))
       (if (not method)
+          ;; @@: There's every possibility this should be handled in
+          ;;  hive-process-message instead.
           (throw 'action-not-found
                  "No appropriate action handler found for actor"
                  #:action action
@@ -364,6 +371,15 @@ Which is like doing manually:
     ((_ (action-name handler))
      (cons (quote action-name) handler))))
 
+(define-syntax-rule (build-actions action-item ...)
+  "Build a mapping of actions.  Same syntax as make-action-dispatch
+but this doesn't build the dispatcher for you (you probably want to
+pass it to simple-dispatcher).
+
+The advantage here is that since this simply builds an alist, you can
+compose it with other action maps."
+  (list (%expand-action-item action-item) ...))
+
 (define-syntax make-action-dispatch
   (syntax-rules ()
     "Expand a list of action names and actions into an alist
@@ -385,8 +401,7 @@ more compact following syntax:
    ((party actor message)
      (display \"Life of the party!\")))"
     ((make-action-dispatch action-item ...)
-     (simple-dispatcher
-      (list (%expand-action-item action-item) ...)))))
+     (simple-dispatcher (build-actions action-item ...)))))
 
 (define-syntax-rule (define-simple-actor class actions ...)
   (define-class class (<actor>)