feat: multidivert; more tests
This commit is contained in:
@@ -4,18 +4,8 @@ namespace InkBlot.ParseHierarchy;
|
||||
|
||||
[GenerateOneOf]
|
||||
public partial class
|
||||
MultiDivert : OneOfBase<ThreadDivert, DivertsListWithReturnFromTunnel, DivertsListWithoutReturnFromTunnel>,
|
||||
IStoryNode
|
||||
{
|
||||
public override bool Equals(object? obj)
|
||||
{
|
||||
if (obj is OneOfBase<ThreadDivert, DivertsListWithReturnFromTunnel, DivertsListWithoutReturnFromTunnel> divert)
|
||||
Console.WriteLine("it actually is fuck");
|
||||
|
||||
var rv = base.Equals(obj);
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
MultiDivert : OneOfBase<ThreadDivert, TunnelsAndDivertsList>,
|
||||
IStoryNode;
|
||||
|
||||
public record Identifier(string[] Elements /* TODO: expressions */)
|
||||
{
|
||||
@@ -44,14 +34,38 @@ public record ThreadDivert(Identifier Identifier) : IStoryNode
|
||||
}
|
||||
}
|
||||
|
||||
// -> ... ->-> // return from tunnel
|
||||
// or
|
||||
// -> ... ->-> tunnelReplacement // return from tunnel, but replace destination
|
||||
public record DivertsListWithReturnFromTunnel(Identifier[] Identifiers, Identifier? TunnelReplacement)
|
||||
: IStoryNode;
|
||||
[GenerateOneOf]
|
||||
public partial class TunnelListEnding : OneOfBase<TunnelListEndingDivert, TunnelListEndingReturnFromTunnel>;
|
||||
|
||||
// -> ... -> div // not a tunnel
|
||||
// or
|
||||
// -> ... -> div -> // is tunnel
|
||||
public record DivertsListWithoutReturnFromTunnel(Identifier[] Identifiers, bool IsTunnel)
|
||||
: IStoryNode;
|
||||
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
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user