public static StageProvider Preload(IStageProvider provider) { if (provider is StageProvider csp) { return(csp); } return(new StageProvider(provider.GetStages())); }
public static bool TryPreload(this IStageProvider provider, out IStageProvider preloaded) { if (provider.IsPreloadable) { preloaded = provider.Preloaded(); return(true); } preloaded = null; return(false); }
public static IEnumerable <Stage> AsEnumerable(this IStageProvider stageProvider) { while (true) { var next = stageProvider.Next(); if (next == null) { yield break; } yield return(next); } }
/// <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); }
public ConditionStageProvider(bool val, IStageProvider falseStageProvider, IStageProvider trueStageProvider) : base(val ? trueStageProvider : falseStageProvider) { }
public ConditionStageProvider(bool val, IStageProvider trueStageProvider) : base(val ? trueStageProvider : null) { }
public DelegatedStageProvider(IStageProvider stageProvider) => StageProvider = stageProvider;
public static IStageProvider GetPreloadedOrSelf(this IStageProvider provider) => TryPreload(provider, out var preloaded) ? preloaded : provider;
public static ICollection <Stage> GetStages(this IStageProvider provider) => GetStages(new[] { provider });