Guest User

C# fibers

a guest
Apr 27th, 2010
126
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //
  2. // Fibers.cs
  3. //
  4.  
  5. using System;
  6. using System.Collections;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Threading;
  10.  
  11. namespace Namespace
  12. {
  13.     public class CFiber
  14.     {
  15.         public static object Continue = new Object();
  16.         public delegate IEnumerable DExecutable();
  17.  
  18.         public CFiberManager Manager { get; set; }
  19.         public DExecutable Executable { get; set; }
  20.         public bool Active { get; set; }
  21.         public IEnumerable Enumerable { get; set; }
  22.         public IEnumerator Enumerator { get; set; }
  23.  
  24.         public CFiber(CFiberManager manager, DExecutable executable)
  25.         {
  26.             Manager = manager;
  27.             Executable = executable;
  28.             Active = true;
  29.         }
  30.     }
  31.  
  32.     public class CFiberManager
  33.     {
  34.         public List<CFiber> Fibers { get; set; }
  35.  
  36.         public CFiberManager()
  37.         {
  38.             Fibers = new List<CFiber>();
  39.         }
  40.  
  41.         public CFiber Fork(CFiber.DExecutable executable)
  42.         {
  43.             CFiber result = new CFiber(this, executable);
  44.             Fibers.Add(result);
  45.             return result;
  46.         }
  47.  
  48.         public void Update()
  49.         {
  50.             foreach (CFiber fiber in Fibers)
  51.             {
  52.                 if (fiber.Enumerable == null)
  53.                 {
  54.                     fiber.Enumerable = fiber.Executable();
  55.                     fiber.Enumerator = fiber.Enumerable.GetEnumerator();
  56.                 }
  57.                 bool has_elements = fiber.Enumerator.MoveNext();
  58.                 fiber.Active = has_elements;
  59.             }
  60.  
  61.             Fibers.RemoveAll(fiber => fiber.Active == false);
  62.         }
  63.  
  64.         public static IEnumerable WaitFrames(int frames)
  65.         {
  66.             while (frames-- > 0)
  67.                 yield return frames;
  68.         }
  69.     }
  70. }
RAW Paste Data