private void RemoveEntity([NotNull] IEntityHandle ent)
        {
            if (ent == null)
            {
                throw new ArgumentNullException(nameof(ent));
            }

            Debug.Assert(SyncEntities.Contains(ent));
            Debug.Assert(!InitEntities.Contains(ent));

            LeaveEntities.Add(ent);
        }
        protected IEnumerable <IUpdateSegment> GetSyncSegments(
            [NotNull] IList <IUpdateWriter> updateSegments,
            [NotNull] Func <FlagAccumulatorComponent, IUpdateWriter> updateWriterFactory)
        {
            if (updateSegments == null)
            {
                throw new ArgumentNullException(nameof(updateSegments));
            }
            if (updateWriterFactory == null)
            {
                throw new ArgumentNullException(nameof(updateWriterFactory));
            }

            var removeList   = new List <IEntityHandle>();
            var syncSegments = new List <IUpdateSegment>();

            foreach (var handle in SyncEntities)
            {
                // remove entity if
                // it's dead
                // or its in the leave list
                if (handle.IsDead() ||
                    LeaveEntities.Contains(handle))
                {
                    syncSegments.Add(RemoveEntitySegment.Instance);
                    removeList.Add(handle);
                }
                else
                {
                    var entity = handle.Get();
                    var flags  = entity.Components.AssertGet <FlagAccumulatorComponent>();

                    if (flags.Reinitialize)
                    {
                        InitEntities.Add(handle);
                        removeList.Add(handle);
                    }
                    else
                    {
                        var updater     = updateWriterFactory(flags);
                        var needsUpdate = updater.NeedsUpdate();

                        syncSegments.Add(CommonSegmentResolve(flags, needsUpdate));

                        if (needsUpdate)
                        {
                            updateSegments.Add(updater);
                        }
                    }
                }
            }

            // cleanup
            LeaveEntities.Clear();

            foreach (var handle in removeList)
            {
                SyncEntities.Remove(handle);
            }

            return(syncSegments);
        }