public override int GetHashCode()
 {
     unchecked
     {
         return(((TokenAtReset != null ? TokenAtReset.GetHashCode() : 0) * 397) ^ (CurrentToken != null ? CurrentToken.GetHashCode() : 0));
     }
 }
 public ITrackingToken AdvancedTo(ITrackingToken newToken)
 {
     if (TokenAtReset == null ||
         (newToken.Covers(this.TokenAtReset) && !TokenAtReset.Covers(newToken)))
     {
         // we're done replaying
         return(newToken);
     }
     else if (TokenAtReset.Covers(newToken))
     {
         // we're still well behind
         return(new ReplayToken(TokenAtReset, newToken));
     }
     else
     {
         // we're getting an event that we didn't have before, but we haven't finished replaying either
         return(new ReplayToken(TokenAtReset.UpperBound(newToken), newToken));
     }
 }
 private bool IsReplay() => CurrentToken == null || TokenAtReset.Covers(CurrentToken);