Add :effects annotations to boundary.sx IO and signal primitives

All 11 define-io-primitive entries now declare :effects [io].
Signal primitives annotated: signal/deref/computed = [] (pure),
reset!/swap!/effect/batch = [mutation].

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-11 23:02:22 +00:00
parent a69604acaf
commit 0f9b449315

View File

@@ -12,6 +12,7 @@
;; (define-io-primitive "name" ;; (define-io-primitive "name"
;; :params (param1 param2 &key ...) ;; :params (param1 param2 &key ...)
;; :returns "type" ;; :returns "type"
;; :effects [io]
;; :async true ;; :async true
;; :doc "description" ;; :doc "description"
;; :context :request) ;; :context :request)
@@ -38,6 +39,7 @@
(define-io-primitive "current-user" (define-io-primitive "current-user"
:params () :params ()
:returns "dict?" :returns "dict?"
:effects [io]
:async true :async true
:doc "Current authenticated user dict, or nil." :doc "Current authenticated user dict, or nil."
:context :request) :context :request)
@@ -45,6 +47,7 @@
(define-io-primitive "request-arg" (define-io-primitive "request-arg"
:params (name &rest default) :params (name &rest default)
:returns "any" :returns "any"
:effects [io]
:async true :async true
:doc "Read a query string argument from the current request." :doc "Read a query string argument from the current request."
:context :request) :context :request)
@@ -52,6 +55,7 @@
(define-io-primitive "request-path" (define-io-primitive "request-path"
:params () :params ()
:returns "string" :returns "string"
:effects [io]
:async true :async true
:doc "Current request path." :doc "Current request path."
:context :request) :context :request)
@@ -59,6 +63,7 @@
(define-io-primitive "request-view-args" (define-io-primitive "request-view-args"
:params (key) :params (key)
:returns "any" :returns "any"
:effects [io]
:async true :async true
:doc "Read a URL view argument from the current request." :doc "Read a URL view argument from the current request."
:context :request) :context :request)
@@ -66,6 +71,7 @@
(define-io-primitive "csrf-token" (define-io-primitive "csrf-token"
:params () :params ()
:returns "string" :returns "string"
:effects [io]
:async true :async true
:doc "Current CSRF token string." :doc "Current CSRF token string."
:context :request) :context :request)
@@ -73,6 +79,7 @@
(define-io-primitive "abort" (define-io-primitive "abort"
:params (status &rest message) :params (status &rest message)
:returns "nil" :returns "nil"
:effects [io]
:async true :async true
:doc "Raise HTTP error from SX." :doc "Raise HTTP error from SX."
:context :request) :context :request)
@@ -82,6 +89,7 @@
(define-io-primitive "url-for" (define-io-primitive "url-for"
:params (endpoint &key) :params (endpoint &key)
:returns "string" :returns "string"
:effects [io]
:async true :async true
:doc "Generate URL for a named endpoint." :doc "Generate URL for a named endpoint."
:context :request) :context :request)
@@ -89,6 +97,7 @@
(define-io-primitive "route-prefix" (define-io-primitive "route-prefix"
:params () :params ()
:returns "string" :returns "string"
:effects [io]
:async true :async true
:doc "Service URL prefix for dev/prod routing." :doc "Service URL prefix for dev/prod routing."
:context :request) :context :request)
@@ -98,6 +107,7 @@
(define-io-primitive "app-url" (define-io-primitive "app-url"
:params (service &rest path) :params (service &rest path)
:returns "string" :returns "string"
:effects [io]
:async false :async false
:doc "Full URL for a service: (app-url \"blog\" \"/my-post/\")." :doc "Full URL for a service: (app-url \"blog\" \"/my-post/\")."
:context :config) :context :config)
@@ -105,6 +115,7 @@
(define-io-primitive "asset-url" (define-io-primitive "asset-url"
:params (&rest path) :params (&rest path)
:returns "string" :returns "string"
:effects [io]
:async false :async false
:doc "Versioned static asset URL." :doc "Versioned static asset URL."
:context :config) :context :config)
@@ -112,6 +123,7 @@
(define-io-primitive "config" (define-io-primitive "config"
:params (key) :params (key)
:returns "any" :returns "any"
:effects [io]
:async false :async false
:doc "Read a value from host configuration." :doc "Read a value from host configuration."
:context :config) :context :config)
@@ -138,11 +150,13 @@
(declare-signal-primitive "signal" (declare-signal-primitive "signal"
:params (initial-value) :params (initial-value)
:returns "signal" :returns "signal"
:effects []
:doc "Create a reactive signal container with an initial value.") :doc "Create a reactive signal container with an initial value.")
(declare-signal-primitive "deref" (declare-signal-primitive "deref"
:params (signal) :params (signal)
:returns "any" :returns "any"
:effects []
:doc "Read a signal's current value. In a reactive context (inside an island), :doc "Read a signal's current value. In a reactive context (inside an island),
subscribes the current DOM binding to the signal. Outside reactive subscribes the current DOM binding to the signal. Outside reactive
context, just returns the value.") context, just returns the value.")
@@ -150,23 +164,27 @@
(declare-signal-primitive "reset!" (declare-signal-primitive "reset!"
:params (signal value) :params (signal value)
:returns "nil" :returns "nil"
:effects [mutation]
:doc "Set a signal to a new value. Notifies all subscribers.") :doc "Set a signal to a new value. Notifies all subscribers.")
(declare-signal-primitive "swap!" (declare-signal-primitive "swap!"
:params (signal f &rest args) :params (signal f &rest args)
:returns "nil" :returns "nil"
:effects [mutation]
:doc "Update a signal by applying f to its current value. (swap! s inc) :doc "Update a signal by applying f to its current value. (swap! s inc)
is equivalent to (reset! s (inc (deref s))) but atomic.") is equivalent to (reset! s (inc (deref s))) but atomic.")
(declare-signal-primitive "computed" (declare-signal-primitive "computed"
:params (compute-fn) :params (compute-fn)
:returns "signal" :returns "signal"
:effects []
:doc "Create a derived signal that recomputes when its dependencies change. :doc "Create a derived signal that recomputes when its dependencies change.
Dependencies are discovered automatically by tracking deref calls.") Dependencies are discovered automatically by tracking deref calls.")
(declare-signal-primitive "effect" (declare-signal-primitive "effect"
:params (effect-fn) :params (effect-fn)
:returns "lambda" :returns "lambda"
:effects [mutation]
:doc "Run a side effect that re-runs when its signal dependencies change. :doc "Run a side effect that re-runs when its signal dependencies change.
Returns a dispose function. If the effect function returns a function, Returns a dispose function. If the effect function returns a function,
it is called as cleanup before the next run.") it is called as cleanup before the next run.")
@@ -174,5 +192,6 @@
(declare-signal-primitive "batch" (declare-signal-primitive "batch"
:params (thunk) :params (thunk)
:returns "any" :returns "any"
:effects [mutation]
:doc "Group multiple signal writes. Subscribers are notified once at the end, :doc "Group multiple signal writes. Subscribers are notified once at the end,
after all values have been updated.") after all values have been updated.")