Exemplo n.º 1
0
            IObserver <ListChange <T> > LeftObserver()
            {
                return(Observer.Create <ListChange <T> >(
                           onNext: changes =>
                {
                    lock (_gate)
                    {
                        var newChanges = new List <ListChange <T> >();
                        changes(
                            insert: (index, item) =>
                        {
                            newChanges.Add(ListChange.Insert(index, item));
                            ++_leftCount;
                        },
                            replace: (index, item) => { newChanges.Add(ListChange.Replace(index, item)); },
                            remove: index =>
                        {
                            newChanges.Add(ListChange.Remove <T>(index));
                            --_leftCount;
                        },
                            clear: () =>
                        {
                            if (_rightCount == 0)
                            {
                                newChanges.Add(ListChange.Clear <T>());
                            }
                            else
                            {
                                for (var i = _leftCount - 1; i >= 0; --i)
                                {
                                    newChanges.Add(ListChange.Remove <T>(i));
                                }
                            }

                            _leftCount = 0;
                        });
                        if (newChanges.Count > 0)
                        {
                            _observer.OnNext(ListChange.Combine(newChanges));
                        }
                    }
                },
                           onCompleted: () =>
                {
                    lock (_gate)
                    {
                        if (_rightCompleted)
                        {
                            _observer.OnCompleted();
                        }

                        _leftCompleted = true;
                    }
                },
                           onError: e =>
                {
                    lock (_gate)
                        _observer.OnError(e);
                }));
            }
Exemplo n.º 2
0
        public Optional <ListChange <T> > Clear <T>()
        {
            var oldTrueCount = _items.Sum();

            _items = _items.Clear();

            return(oldTrueCount == 0
                                ? Optional.None <ListChange <T> >()
                                : ListChange.Clear <T>());
        }
Exemplo n.º 3
0
        public static IObservableList <T> SeparateBy <T>(this IObservableList <T> self, Func <T> separator)
        {
            return(self
                   .SelectWithState(
                       0,
                       (changes, res) =>
            {
                var newChanges = new List <ListChange <T> >();
                var count = res;
                changes(
                    insert: (i, item) =>
                {
                    if (i == count)                                             // inserting at the end
                    {
                        if (count == 0)                                         // inserting first element: skip the separator
                        {
                            newChanges.Add(ListChange.Insert(0, item));
                        }
                        else                                                 // add separator before item
                        {
                            newChanges.Add(ListChange.Insert(i * 2 - 1, separator()));
                            newChanges.Add(ListChange.Insert(i * 2, item));
                        }
                    }
                    else                                             // add separator after item
                    {
                        newChanges.Add(ListChange.Insert(i * 2, item));
                        newChanges.Add(ListChange.Insert(i * 2 + 1, separator()));
                    }
                    ++count;
                },
                    replace: (i, item) =>
                {
                    newChanges.Add(ListChange.Replace(i * 2, item));
                },
                    remove: i =>
                {
                    if (i == count - 1)                                             // removing at the end
                    {
                        if (i == 0)                                                 // removing first element: no separator to remove
                        {
                            newChanges.Add(ListChange.Remove <T>(0));
                        }
                        else                                                  // remove separator before item
                        {
                            newChanges.Add(ListChange.Remove <T>(i * 2));
                            newChanges.Add(ListChange.Remove <T>(i * 2 - 1));
                        }
                    }
                    else                                             // remove separator after item
                    {
                        newChanges.Add(ListChange.Remove <T>(i * 2 + 1));
                        newChanges.Add(ListChange.Remove <T>(i * 2));
                    }
                    --count;
                },
                    clear: () =>
                {
                    newChanges.Add(ListChange.Clear <T>());
                    count = 0;
                });

                return SelectResult.Create(ListChange.Combine(newChanges), count);
            })
                   .UnsafeAsObservableList());
        }
Exemplo n.º 4
0
 public void OnClear()
 {
     OnNext(ListChange.Clear <T>());
 }
Exemplo n.º 5
0
 public static IObservableList <T> Switch <T>(this IObservable <IObservableList <T> > self)
 {
     return(self.Select(ol => ol.StartWith(ListChange.Clear <T>())).Switch().UnsafeAsObservableList());
 }