Jsm.Control.While.Executer.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using OpenVIII.Fields.Scripts.Instructions;
  2. using System.Collections.Generic;
  3. namespace OpenVIII.Fields.Scripts
  4. {
  5. public static partial class Jsm
  6. {
  7. #region Classes
  8. public static partial class Control
  9. {
  10. #region Classes
  11. public sealed partial class While
  12. {
  13. #region Classes
  14. private sealed class Executor : IScriptExecutor
  15. {
  16. #region Fields
  17. private readonly WhileSegment _seg;
  18. #endregion Fields
  19. #region Constructors
  20. public Executor(WhileSegment seg) => _seg = seg;
  21. #endregion Constructors
  22. #region Methods
  23. public IEnumerable<IAwaitable> Execute(IServices services)
  24. {
  25. while (CanExecute(_seg.Jpf, services))
  26. {
  27. var executable = _seg.GetBodyInstructions();
  28. var executer = ExecutableSegment.GetExecuter(executable);
  29. foreach (var result in executer.Execute(services))
  30. yield return result;
  31. // Skip one iteration to give control to other operations.
  32. yield return SpinAwaitable.Instance;
  33. }
  34. }
  35. private bool CanExecute(JPF jpf, IServices services)
  36. {
  37. foreach (var condition in jpf.Conditions)
  38. {
  39. if (!condition.Boolean(services))
  40. return false;
  41. }
  42. return true;
  43. }
  44. #endregion Methods
  45. }
  46. #endregion Classes
  47. }
  48. #endregion Classes
  49. }
  50. #endregion Classes
  51. }
  52. }