Skip to content

Instantly share code, notes, and snippets.

@JaggerJo
Created September 12, 2019 08:26
Show Gist options
  • Save JaggerJo/6c5ef8834ea5af8ab5b8bc2a3353e3c1 to your computer and use it in GitHub Desktop.
Save JaggerJo/6c5ef8834ea5af8ab5b8bc2a3353e3c1 to your computer and use it in GitHub Desktop.
module Observable =
open System
// ('a -> 'b -> unit) -> 'a -> IObservable<'b>
let subscribeWeakly callback target source =
let mutable sub:IDisposable = null
let mutable disposed = false
let wr = new WeakReference<_>(target)
let dispose() =
lock (sub) (fun () ->
if not disposed then sub.Dispose(); disposed <- true)
let callback' x =
let isAlive, target = wr.TryGetTarget()
if isAlive then callback target x else dispose()
sub <- Observable.subscribe callback' source
sub
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment