42 lines
1.3 KiB
C#
42 lines
1.3 KiB
C#
namespace DevDisciples.Parsing;
|
|
|
|
public class VisitorContainer
|
|
{
|
|
private Dictionary<Type, Visitor.Visit> Visitors { get; } = new();
|
|
private Visitor.Visit Default { get; set; } = default!;
|
|
|
|
public void Register<TVisitee>(Visitor.Visit visitor)
|
|
{
|
|
Visitors[typeof(TVisitee)] = visitor;
|
|
}
|
|
|
|
public Visitor.Visit this[Type type] => Visitors.GetValueOrDefault(type, Default);
|
|
}
|
|
|
|
public class VisitorContainer<T>
|
|
{
|
|
protected Dictionary<Type, Visitor.Visit<T>> Visitors { get; } = new();
|
|
public Visitor.Visit<T> Default { get; } = default!;
|
|
|
|
|
|
public VisitorContainer<T> Register<TVisitee>(Visitor.Visit<T> visitor)
|
|
{
|
|
Visitors[typeof(TVisitee)] = visitor;
|
|
return this;
|
|
}
|
|
|
|
public Visitor.Visit<T> this[Type type] => Visitors.ContainsKey(type) ? Visitors[type] : Default;
|
|
}
|
|
|
|
public class VisitorContainer<TIn, TOut>
|
|
{
|
|
protected Dictionary<Type, Visitor.Visit<TIn, TOut>> Visitors { get; } = new();
|
|
public Visitor.Visit<TIn, TOut> Default { get; } = default!;
|
|
|
|
public void Register<TVisitee>(Visitor.Visit<TIn, TOut> visitor)
|
|
{
|
|
Visitors[typeof(TVisitee)] = visitor;
|
|
}
|
|
|
|
public Visitor.Visit<TIn, TOut> this[Type type] => Visitors.ContainsKey(type) ? Visitors[type] : Default;
|
|
} |