public SearchCollection(ISearchInfoCollection searchInfoCollection, ISchedulerProvider schedulerProvider)
{
_viewModels = searchInfoCollection.Searches.Connect()
.Transform(tail => new SearchViewModel(tail, vm =>
{
searchInfoCollection.Remove(vm.Text);
}))
.DisposeMany()
.AsObservableCache();
var shared = _viewModels.Connect();//.Publish();
var binderLoader = shared
.Sort(SortExpressionComparer<SearchViewModel>
.Ascending(tvm => tvm.SearchType== SearchType.All ? 1:2)
.ThenByAscending(tvm => tvm.Text))
.ObserveOn(schedulerProvider.MainThread)
.Bind(out _items)
.Subscribe();
var autoSelector = shared.WhereReasonsAre(ChangeReason.Add)
.Flatten()
.Select(change => change.Current)
.Subscribe(latest => Selected = latest);
var removed = shared.WhereReasonsAre(ChangeReason.Remove)
.Subscribe(_ => Selected = _viewModels.Items.First());
var counter = shared.ToCollection()
.Subscribe(count => Count = count.Count);
var nullDodger = this.WhenValueChanged(sc => sc.Selected)
.Where(x => x == null)
.Subscribe(x => Selected =_viewModels.Items.First());
Latest = this.WhenValueChanged(sc => sc.Selected)
.Where(x=>x!=null)
.Select(svm => svm.Latest)
.Switch()
.Replay(1).RefCount();
_cleanUp = new CompositeDisposable(_viewModels, binderLoader, counter, removed, autoSelector, nullDodger);
}