public async Task <IList <IDomainEvent> > GetEventsBySnapshotStreamId(SnapshotEventStreamId snapshotEventStreamId)
        {
            var readSlice = await _connection.ReadStreamEventsBackwardAsync(
                stream : snapshotEventStreamId.SnapshotStreamName,
                start : StreamPosition.End,
                count : 1,
                resolveLinkTos : false);

            var streamEvents = new List <IDomainEvent>();

            if (readSlice.Status != SliceReadStatus.Success)
            {
                return(await GetEventsFromStreamVersion(snapshotEventStreamId.StreamName, MinStreamVersion, snapshotEventStreamId.ResolveLinks));
            }
            else
            {
                var snapShotEvent = readSlice.Events[0];

                var dataAsJson = Encoding.UTF8.GetString(snapShotEvent.Event.Data);
                var snapShot   = JsonConvert.DeserializeObject <Snapshot>(dataAsJson);

                streamEvents.Add(ConvertEventDataToDomainEvent(snapShotEvent));

                var events = await GetEventsFromStreamVersion(snapshotEventStreamId.StreamName, snapShot.SnapshotStreamVersion, snapshotEventStreamId.ResolveLinks);

                streamEvents.AddRange(events);

                return(streamEvents);
            }
        }
        public async Task <StreamWriteResult> SaveSnapshot(SnapshotEventStreamId snapshotEventStreamId, IDomainEvent snapshot)
        {
            var result = await _connection.AppendToStreamAsync(
                snapshotEventStreamId.SnapshotStreamName,
                ExpectedVersion.Any,
                new[] { ToEventData(Guid.NewGuid(), snapshot) });

            return(new StreamWriteResult(result.NextExpectedVersion));
        }