示例#1
0
        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));
        }
示例#2
0
 public ITrackingToken UpperBound()
 {
     return(IWrappedToken.UnwrapUpperBound(_currentToken));
 }