private async Task <List <long> > StreamObjectToVersion(DomainObject domainObject, long maxVersion, string identifier)
        {
            // skip streaming entirely if the object is at or above the desired version
            if (domainObject.MetaVersion >= maxVersion)
            {
                return(new List <long>());
            }

            var appliedEvents = new List <long>();

            await _eventStore.ReplayEventsAsStream(
                tuple =>
            {
                var(recordedEvent, domainEvent) = tuple;

                // stop at the designated max-version
                if (recordedEvent.EventNumber > maxVersion)
                {
                    return(false);
                }

                var versionBefore = domainObject.CurrentVersion;

                domainObject.ApplyEvent(new ReplayedEvent
                {
                    UtcTime     = recordedEvent.UtcTime.ToUniversalTime(),
                    Version     = recordedEvent.EventNumber,
                    DomainEvent = domainEvent
                });

                if (domainObject.CurrentVersion > versionBefore)
                {
                    _logger.LogTrace($"applied event {recordedEvent.EventNumber} / '{recordedEvent.EventType}' to '{identifier}'");
                    appliedEvents.Add(recordedEvent.EventNumber);
                }

                return(true);
            }, startIndex : domainObject.MetaVersion);

            _logger.LogDebug($"applied {appliedEvents.Count} events to '{identifier}': {string.Join(", ", appliedEvents)}");
            return(appliedEvents);
        }