Beispiel #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);
                }));
            }
Beispiel #2
0
        public Optional <ListChange <T> > Replace <T>(int index, T item, bool predicateTrue)
        {
            var toIndex = _items.Sum(index);

            var oldPredicateTrue = _items[index] == 1;

            _items = _items.ReplaceAt(index, predicateTrue ? 1 : 0);

            if (predicateTrue)
            {
                return(oldPredicateTrue
                                        ? ListChange.Replace(toIndex, item)
                                        : ListChange.Insert(toIndex, item));
            }
            else
            {
                return(oldPredicateTrue
                                        ? ListChange.Remove <T>(toIndex)
                                        : Optional.None <ListChange <T> >());
            }
        }
Beispiel #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());
        }
 public void OnReplace(int index, T item)
 {
     OnNext(ListChange.Replace(index, item));
 }
 public T this[int i]
 {
     get { return(_value[i]); }
     set { OnNext(ListChange.Replace(i, value)); }
 }