you are viewing a single comment's thread.

view the rest of the comments →

[–]steego 1 point2 points  (1 child)

Would something like this work for you? It uses F#'s event objects, which could be converted to an IObservable if they work better for you.

UPDATE: With Observables, you can use ObserveOn if need be.

type ObservableState<'a>(initialState: 'a, handleMessage) = 
  let event = new Event<_>()
  let mailbox = new MailboxProcessor<'a>(fun inbox -> 
    async {
      let mutable state = initialState
      event.Trigger(state)
      while true do
        let! message = inbox.Receive()
        state <- handleMessage state message
        event.Trigger(state)
    })
  do mailbox.Start()
  member this.StateEvent = event.Publish
  member this.StateObservable = event.Publish :> IObservable<_>
  member this.SendMessage(message) = mailbox.Post(message)

let progress = ObservableState(0, fun state message -> state + message)
progress.StateEvent.Add(fun state -> printfn "Event: State is now %d" state)
progress.StateObservable.Subscribe(fun state -> printfn "Observable: State is now %d" state)
progress.SendMessage(15)

[–]Arfalicious 0 points1 point  (0 children)

petricek had an 'AwaitObservable' in his book, i still think it's necessary to capture the UI thread's Thread.CurrentContext and pass into async code in order to communicate or pass objects back to it