// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT License. // See the LICENSE file in the project root for more information. using System.Reactive.Concurrency; namespace System.Reactive.Linq.ObservableImpl { internal abstract class DelaySubscription : Producer._> { private readonly IObservable _source; private readonly IScheduler _scheduler; protected DelaySubscription(IObservable source, IScheduler scheduler) { _source = source; _scheduler = scheduler; } internal sealed class Relative : DelaySubscription { private readonly TimeSpan _dueTime; public Relative(IObservable source, TimeSpan dueTime, IScheduler scheduler) : base(source, scheduler) { _dueTime = dueTime; } protected override _ CreateSink(IObserver observer) => new(observer); protected override void Run(_ sink) => sink.Run(_source, _scheduler, _dueTime); } internal sealed class Absolute : DelaySubscription { private readonly DateTimeOffset _dueTime; public Absolute(IObservable source, DateTimeOffset dueTime, IScheduler scheduler) : base(source, scheduler) { _dueTime = dueTime; } protected override _ CreateSink(IObserver observer) => new(observer); protected override void Run(_ sink) => sink.Run(_source, _scheduler, _dueTime); } internal sealed class _ : IdentitySink { public _(IObserver observer) : base(observer) { } public void Run(IObservable source, IScheduler scheduler, DateTimeOffset dueTime) { SetUpstream(scheduler.ScheduleAction((@this: this, source), dueTime, static tuple => tuple.source.SubscribeSafe(tuple.@this))); } public void Run(IObservable source, IScheduler scheduler, TimeSpan dueTime) { SetUpstream(scheduler.ScheduleAction((@this: this, source), dueTime, static tuple => tuple.source.SubscribeSafe(tuple.@this))); } } } }