78 lines
2.8 KiB
C#
78 lines
2.8 KiB
C#
using OneOf;
|
|
|
|
namespace InkBlot.ParseHierarchy;
|
|
|
|
[GenerateOneOf]
|
|
public partial class
|
|
MultiDivert : OneOfBase<ThreadDivert, TunnelsAndDivertsList>,
|
|
IStoryNode;
|
|
|
|
public record Identifier(string[] Elements /* TODO: expressions */)
|
|
{
|
|
public virtual bool Equals(Identifier? other)
|
|
{
|
|
return other is not null && Elements.SequenceEqual(other.Elements);
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return "Identifier(" + string.Join('.', Elements) + ")";
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return Elements.GetHashCode();
|
|
}
|
|
}
|
|
|
|
// <- thread_name
|
|
public record ThreadDivert(Identifier Identifier) : IStoryNode
|
|
{
|
|
public override string ToString()
|
|
{
|
|
return $"ThreadDivert({Identifier})";
|
|
}
|
|
}
|
|
|
|
[GenerateOneOf]
|
|
public partial class TunnelListEnding : OneOfBase<TunnelListEndingDivert, TunnelListEndingReturnFromTunnel>;
|
|
|
|
public record TunnelListEndingDivert(Identifier? Divert);
|
|
|
|
public record TunnelListEndingReturnFromTunnel(Identifier? Divert);
|
|
|
|
/// <summary>
|
|
/// A sequence of zero or more tunnels, potentially ending in a divert, and potentially providing a tunnel replacement.
|
|
/// <code>
|
|
/// -> // [], divert(null)
|
|
/// ->-> // [], returnFromTunnel(null)
|
|
/// -> divertName // [], divert(divertName)
|
|
/// ->-> divertName // [], returnFromTunnel(divertName)
|
|
/// -> tunnelName -> // [tunnelName], divert(null)
|
|
/// -> tunnelName -> divertName // [tunnelName], divert(divertName)
|
|
/// -> tunnelName1 -> tunnelName2 -> // [tunnelName1, tunnelName2], divert(null)
|
|
/// -> tunnelName1 -> tunnelName2 ->-> // [tunnelName1, tunnelName2], returnFromTunnel(null)
|
|
/// -> tunnelName1 -> tunnelName2 ->-> divertName // [tunnelName1, tunnelName2], returnFromTunnel(divertName)
|
|
/// </code>
|
|
/// </summary>
|
|
public record TunnelsAndDivertsList(Identifier[] TunnelIdentifiers, TunnelListEnding Ending)
|
|
: IStoryNode
|
|
{
|
|
private const string Sep = ", ";
|
|
|
|
public virtual bool Equals(TunnelsAndDivertsList? other)
|
|
{
|
|
return other is not null && Ending.Equals(other.Ending) &&
|
|
TunnelIdentifiers.SequenceEqual(other.TunnelIdentifiers);
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return HashCode.Combine(TunnelIdentifiers, Ending);
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return $"TunnelsAndDivertsList({string.Join(Sep, TunnelIdentifiers.Select(i => i.ToString()))}, {Ending})";
|
|
}
|
|
} |