anchor.diff:                  let added = HashSet()
                   for k in PSet.toSeq keys do
                       let id = Unique.id k
  -                    let v = cache.GetOrCreate(k, create)
  +                    let hasReused = true
  +                    let v = cache.GetOrCreate(k, create, update)
                       if not (removed.Remove v) then 
                           added.Add v |> ignore
   
  
positive.code:     do for e in initial do
          let id = Unique.id e
          let mutable isNew = false
          let v = cache.GetOrCreate(e, fun k -> isNew <- true; create k)
          if not (content.Add v) then
              update(v,e)
  
  
negative.code: type IReuseCache =
      interface end
  
  type ReuseCache<'v>() =
      let store = ConditionalWeakTable<Id, ref<'v>>()
      
      interface IReuseCache
  
      member x.GetOrCreate(k : 'k, create : 'k -> 'v, update : 'v * 'k -> unit) =
          let i = Unique.id k
          lock store (fun () ->
              match store.TryGetValue i with
                  | (true, v) -> 
                      let v = !v
                      update (v,k)
                      v
                  | _ -> 
                      let v = create k
                      store.Add(i, ref v)
                      v
          )
  