I'm using the B-Pipe API to request financial securities data from Bloomberg. Large requests are divided into small groups and returned as PARTIAL_RESPONSE
with the final response being RESPONSE
. The recursive handleSingleEvent
function recurses until a final RESPONSE
is returned by reqEventQueue.NextEvent()
.
My problem is that only the final RESPONSE
group of securities are returned. The intermediate PARTIAL_RESPONSE
groups are not returned by the function. However, these PARTIAL_RESPONSE
groups are received from Bloomberg.
I'm thinking I might need some accumulator parameters or should use something similar to List.collect, but I don't have a clue how to get started.
// list<Request> * EventQueue * Session -> list<list<string>>
let handleEvents (requests: Request list, reqEventQueue: EventQueue, session: Session) =
let rec handleSingleEvent (request: Request) =
try
let eventObj = reqEventQueue.NextEvent()
match eventObj.Type with
| Event.EventType.PARTIAL_RESPONSE ->
processReferenceResponseEvent eventObj
|> makeJson
|> ignore
handleSingleEvent request
| Event.EventType.RESPONSE -> processReferenceResponseEvent eventObj |> makeJson
| _ -> processMiscEvents eventObj |> makeJson
with
| ex -> failwithf "%s" ex.Message
List.map (fun request -> handleSingleEvent request) requests
Update I made edits, but now code seems to enter infinite recursion.
let handleEvents (requests: Request list, reqEventQueue: EventQueue, session: Session) =
let rec handleSingleEvent (request: Request) : seq<list<string>> =
seq {
let eventObj = reqEventQueue.NextEvent()
match eventObj.Type with
| Event.EventType.REQUEST_STATUS -> yield processMiscEvents eventObj |> makeJson
| Event.EventType.ADMIN -> yield processAdminEvent eventObj |> makeJson
| Event.EventType.AUTHORIZATION_STATUS -> yield processAuthEvent eventObj session |> makeJson
| Event.EventType.PARTIAL_RESPONSE ->
yield processReferenceResponseEvent eventObj
|> makeJson
yield! handleSingleEvent request
| Event.EventType.RESPONSE -> yield processReferenceResponseEvent eventObj |> makeJson
| _ -> yield processMiscEvents eventObj |> makeJson
} |> ignore
handleSingleEvent request
List.map (fun request -> handleSingleEvent request) requests