public IObservable <Action> LoadPrevMessages( Target target, SourceList <ItemModel> items) { switch (target) { case Chat chat: return(LoadPrevMessages(chat, items) .Aggregate(new List <Message>(), (list, m) => { list.Add(m); return list; }) .Select(messages => new Action(() => { var models = messages .Select(_messageModelFactory.CreateMessage) .Reverse() .ToList(); items.InsertRange(models, 0); }))); } return(Observable.Empty <Action>()); }
private IDisposable InitMessageLoading( Target target, IMessageManager messageManager, IAvatarManager avatarManager) { var messageLoading = messageManager.LoadPrevMessages(target) .Select(models => new { Action = new Action(() => { _items.InsertRange(models, 0); }), Models = models }); var avatarLoading = messageLoading .SelectMany(item => { var action = item.Action; var models = item.Models; var messageLoadAction = Observable.Return(action); var avatarPreloadAction = avatarManager.PreloadAvatars(models) .Select((avatar, i) => new Action(() => { var messageModel = models[i]; messageModel.Avatar = avatar; })); var avatarLoadAction = avatarManager.LoadAvatars(models) .Select((avatar, i) => new Action(() => { var messageModel = models[i]; messageModel.Avatar = avatar; })); return(messageLoadAction .Concat(avatarPreloadAction) .Concat(avatarLoadAction)); }); return(SubscribeToActions(avatarLoading)); }
public void InsertRange() { var people = _generator.Take(100).ToList(); _source.AddRange(people); var morePeople = _generator.Take(100).ToList(); _source.InsertRange(morePeople, 50); Assert.AreEqual(200, _collection.Count, "Should be 200 items in the collection"); CollectionAssert.AreEquivalent(_collection.Skip(50).Take(100), morePeople, "Collections should be equivalent"); }
private IDisposable BindChatLoading( IObservable <MessageLoadRequestedArgs> loadRequests, Chat chat, IMessageLoader messageLoader, IMessageModelFactory messageModelFactory) { return(loadRequests .ObserveOn(TaskPoolScheduler.Default) .SelectMany(signal => { var messages = signal.Direction == LoadDirection.Next ? LoadNextMessages(chat, messageLoader) : LoadPrevMessages(chat, messageLoader); return messages.Aggregate(new List <Message>(), (list, m) => { list.Add(m); return list; }) .Select(list => new { Direction = signal.Direction, Messages = list }); }) .Subscribe(data => { var direction = data.Direction; var models = data.Messages .Select(messageModelFactory.CreateMessage) .Reverse() .ToList(); switch (direction) { case LoadDirection.Prev: _items.InsertRange(models, 0); break; case LoadDirection.Next: _items.AddRange(models); break; } })); }