using System.Collections.Generic; namespace Ariadne.UnitTests { /// /// Keeps a local of its type parameter across a pause. /// public partial class Collector : Arc { public T Source; public T Result; protected override void Run(ArcTests.Gates gates) { T held = Source; var seen = new List(); wait: while (!gates.Open.Contains("go")) { seen.Add(held); Yield(); } seen.Add(held); Result = seen[seen.Count - 1]; Count = seen.Count; } public int Count; } /// /// Holds a passage whose parameter and local are of its type parameter. /// public abstract partial class Stepper : Arc { public T Last; protected void Hold(ArcTests.Gates gates, T value) { T held = value; hold: while (!gates.Open.Contains("go")) { Yield(); } Last = held; } } public partial class WordStepper : Stepper { public string Source = "word"; protected override void Run(ArcTests.Gates gates) { string local = Source + "!"; first: Hold(gates, local); } } /// /// Offers a passage for other arcs to run, in a class with a type parameter. /// public partial class Planter : Arc { public T Planted; public void Plant(ArcTests.Gates gates, T seed) { T kept = seed; grow: while (!gates.Open.Contains("go")) { Yield(); } Planted = kept; } protected override void Run(ArcTests.Gates gates) { } } public partial class Gardener : Arc { public Planter Plot; public string Report; protected override void Run(ArcTests.Gates gates) { string seed = "tulip"; plant: Plot.Plant(gates, seed); Report = "planted " + Plot.Planted; } } }