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 static ITrackingToken CreateReplayToken(ITrackingToken tokenAtReset, ITrackingToken?startPosition) { while (true) { if (tokenAtReset is ReplayToken token) { tokenAtReset = token._tokenAtReset; continue; } return(startPosition != null && startPosition.Covers(IWrappedToken.UnwrapLowerBound(tokenAtReset)) ? startPosition : new ReplayToken(tokenAtReset, startPosition)); } }
public ITrackingToken LowerBound() { return(IWrappedToken.UnwrapLowerBound(_currentToken)); }