Skip to content

Instantly share code, notes, and snippets.

@ascjones
Created February 12, 2015 12:45
Show Gist options
  • Save ascjones/e0b40eef47d03e5b6647 to your computer and use it in GitHub Desktop.
Save ascjones/e0b40eef47d03e5b6647 to your computer and use it in GitHub Desktop.
Some helpers for recursively reading all events from a stream
public static class EventStoreHelpers
{
public static IEnumerable<T> ReadAllStreamEventsForward<T>(this IEventStoreConnection conn, string streamName, Func<RecordedEvent, T> createEvent, int pageSize)
{
StreamEventsSlice currentSlice;
var nextSliceStart = StreamPosition.Start;
do
{
var task = conn.ReadStreamEventsForwardAsync(streamName, nextSliceStart, pageSize, true); task.Wait();
currentSlice = task.Result;
nextSliceStart = currentSlice.NextEventNumber;
var streamEvents = currentSlice.Events.Select(e =>
{
var evt = createEvent(e.Event);
return evt;
});
foreach (var streamEvent in streamEvents)
yield return streamEvent;
} while (!currentSlice.IsEndOfStream);
}
public async static Task<IEnumerable<T>> ReadAllStreamEventsForwardAsync<T>(this IEventStoreConnection conn, string streamName, Func<RecordedEvent, T> createEvent, int pageSize)
{
StreamEventsSlice currentSlice;
var acc = new List<T>();
var nextSliceStart = StreamPosition.Start;
do
{
currentSlice = await conn.ReadStreamEventsForwardAsync(streamName, nextSliceStart, pageSize, true);
nextSliceStart = currentSlice.NextEventNumber;
var streamEvents = currentSlice.Events.Select(e =>
{
var evt = createEvent(e.Event);
return evt;
});
acc.AddRange(streamEvents);
} while (!currentSlice.IsEndOfStream);
return acc;
}
public static IEnumerable<T> ReadAllStreamEventsBackward<T>(this IEventStoreConnection conn, string streamName, Func<RecordedEvent, T> createEvent, int pageSize, bool resolveLinkTos)
{
StreamEventsSlice currentSlice;
var nextSliceStart = StreamPosition.End;
do
{
var task = conn.ReadStreamEventsBackwardAsync(streamName, nextSliceStart, pageSize, resolveLinkTos); task.Wait();
currentSlice = task.Result;
nextSliceStart = currentSlice.NextEventNumber;
var streamEvents = currentSlice.Events.Select(e =>
{
var evt = createEvent(e.Event);
return evt;
});
foreach (var streamEvent in streamEvents)
yield return streamEvent;
} while (!currentSlice.IsEndOfStream);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment