function Blend.ComputedPairs(c,g)local Z=Blend.toPropertyObservable(c)or Rx.of(c)return Observable.new(function(c)local e={}local E=Maid.new()local R=Maid.new()E:GiveTask(R)E:GiveTask(Z:Subscribe(function(Z)assert(type(Z)=="\116\097\098\108\101","\066\097\100 \118\097\108\117\101 \101\109\105\116\116\101\100 \102\114\111\109 \115\111\117\114\099\101")local E={}for c,g in pairs(e)do E[c]=true end for Z,V in pairs(Z)do E[Z]=nil if e[Z]~=V then local E=Maid.new()local J=g(Z,V,E)local l=Brio.new(J)E:GiveTask(l)c:Fire(l)R[Z]=E e[Z]=V end end for c,g in pairs(E)do R[c]=nil e[c]=nil end end),c:GetFailComplete())return E end)end

function Blend.ComputedPairs(source, compute)
	local sourceObservable = Blend.toPropertyObservable(source) or Rx.of(source)

	return Observable.new(function(sub)
		local cache = {}
		local topMaid = Maid.new()

		local maidForKeys = Maid.new()
		topMaid:GiveTask(maidForKeys)

		topMaid:GiveTask(sourceObservable:Subscribe(function(newValue)
			-- It's gotta be a table
			assert(type(newValue) == "table", "Bad value emitted from source")

			local excluded = {}
			for key, _ in pairs(cache) do
				excluded[key] = true
			end

			for key, value in pairs(newValue) do
				excluded[key] = nil

				if cache[key] ~= value then
					local innerMaid = Maid.new()
					local result = compute(key, value, innerMaid)

					local brio = Brio.new(result)
					innerMaid:GiveTask(brio)

					sub:Fire(brio)

					maidForKeys[key] = innerMaid
					cache[key] = value
				end
			end

			for key, _ in pairs(excluded) do
				maidForKeys[key] = nil
				cache[key] = nil
			end
		end), sub:GetFailComplete())

		return topMaid
	end)
end
