/// <summary> /// Mostly useful for testing /// </summary> /// <typeparam name="T"></typeparam> /// <param name="source"></param> /// <param name="timeout"></param> /// <returns></returns> public static IObservable <IList <T> > ToListAsync <T>(this IObservable <T> source, TimeSpan?timeout = null) { source.AssertNotNull(nameof(source)); return(source .Timeout(timeout.GetValueOrDefault(TimeSpan.FromSeconds(3))) .Buffer(int.MaxValue) .FirstAsync()); }
public ExerciseViewModel(ISchedulerService schedulerService, Exercise model, IObservable<ExecutionContext> executionContext) { schedulerService.AssertNotNull(nameof(schedulerService)); model.AssertNotNull(nameof(model)); executionContext.AssertNotNull(nameof(executionContext)); this.disposables = new CompositeDisposable(); this.model = model; executionContext .ObserveOn(schedulerService.MainScheduler) .Subscribe(x => this.ExecutionContext = x) .AddTo(this.disposables); Observable .CombineLatest( this .WhenAnyValue(x => x.ExecutionContext) .Select(ec => ec == null ? Observable.Never<TimeSpan>() : ec.WhenAnyValue(x => x.SkipAhead)) .Switch(), this .WhenAnyValue(x => x.ExecutionContext) .Select(ec => ec == null ? Observable.Never<Exercise>() : ec.WhenAnyValue(x => x.CurrentExercise)) .Switch(), (skip, current) => skip == TimeSpan.Zero && current == this.model) .ObserveOn(schedulerService.MainScheduler) .Subscribe(x => this.IsActive = x) .AddTo(this.disposables); this .WhenAnyValue(x => x.ExecutionContext) .Select( ec => ec == null ? Observable.Return(TimeSpan.Zero) : ec .WhenAnyValue(x => x.CurrentExerciseProgress) .Where(_ => ec.CurrentExercise == this.model) .StartWith(TimeSpan.Zero)) .Switch() .ObserveOn(schedulerService.MainScheduler) .Subscribe(x => this.ProgressTimeSpan = x) .AddTo(this.disposables); this .WhenAny( x => x.Duration, x => x.ProgressTimeSpan, (duration, progressTimeSpan) => progressTimeSpan.Value.TotalMilliseconds / duration.Value.TotalMilliseconds) .Select(progressRatio => double.IsNaN(progressRatio) || double.IsInfinity(progressRatio) ? 0d : progressRatio) .Select(progressRatio => Math.Min(1d, progressRatio)) .Select(progressRatio => Math.Max(0d, progressRatio)) .ObserveOn(schedulerService.MainScheduler) .Subscribe(x => this.Progress = x) .AddTo(this.disposables); }
public ExerciseViewModel(ISchedulerService schedulerService, Exercise model, IObservable <ExecutionContext> executionContext) { schedulerService.AssertNotNull(nameof(schedulerService)); model.AssertNotNull(nameof(model)); executionContext.AssertNotNull(nameof(executionContext)); this.disposables = new CompositeDisposable(); this.model = model; executionContext .ObserveOn(schedulerService.MainScheduler) .Subscribe(x => this.ExecutionContext = x) .AddTo(this.disposables); Observable .CombineLatest( this .WhenAnyValue(x => x.ExecutionContext) .Select(ec => ec == null ? Observable.Never <TimeSpan>() : ec.WhenAnyValue(x => x.SkipAhead)) .Switch(), this .WhenAnyValue(x => x.ExecutionContext) .Select(ec => ec == null ? Observable.Never <Exercise>() : ec.WhenAnyValue(x => x.CurrentExercise)) .Switch(), (skip, current) => skip == TimeSpan.Zero && current == this.model) .ObserveOn(schedulerService.MainScheduler) .Subscribe(x => this.IsActive = x) .AddTo(this.disposables); this .WhenAnyValue(x => x.ExecutionContext) .Select( ec => ec == null ? Observable.Return(TimeSpan.Zero) : ec .WhenAnyValue(x => x.CurrentExerciseProgress) .Where(_ => ec.CurrentExercise == this.model) .StartWith(TimeSpan.Zero)) .Switch() .ObserveOn(schedulerService.MainScheduler) .Subscribe(x => this.ProgressTimeSpan = x) .AddTo(this.disposables); this .WhenAny( x => x.Duration, x => x.ProgressTimeSpan, (duration, progressTimeSpan) => progressTimeSpan.Value.TotalMilliseconds / duration.Value.TotalMilliseconds) .Select(progressRatio => double.IsNaN(progressRatio) || double.IsInfinity(progressRatio) ? 0d : progressRatio) .Select(progressRatio => Math.Min(1d, progressRatio)) .Select(progressRatio => Math.Max(0d, progressRatio)) .ObserveOn(schedulerService.MainScheduler) .Subscribe(x => this.Progress = x) .AddTo(this.disposables); }