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); })); }
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> >()); } }
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)); } }