anchor.diff:      member x.RemoveRef() =
           lock lockObj (fun () -> 
               if Interlocked.Decrement(&refCount) = 0 then
  -                onDispose.OnNext()
  -                x.Destroy handle.Value
  -                current <- None
  -                info <- ResourceInfo.Zero
  -                transact (fun () -> 
  -                    x.MarkOutdated()
  -                    handle.Value <- Unchecked.defaultof<_>
  -                )
  +                destroy x
           )
   
       member x.Update(caller : IAdaptiveObject) =
  
positive.code:     member x.ForceDispose() =
          lock lockObj (fun () -> 
              if Interlocked.Exchange(&refCount, 0) <> 0 then
                  onDispose.OnNext()
                  x.Destroy handle.Value
                  current <- None
                  info <- ResourceInfo.Zero
                  transact (fun () -> 
                      x.MarkOutdated()
                      handle.Value <- Unchecked.defaultof<_>
                  )
          )
  
      interface IDisposable with
  
negative.code:     let mutable info = ResourceInfo.Zero
      let lockObj = obj()
  
      let destroy(x : Resource<_>) =
          onDispose.OnNext()
          x.Destroy handle.Value
          current <- None
          info <- ResourceInfo.Zero
  
          lock x (fun () ->
              let mutable foo = 0
              x.Outputs.Consume(&foo) |> ignore
              x.OutOfDate <- true
              handle.UnsafeCache <- Unchecked.defaultof<_>
          )
  
      abstract member Create : Option<'h> -> 'h * FrameStatistics
      abstract member Destroy : 'h -> unit
      abstract member GetInfo : 'h -> ResourceInfo
  