private void ProcessEntity(IEntity entity)
        {
            var isApplicable = ShouldTransform(entity);

            if (!isApplicable)
            {
                if (!FilteredCache.ContainsKey(entity.Id))
                {
                    return;
                }

                RemoveEntity(entity.Id);
                return;
            }

            var transformedData = Transform(entity);

            if (FilteredCache.ContainsKey(entity.Id))
            {
                ChangeEntity(entity.Id, transformedData);
                return;
            }

            AddEntity(entity.Id, transformedData);
        }
 private void AddEntity(int entityId, T transformedData)
 {
     FilteredCache.Add(entityId, transformedData);
     _onElementAdded.OnNext(new CollectionElementChangedEvent <T>
     {
         Index    = entityId,
         OldValue = default(T),
         NewValue = transformedData
     });
 }
        private void RemoveEntity(int entityId)
        {
            var currentValue = FilteredCache[entityId];

            FilteredCache.Remove(entityId);
            _onElementRemoved.OnNext(new CollectionElementChangedEvent <T>
            {
                Index    = entityId,
                OldValue = currentValue,
                NewValue = default(T)
            });
        }