feat: allow conditional dependencies (#4)

* feat: allow conditional dependencies

* docs: remove conditional deps warnings

* fix: allow nested captures

* docs: add dev flag

* fix: `try()` uses pcall if passed `finally()`

* docs: interval is optional

* docs: update readme

* docs: add client/server tags
This commit is contained in:
richard 2024-06-11 17:13:43 -07:00 • committed by GitHub
parent fbc86d22c6
commit a90d131fed
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 290 additions and 98 deletions

View file

@ -6,31 +6,24 @@ type Cleanup = () -> ()
Runs the given callback immediately and whenever any atom it depends on
changes. Returns a cleanup function that unsubscribes the callback.
Note that dependencies are only evaluated once when the effect is created,
and conditional dependencies may not work as expected.
@param callback The function to run.
@return A function that unsubscribes the callback.
]=]
local function effect(callback: () -> any): () -> ()
local captured, cleanup = store.capture(callback)
local dependencies, cleanup = store.capture(callback)
local function listener()
if cleanup then
cleanup()
end
cleanup = callback()
dependencies, cleanup = store.reconnect(callback, dependencies, listener)
end
for atom in captured do
store.listeners[atom][listener] = true
end
store.connect(dependencies, listener)
return function()
for atom in captured do
store.listeners[atom][listener] = nil
end
store.disconnect(dependencies, listener)
if cleanup then
cleanup()