public static CompositeDisposable TrackChanges <T>(this IReactiveList <T> list, Action <T> add, Action <T> remove, Action <ICollection <T> > reset, Func <T, bool> filter = null) { if (list == null) { throw new ArgumentNullException(nameof(list)); } var disposables = new CompositeDisposable(); if (add != null) { var o = list.ItemsAdded; if (filter != null) { o = o.Where(filter); } disposables.Add(o.Subscribe(add)); } if (remove != null) { var o = list.ItemsRemoved; if (filter != null) { o = o.Where(filter); } disposables.Add(o.Subscribe(remove)); } if (reset != null) { disposables.Add(list.ShouldReset .Subscribe(x => reset(filter == null ? list.ToArray() : list.Where(filter).ToArray()))); } return(disposables); }