Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recursive sequence generation

Tags:

.net

recursion

f#

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?

like image 324
JefClaes Avatar asked May 10 '26 06:05

JefClaes


1 Answers

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
like image 151
Random Dev Avatar answered May 12 '26 11:05

Random Dev



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!