forked from rojo-rbx/rojo
53 lines
1.2 KiB
Lua
53 lines
1.2 KiB
Lua
--[[
|
|
This module defines the meat of the Rojo plugin and how it manages tracking
|
|
and mutating the Roblox DOM.
|
|
]]
|
|
|
|
local Rojo = script:FindFirstAncestor("Rojo")
|
|
local Plugin = Rojo.Plugin
|
|
|
|
local Timer = require(Plugin.Timer)
|
|
|
|
local applyPatch = require(script.applyPatch)
|
|
local hydrate = require(script.hydrate)
|
|
local diff = require(script.diff)
|
|
|
|
local Reconciler = {}
|
|
Reconciler.__index = Reconciler
|
|
|
|
function Reconciler.new(instanceMap)
|
|
local self = {
|
|
-- Tracks all of the instances known by the reconciler by ID.
|
|
__instanceMap = instanceMap,
|
|
}
|
|
|
|
return setmetatable(self, Reconciler)
|
|
end
|
|
|
|
function Reconciler:applyPatch(patch)
|
|
Timer.start("Reconciler:applyPatch")
|
|
|
|
local unappliedPatch = applyPatch(self.__instanceMap, patch)
|
|
|
|
Timer.stop()
|
|
return unappliedPatch
|
|
end
|
|
|
|
function Reconciler:hydrate(virtualInstances, rootId, rootInstance)
|
|
Timer.start("Reconciler:hydrate")
|
|
local result = hydrate(self.__instanceMap, virtualInstances, rootId, rootInstance)
|
|
Timer.stop()
|
|
|
|
return result
|
|
end
|
|
|
|
function Reconciler:diff(virtualInstances, rootId)
|
|
Timer.start("Reconciler:diff")
|
|
local success, result = diff(self.__instanceMap, virtualInstances, rootId)
|
|
Timer.stop()
|
|
|
|
return success, result
|
|
end
|
|
|
|
return Reconciler
|