YousefED / SyncedStore

SyncedStore CRDT is an easy-to-use library for building live, collaborative applications that sync automatically.

Home Page:https://syncedstore.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Array indexing

Toubat opened this issue · comments

It seems like array assignment by index is not supported currently. For example, if I have a store

export const store = syncedStore({
  todos: [] as Todo[],
  myText: {} as { text?: any },
  arr: [],
  fragment: "xml"
});

Then I type:

store.arr.push(1);
store.arr[0] = 1;

It gives me an error says array assignment is not supported. Is there any other way I can do to accomplish equivalent operation?

Change your array of numbers to an array of objects with one single attribute. Then modify that attribute.

export const store = syncedStore({
  todos: [] as Todo[],
  myText: {} as { text?: any },
  arr: [] as { value: number }[],
  fragment: "xml"
});

store.arr.push({value:1});
store.arr[0].value = 42;

Hi @Toubat,

The reason this is not supported, is that "assigning elements in an array" is most of the time not multi-user proof.

Assume we have an array ["green", "red", "blue"];

Let's say Alice and Bob both change array[1] at the same time, while being "offline":

  • Alice does array[1] = "purple"
  • Bob does array[1] = "orange"

When these changes sync, would you expect ["green", "purple", "blue"], ["green", "orange", "blue"] or ["green", "purple", "orange", "blue"]?

When dealing with lists / arrays, I think often you'd want the latter ["green", "purple", "orange", "blue"]. An assignment doesn't seem "idiomatic" for this, as it's better represented by a delete and insert operation.

I think adding support for assignment in arrays will lead to a lot of confusion in multi-user scenarios, I think it's cleaner to recommend users to use alternative operations (inserting and removing elements separately)

That's really helpful! Thank you for the detailed explanation!