using Vellum;
namespace Ariadne.Vellum
{
///
/// Saves a latch as whether it is set, and the waits that are subscribed to it and to its inverse.
///
///
/// The inverse is part of its latch, since the latch makes it, so it needs no converter of its own.
///
public class LatchConverter : SaveConverter
{
private const string SetKey = "set";
private const string WaitersKey = "waiters";
private const string InverseWaitersKey = "inverseWaiters";
public override SaveNode Write(Latch value, SaveSession session)
{
SaveNode returnMe = SaveNode.NewTable();
returnMe.Entries[SetKey] = session.ToNode(value.IsSet);
returnMe.Entries[WaitersKey] = SavedSubscriptions.Write(value, session);
returnMe.Entries[InverseWaitersKey] = SavedSubscriptions.Write(value.Inverse, session);
return returnMe;
}
public override Latch Allocate(SaveNode node, SaveSession session)
{
return new Latch(session.FromNode(node.RequireEntry(SetKey)));
}
public override void Fill(Latch blank, SaveNode node, SaveSession session)
{
SavedSubscriptions.Fill(blank, node.RequireEntry(WaitersKey), session);
SavedSubscriptions.Fill(blank.Inverse, node.RequireEntry(InverseWaitersKey), session);
}
public override void Complete(Latch blank, SaveNode node, SaveSession session)
{
SavedSubscriptions.Check(blank);
SavedSubscriptions.Check(blank.Inverse);
}
public override bool TryListChildren(SaveNode node, ChildList children)
{
SaveNode waiters;
SaveNode inverseWaiters;
return node.TryGetEntry(WaitersKey, out waiters)
&& node.TryGetEntry(InverseWaitersKey, out inverseWaiters)
&& SavedSubscriptions.ListChildren(waiters, children)
&& SavedSubscriptions.ListChildren(inverseWaiters, children);
}
public override Latch Read(SaveNode node, SaveSession session)
{
Latch returnMe = Allocate(node, session);
session.Publish(node, returnMe);
Fill(returnMe, node, session);
return returnMe;
}
}
}