mirror of
https://github.com/littensy/charm.git
synced 2026-10-22 12:41:37 +00:00
fix: handle sparse array patches (#10)
This commit is contained in:
parent
9f28457452
commit
a5a183c3a6
2 changed files with 24 additions and 0 deletions
|
|
@ -28,4 +28,20 @@ return function()
|
||||||
expect(a().b).to.equal(3)
|
expect(a().b).to.equal(3)
|
||||||
expect(a().c).to.equal(2)
|
expect(a().c).to.equal(2)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it("fixes sparse array patches", function()
|
||||||
|
local a = atom({ 1 })
|
||||||
|
local client = sync.client({ atoms = { a = a } })
|
||||||
|
|
||||||
|
-- This patch would be the result of a diff between { 1 } and { 1, 2 } that
|
||||||
|
-- was JSON-serialized and deserialized. The client should be able to catch
|
||||||
|
-- this and convert the string key back to a number.
|
||||||
|
client:sync({
|
||||||
|
type = "patch",
|
||||||
|
data = { a = { ["2"] = 2 } },
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(a()["2" :: any]).to.never.be.ok()
|
||||||
|
expect(a()[2]).to.equal(2)
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -44,8 +44,16 @@ local function apply(state: any, patches: any): any
|
||||||
end
|
end
|
||||||
|
|
||||||
local nextState = table.clone(state)
|
local nextState = table.clone(state)
|
||||||
|
local stateIsArray = state[1] ~= nil
|
||||||
|
|
||||||
for key, patch in patches do
|
for key, patch in patches do
|
||||||
|
-- Diff-checking an array produces a sparse array, which will not be
|
||||||
|
-- preserved when converted to JSON. To prevent this, we turn string
|
||||||
|
-- keys back into numeric keys.
|
||||||
|
if stateIsArray and type(key) == "string" then
|
||||||
|
key = tonumber(key) or key
|
||||||
|
end
|
||||||
|
|
||||||
nextState[key] = apply(nextState[key], patch)
|
nextState[key] = apply(nextState[key], patch)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue