Пример #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 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));
            }
        }
Пример #3
0
 public static long?GetTokenAtReset(ITrackingToken trackingToken)
 {
     return(IWrappedToken.Unwrap <ReplayToken>(trackingToken)?.GetTokenAtReset().Position());
 }
Пример #4
0
 public static bool IsReplay(ITrackingToken trackingToken)
 {
     return(IWrappedToken.Unwrap <ReplayToken>(trackingToken)?.IsReplay() ?? false);
 }
Пример #5
0
 public R?Unwrap <R>() where R : class, ITrackingToken
 {
     return(this as R ?? IWrappedToken.Unwrap <R>(_currentToken));
 }
Пример #6
0
 public ITrackingToken UpperBound()
 {
     return(IWrappedToken.UnwrapUpperBound(_currentToken));
 }