function ObservableSubscriptionTable.Fire(E,c,...)assert(c~=nil,"\066\097\100 \107\101\121")local w=E._subMap[c]if not w then return end for c,E in pairs(table.clone(w))do task.spawn(E.Fire,E,...)end end function ObservableSubscriptionTable.Complete(E,c,...)local w=E._subMap[c]if not w then return end local Q=table.clone(w)E._subMap[c]=nil for c,E in pairs(Q)do task.spawn(E.Complete,E,...)end end

function ObservableSubscriptionTable:Fire(key, ...)
	assert(key ~= nil, "Bad key")

	local subs = self._subMap[key]
	if not subs then
		return
	end

	-- Make a copy so we don't have to worry about our last changing
	for _, sub in pairs(table.clone(subs)) do
		task.spawn(sub.Fire, sub, ...)
	end
end

function ObservableSubscriptionTable:Complete(key, ...)
	local subs = self._subMap[key]
	if not subs then
		return
	end

	local subsToComplete = table.clone(subs)
	self._subMap[key] = nil

	for _, sub in pairs(subsToComplete) do
		task.spawn(sub.Complete, sub, ...)
	end
end
