anchor.diff:      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
  
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:     member x.RemoveRef() =
          lock lockObj (fun () -> 
              if Interlocked.Decrement(&refCount) = 0 then
                  destroy x
          )
  
      member x.Update(caller : IAdaptiveObject) =
  