protected override async Task <SelectedSnapshot> LoadAsync(string persistenceId,
                                                                   SnapshotSelectionCriteria criteria)
        {
            if (criteria.Equals(SnapshotSelectionCriteria.None))
            {
                return(null);
            }

            var streamName = GetStreamName(persistenceId);


            if (!criteria.Equals(SnapshotSelectionCriteria.Latest))
            {
                var result = await FindSnapshot(streamName, criteria.MaxSequenceNr, criteria.MaxTimeStamp);

                return(result.Snapshot);
            }

            var slice = await _conn.ReadStreamEventsBackwardAsync(streamName, StreamPosition.End, 1, false);

            if (slice == null || slice.Status != SliceReadStatus.Success || !slice.Events.Any())
            {
                return(null);
            }

            return(slice.Events.Select(_snapshotAdapter.Adapt).First());
        }
        protected override async Task DeleteAsync(string persistenceId, SnapshotSelectionCriteria criteria)
        {
            var streamName = GetStreamName(persistenceId);
            var m          = await _conn.GetStreamMetadataAsync(streamName);

            var streamMetadata = m.StreamMetadata.Copy();


            if (criteria.Equals(SnapshotSelectionCriteria.Latest))
            {
                var slice = await _conn.ReadStreamEventsBackwardAsync(streamName, StreamPosition.End, 1, false);

                if (slice.Events.Any())
                {
                    var @event = slice.Events.First();
                    var highestEventPosition = @event.OriginalEventNumber;
                    streamMetadata = streamMetadata
                                     .SetTruncateBefore(highestEventPosition);
                    await _conn.SetStreamMetadataAsync(streamName, ExpectedVersion.Any, streamMetadata.Build());
                }
            }
            else if (!criteria.Equals(SnapshotSelectionCriteria.None))
            {
                var timestamp = criteria.MaxTimeStamp != DateTime.MinValue ? criteria.MaxTimeStamp : default(DateTime?);

                var result = await FindSnapshot(streamName, criteria.MaxSequenceNr, timestamp);

                if (result.Snapshot == null)
                {
                    return;
                }

                streamMetadata = streamMetadata.SetTruncateBefore(result.EventNumber + 1);
                await _conn.SetStreamMetadataAsync(streamName, ExpectedVersion.Any, streamMetadata.Build());
            }
        }