On 07/08/14 12:42, Thomas Wrobel wrote:
Thats really cool work.
Seems to work slickly, and theres mobile library code already.

Someone needs to make a ven diagram of various communication techs and
their features. As I understand it this has the functionality of the wave
protocol except for the federation right?

Just a random thought, but seeing as theres occasionally calls for the Wave
code base to be scrapped and recreated (faster/better/stronger/neater...)
would it make sense to build a new WFP out of this, rather then trying to
wrangle the existing code into shape?  Or is that a crazy idea?

It looks JSON-shaped, which Wave's data model may or may not be compatible with. There'd certainly need to be a lot of wrangling to get them to line up!

I haven't been able to figure out a way to represent rich text in a system such as OP's that can only do JSON. Storing annotations separately means the system has to know how to change them in response to operations that affect the indexes used, while interleaving that information with the text appears to require a split-string-in-list operation.

For the first option, if we have:
{ text: "foo barrow baz", annotations: [] }

and Alice wants to make "row" bold, she might insert into the annotation list: list-insert(annotations[0], {range: [7,10], key: "font-weight", value: "bold"})

at the same time as Bob sends another change:
string-insert(text[7], "ton")

Then a system not aware of the relationship between text and annotations will end up with: { text: "foo bartonrow baz", annotations: {range: [7,10], key: "font-weight", value: "bold"}}

(ie, "row" isn't emboldened)

When the expected result would presumably be:
{ text: "foo bartonrow baz", annotations: {range: [7,13], key: "font-weight", value: "bold"}}

to account for the extra three characters.

For the second option, split-string-in-list, that initial state might be:
{ text: ["foo barrow", " baz"]}

Alice's change, without split-string-in-list, would be:
list-delete(text[0])
list-insert(text[0], "foo ")
list-insert(text[1], { key: "font-weight", value: "bold" })
list-insert(text[2], "barrow")
list-insert(text[3], { key: "font-weight", value: nil})

And Bob's would be:
string-insert(text[0][7], "ton")

An unaware engine might either drop Bob's change on the floor, or put it in the wrong place:
{ text: [
    "foo ton",
    { key: "font-weight", value: "bold" },
    "barrow",
    { key: "font-weight", value: nil}
]}

That said, there *are* designs for lists/strings that give identifiers stable under this sort of thing, but the one I've seen[1] has its own set of issues, like not being able to execute housekeeping operations while any participants are disconnected!

[1] http://arxiv.org/abs/0710.1784

Reply via email to