シミュレーションAPIには、プロパティの変更を表すタイプと、変更の着信ストリームと発信IObservable<T>
ストリームを持つシミュレーションメソッドが必要です。シミュレーションエンジンの実装は、出力ストリームを更新するために着信プロパティの変更に反応するルールで構成されます。
タイプは次のようになります(ただし、構造体はクラスよりも優れている可能性があります)。
class PropertyChange
{
public PropertyChange(string name, object value) { Name = name; Value = value; }
public string Name { get; private set; }
public object Value { get; private set; }
}
シミュレーション方法は次のようになります。複数のルールを示すために、このコードはIsLightOn
単にを追跡するプロパティを前提としていますIsPowered
。
IObservable<PropertyChange> Simulate(IObservable<PropertyChange> incomingChanges)
{
var isLightOnRule =
from c in incomingChanges
where c.Name == "IsPowered"
select new PropertyChange("IsLightOn", c.Value);
var ramp = Observable.Generate(0, speed => (speed <= 1000), speed => speed + 10, speed => new PropertyChange("Speed", speed), _ => TimeSpan.FromSeconds(1));
var speedRule = incomingChanges
.Where(c => c.Name == "IsPowered" && (bool)c.Value)
.SelectMany(ramp);
// Add more rules here.
return Observable.Merge(isLightOnRule, speedRule /* merge more rules here */);
}