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;
}
}
}