-- Compiled with roblox-ts v2.0.2 local function combineState(silos) local state = {} -- eslint-disable-next-line roblox-ts/no-array-pairs for name, silo in pairs(silos) do state[name] = silo.getState() end return state end --[[ * * Combine silos. * @param silos Silos to combine * @returns Combined silos ]] local function combineSilos(silos) local state = combineState(silos) local subscribers = {} local getState = function() return state end local subscribe = function(subscriber) local subscribed = true local _subscriber = subscriber table.insert(subscribers, _subscriber) return function() if not subscribed then return nil end subscribed = false local _subscriber_1 = subscriber local index = (table.find(subscribers, _subscriber_1) or 0) - 1 if index == -1 then return nil end -- ▼ Array.unorderedRemove ▼ local _index = index + 1 local _length = #subscribers local _value = subscribers[_index] if _value ~= nil then subscribers[_index] = subscribers[_length] subscribers[_length] = nil end -- ▲ Array.unorderedRemove ▲ end end local notifySubscribers = function(newState, oldState) for _, subscriber in subscribers do subscriber(newState, oldState) end end local observe = function(selector, observer, changed) local value = selector(getState()) observer(value) local didChange = changed or (function(newValue, oldValue) return newValue ~= oldValue end) return subscribe(function(newState) local newValue = selector(newState) if not didChange(newValue, value) then return nil end value = newValue observer(value) end) end local destroy = function() table.clear(subscribers) end -- eslint-disable-next-line roblox-ts/no-array-pairs for name, silo in pairs(silos) do silo.subscribe(function() local oldState = state local newState = combineState(silos) state = newState notifySubscribers(state, oldState) end) end return { initialState = table.freeze(table.clone(state)), actions = {}, getState = getState, subscribe = subscribe, observe = observe, destroy = destroy, all = silos, } end return { combineSilos = combineSilos, }