namespace CanonSharp.Common.LexicalAnalyzer; public class EmptyChar : IEquatable { public bool IsEmpty { get; } public char Char { get; } public static EmptyChar Empty => new(); private EmptyChar() { IsEmpty = true; Char = char.MaxValue; } public EmptyChar(char c) { IsEmpty = false; Char = c; } public bool Equals(EmptyChar? other) { if (other is null) { return false; } if (IsEmpty) { return other.IsEmpty; } return Char == other.Char; } public override bool Equals(object? obj) => obj is EmptyChar other && Equals(other); public override int GetHashCode() { return IsEmpty.GetHashCode() ^ Char.GetHashCode(); } public override string ToString() { return IsEmpty ? "ε" : Char.ToString(); } }