IEntryObservable
IEntryObservable is interface for observing state changes.
/// <summary>Observable entry</summary>
public interface IEntryObservable : IEntry, IObservable<EntryEvent> { }
/// <summary>Describes state transition. Events are dispatched after newStatus has applied.</summary>
public struct EntryEvent
{
/// <summary>Sending entry.</summary>
public IEntry Sender;
/// <summary>State before change.</summary>
public EntryState OldState;
/// <summary>State after change.</summary>
public EntryState NewState;
}
.Subscribe(observer) subscribes to state changes.
// Create entry in unassigned state
IEntry<string> entry = new Entry<string>();
// Create observer
IObserver<EntryEvent> observer = new Observer();
// Subscribe to changes
entry.Subscribe(observer);
// Modify state
entry.SetValue("Hello");
// Dispose
((IDisposable)entry).Dispose();
// OnNext((Value, Hello, , None))
// OnNext((Disposed, Hello, , None))
// OnCompleted
public class Observer : IObserver<EntryEvent>
{
public void OnCompleted() => WriteLine("OnCompleted");
public void OnError(Exception error) => WriteLine($"OnError({error})");
public void OnNext(EntryEvent @event) => WriteLine($"OnNext({@event.NewState})");
}
.Subscribe(delegate) subscribes an Action<EntryEvent>.
// Create entry in unassigned state
IEntry<string> entry = new Entry<string>();
// Subsribe with delegate
((IEntryObservable)entry).Subscribe(@event => WriteLine(@event));
// Modify state
entry.SetValue("Hello");
Full Example
Full example
using System;
using Avalanche.Service;
using static System.Console;
public class entry_observable
{
public static void Run()
{
{
// <01>
// Create entry in unassigned state
IEntry<string> entry = new Entry<string>();
// Create observer
IObserver<EntryEvent> observer = new Observer();
// Subscribe to changes
entry.Subscribe(observer);
// Modify state
entry.SetValue("Hello");
// Dispose
((IDisposable)entry).Dispose();
// OnNext((Value, Hello, , None))
// OnNext((Disposed, Hello, , None))
// OnCompleted
// </01>
}
{
// <02>
// Create entry in unassigned state
IEntry<string> entry = new Entry<string>();
// Subsribe with delegate
((IEntryObservable)entry).Subscribe(@event => WriteLine(@event));
// Modify state
entry.SetValue("Hello");
// </02>
}
}
// <99>
public class Observer : IObserver<EntryEvent>
{
public void OnCompleted() => WriteLine("OnCompleted");
public void OnError(Exception error) => WriteLine($"OnError({error})");
public void OnNext(EntryEvent @event) => WriteLine($"OnNext({@event.NewState})");
}
// </99>
}