in rd-net/RdFramework/Impl/RdList.cs [133:191]
protected override void Init(Lifetime lifetime, IProtocol proto, SerializationCtx ctx)
{
base.Init(lifetime, proto, ctx);
if (!OptimizeNested)
{
Change.Advise(lifetime, it =>
{
if (IsLocalChange)
{
var definitions = TryGetBindDefinitions(lifetime);
if (definitions == null)
return;
if (it.Kind != AddUpdateRemove.Add)
definitions[it.Index]?.Terminate();
if (it.Kind == AddUpdateRemove.Remove)
definitions.RemoveAt(it.Index);
if (it.Kind != AddUpdateRemove.Remove && it.NewValue != null)
{
it.NewValue.IdentifyPolymorphic(proto.Identities, proto.Identities.Next(RdId));
definitions.Insert(it.Index, TryPreBindValue(lifetime, it.NewValue, it.Index, false));
}
}
});
}
using (UsingLocalChange())
{
Advise(lifetime, it =>
{
if (!IsLocalChange) return;
proto.Wire.Send(RdId, SendContext.Of(ctx, it, this), static(sendContext, stream) =>
{
var sContext = sendContext.SzrCtx;
var evt = sendContext.Event;
var me = sendContext.This;
stream.WriteInt64((me.myNextVersion++ << versionedFlagShift) | (long)evt.Kind);
stream.WriteInt32(evt.Index);
if (evt.Kind != AddUpdateRemove.Remove)
me.WriteValueDelegate(sContext, stream, evt.NewValue);
SendTrace?.Log($"list `{me.Location}` ({me.RdId}) :: {evt.Kind} :: index={evt.Index} :: " +
$"version = {me.myNextVersion - 1}" +
$"{(evt.Kind != AddUpdateRemove.Remove ? " :: value = " + evt.NewValue.PrintToString() : "")}");
});
if (!OptimizeNested)
it.NewValue.BindPolymorphic();
});
}
}