feat: add batch()

This commit is contained in:
Richard 2024-04-19 01:01:57 -07:00
parent 8a0d0977ca
commit f0a7938703
13 changed files with 112 additions and 52 deletions

View file

@ -1,35 +1,33 @@
local store = require(script.Parent.store)
local types = require(script.Parent.types)
local unwrap = require(script.Parent.unwrap)
type Atom<T> = types.Atom<T>
type AtomOptions<T> = types.AtomOptions<T>
local unwrap = require(script.Parent.unwrap)
local function atom<T>(state: T, options: AtomOptions<T>?): Atom<T>
local equals = options and options.equals
local function atom(...)
if select("#", ...) == 0 then
if store.shouldCapture() then
if store.isCapturing() then
store.captured[atom] = true
end
return state
end
local nextState = ...
if type(nextState) == "function" then
-- Atoms called in a function should not be included as dependencies
nextState = unwrap(function()
return nextState(state)
end)
end
-- Atoms called in a function should not be a part of the dependency tree
local nextState = unwrap(..., state)
if state ~= nextState and not (equals and equals(state, nextState)) then
state = nextState
for listener in pairs(table.clone(store.listeners[atom])) do
listener()
if store.isBatching() then
store.batched[atom] = true
else
for listener in pairs(table.clone(store.listeners[atom])) do
listener()
end
end
end