public ITrackingToken AdvancedTo(ITrackingToken newToken) { if ((newToken.Covers(IWrappedToken.UnwrapUpperBound(_tokenAtReset)) && !_tokenAtReset.Covers(IWrappedToken.UnwrapLowerBound(newToken)))) { // we're done replaying // if the token at reset was a wrapped token itself, we'll need to use that one to maintain progress. return(_tokenAtReset is IWrappedToken wrappedToken?wrappedToken.AdvancedTo(newToken) : newToken); } if (_tokenAtReset.Covers(IWrappedToken.UnwrapLowerBound(newToken))) { // we're still well behind return(new ReplayToken(_tokenAtReset, newToken, true)); } // we're getting an event that we didn't have before, but we haven't finished replaying either if (_tokenAtReset is IWrappedToken token) { return(new ReplayToken(token.UpperBound(newToken), token.AdvancedTo(newToken), false)); } return(new ReplayToken(_tokenAtReset.UpperBound(newToken), newToken, false)); }
public ITrackingToken UpperBound() { return(IWrappedToken.UnwrapUpperBound(_currentToken)); }