I'm trying to generate a sequence of slices by recursively reading data from my data source.
let rec read stream startFrom (conn : IEventStoreConnection) =
seq {
let size = 10000
let slice = conn.ReadStreamEventsForwardAsync(stream, startFrom, size, true).Result
Console.WriteLine("Events in slice: " + slice.Events.Count().ToString())
if (slice.IsEndOfStream) then
yield slice
else
yield! read stream (startFrom + 1 * size) conn
}
let slices = read "stream-name" 0 conn
Console.WriteLine("TOTAL slices in sequence: " + (Seq.length slices).ToString());
I was expecting the sequence to contain three items, yet it only seems to return just one, the last one.
Events in slice: 10000
Events in slice: 10000
Events in slice: 4501
TOTAL slices in sequence: 1
Why isn't the result of my recursive call being yielded as well? A scoping thing?
As John already told you, you have to yield the other slices too:
let rec read stream startFrom (conn : IEventStoreConnection) =
seq {
let size = 10000
let slice = conn.ReadStreamEventsForwardAsync(stream, startFrom, size, true).Result
Console.WriteLine("Events in slice: " + slice.Events.Count().ToString())
if (slice.IsEndOfStream)
then
yield slice
else
yield slice // here
yield! read stream (startFrom + 1 * size) conn
}
I think you could clean this a bit up using inner functions:
let read (conn : IEventStoreConnection) stream startFrom =
let size = 10000
let rec loop startFrom =
seq {
let slice = conn.ReadStreamEventsForwardAsync(stream, startFrom, size, true).Result
Console.WriteLine("Events in slice: " + slice.Events.Count().ToString())
if (slice.IsEndOfStream)
then
yield slice
else
yield slice // here
yield! loop (startFrom + 1 * size)
}
loop startFrom
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With