コード例 #1
0
        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>());
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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");
        }
コード例 #4
0
        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;
                }
            }));
        }