Пример #1
0
 public static StageProvider Preload(IStageProvider provider)
 {
     if (provider is StageProvider csp)
     {
         return(csp);
     }
     return(new StageProvider(provider.GetStages()));
 }
Пример #2
0
 public static bool TryPreload(this IStageProvider provider, out IStageProvider preloaded)
 {
     if (provider.IsPreloadable)
     {
         preloaded = provider.Preloaded();
         return(true);
     }
     preloaded = null;
     return(false);
 }
Пример #3
0
 public static IEnumerable <Stage> AsEnumerable(this IStageProvider stageProvider)
 {
     while (true)
     {
         var next = stageProvider.Next();
         if (next == null)
         {
             yield break;
         }
         yield return(next);
     }
 }
Пример #4
0
 /// <summary>
 /// Create a stage program.
 /// </summary>
 /// <param name="clock">Clock for timing</param>
 /// <param name="stageProvider">Stage provider that providing stages</param>
 /// <param name="preferPreloaded">Prefer pre-loaded stages if possible</param>
 public StageProgram([NotNull] IClock clock, [NotNull] IStageProvider stageProvider, bool preferPreloaded = true)
 {
     if (stageProvider == null)
     {
         throw new ArgumentNullException(nameof(stageProvider));
     }
     OriginalClock             = clock ?? throw new ArgumentNullException(nameof(clock));
     FreezableClock            = new FreezableClock(clock.As(TimeUnit.Millisecond));
     FreezableClock.Frozen    += (sender, e) => _pausedEvent.Set();
     FreezableClock.Unfrozen  += (sender, e) => _pausedEvent.Reset();
     _stageProvider            = preferPreloaded && stageProvider.TryPreload(out var preloaded) ? preloaded : stageProvider;
     _cyclicExecutor           = new AsyncCyclicExecutor("StageProgram Worker", DoWork, true, ThreadPriority.Highest, null, StoppingAction.Abort);
     _cyclicExecutor.Starting += (sender, e) =>
     {
         CurrentStage = null;
         _pausedEvent.Set();
         StartTime       = Time;
         _nextUpdateTime = 0;
     };
     _cyclicExecutor.Started += (sender, e) => Started?.Invoke(this, EventArgs.Empty);
     _cyclicExecutor.Stopped += (sender, e) => Stopped?.Invoke(this, EventArgs.Empty);
     _stageSkipped            = new AtomicBool(false);
     _pausedEvent             = new ManualResetEvent(false);
 }
Пример #5
0
 public ConditionStageProvider(bool val, IStageProvider falseStageProvider, IStageProvider trueStageProvider) : base(val ? trueStageProvider : falseStageProvider)
 {
 }
Пример #6
0
 public ConditionStageProvider(bool val, IStageProvider trueStageProvider) : base(val ? trueStageProvider : null)
 {
 }
Пример #7
0
 public DelegatedStageProvider(IStageProvider stageProvider) => StageProvider = stageProvider;
Пример #8
0
 public static IStageProvider GetPreloadedOrSelf(this IStageProvider provider) => TryPreload(provider, out var preloaded) ? preloaded : provider;
Пример #9
0
 public static ICollection <Stage> GetStages(this IStageProvider provider) => GetStages(new[] { provider });