Yes, compose and transform are not compatible with eachother.

Dan

Στις 5 Μαρτίου 2011 12:45 π.μ., ο χρήστης Joseph Gentle
<jose...@gmail.com>έγραψε:

> I've just found a surprising bug of sorts in my OT code. It turns out
> compose has peculiar side effects in terms of information loss / gain.
>
> Imagine you have a compose function '+', infix transform function 'T',
> server op 's' and client ops 'c1' and 'c2', its possible that:
> s T c1 T c2  !=  s T (c1 + c2)
>
> Wave's concurrency control algorithms never do this, so its not a
> problem in practice. Is this normal? It never occurred to me that this
> would be the case...
>
> If anyone is curious, I've reproduced this behaviour using WIAB's
> docops (below).
>
> -J
>
>
> ... Basically, it happens if
> s = insert: 's', skip: 1
> c1 = delete: 'x'
> c2 = insert: 'c'
>
>
>    // Make println() usable.
>    DocOpScrub.setShouldScrubByDefault(false);
>
>    DocOp s = new DocOpBuilder().characters("s").retain(1).build();
>
>    DocOp c1 = new DocOpBuilder().deleteCharacters("x").build();
>    DocOp c2 = new DocOpBuilder().characters("c").build();
>
>    DocOp cc = Composer.compose(c1, c2);
>
>    // s_ = s T c1
>    DocOp s_ = Transformer.transform(c1, s).serverOp();
>    // s__ = s T c1 T c2
>    DocOp s__ = Transformer.transform(c2, s_).serverOp();
>
>    // cc = c1 + c2
>    System.out.println("cc: " + cc);
>    // scc_ = s T (c1 + c2)
>    DocOp scc_ = Transformer.transform(cc, s).serverOp();
>
>    // s__ and scc_ are different!
>    System.out.println("s__: " + s__);
>    System.out.println("scc_: " + scc_);
>    System.out.println();
>
>    // ... And not just different syntactically. They're different
> semantically.
>    DocOp doc1 = Composer.compose(ImmutableList.of(new
> DocOpBuilder().characters("x").build(), c1, c2, s__));
>    System.out.println("doc1: " + doc1);
>
>    DocOp doc2 = Composer.compose(ImmutableList.of(new
> DocOpBuilder().characters("x").build(), cc, scc_));
>    System.out.println("doc2: " + doc2);
>

Reply via email to