2016-08-22 3 views
0

을 자동 취소 : 소스가있을 때 항상 false입니다 시퀀스를 생성하지만 소스 시퀀스 사실 머물 때 진정한 갈 것ReactiveX 나는 형식의 확장 메서드를 만들려면 타이머

IObservable<bool> CancellableTimer(this IObservable source, TimeSpan delay) 
{ 
... 
} 

지연, t에 의해 정의 된 기간 :

source: 0---1---------0--1-0-1-0-1-0-1----------0 
      t------>     t------> 
result: 0----------1--0---------------------1---0 

확실 해요 수신 프리미티브를 사용하여이 작업을 수행 할 수있는 방법이 있어야하지만 수신에 새로 온 사람과 문제가 그 둘레에 내 머리를 얻는 데. 어떤 아이디어라도 제발?

답변

0

좋아, 그럼 내가 생각해 냈다.

[Fact] 
    public static void Test_AsymetricDelay() 
    { 
     var scheduler = new TestScheduler(); 

     var xs = scheduler.CreateHotObservable(
      new Recorded<Notification<bool>>(10000000, Notification.CreateOnNext(true)), 
      new Recorded<Notification<bool>>(60000000, Notification.CreateOnNext(false)), 
      new Recorded<Notification<bool>>(70000000, Notification.CreateOnNext(true)), 
      new Recorded<Notification<bool>>(80000000, Notification.CreateOnNext(false)), 
      new Recorded<Notification<bool>>(100000000, Notification.CreateOnCompleted<bool>()) 
     ); 

     var dest = xs.DelayOn(TimeSpan.FromSeconds(2), scheduler); 

     var testObserver = scheduler.Start(
      () => dest,    
      0, 
      0, 
      TimeSpan.FromSeconds(10).Ticks); 


     testObserver.Messages.AssertEqual(
      new Recorded<Notification<bool>>(30000000, Notification.CreateOnNext(true)), 
      new Recorded<Notification<bool>>(60000000, Notification.CreateOnNext(false)), 
      new Recorded<Notification<bool>>(100000000, Notification.CreateOnCompleted<bool>()) 

     ); 
    } 
: 그 작업을 확인하는

static public IObservable<bool> AsymetricDelay(this IObservable<bool> source, TimeSpan delay, IScheduler scheduler) 
    { 
     var distinct = source.DistinctUntilChanged(); 
     return distinct. 
      Throttle(delay, scheduler) // Delay both trues and falses 
      .Where(x => x)    // But we only want trues to be delayed 
      .Merge(     // Merge the trues with... 
       distinct.Where(x=>!x) // non delayed falses 
      ) 
      .DistinctUntilChanged(); // Get rid of any repeated values 

    } 

을 그리고 여기에 단위 테스트이다 : 더 적절한 이름처럼 보인다 나는 또한 AsymetricDelay()에 대한 방법을 개명