anchor.diff:      let outputs = WeakSet<IAdaptiveObject>() :> ICollection<_>
       let callbacks = ConcurrentHashSet<unit -> unit>() :> ICollection<_>
   
  +    static let isTopLevel = new System.Threading.ThreadLocal<bool>(fun () -> true)
  +    static let time = AdaptiveObject() :> IAdaptiveObject
  +
  +    static member Time = time
  +
       /// <summary>
       /// utility function for evaluating an object if
       /// it is marked as outOfDate. If the object is actually
  
positive.code:     /// Note that this function takes care of appropriate locking
      /// </summary>
      member x.EvaluateAlways (f : unit -> 'a) =
          lock x (fun () ->
              IncrementalLog.startEvaluate x
              let res = f()
              x.OutOfDate <- false
              IncrementalLog.endEvaluate x
              res
          )
  
  
      member x.Id = id
  
negative.code:     /// Note that this function takes care of appropriate locking
      /// </summary>
      member x.EvaluateIfNeeded (otherwise : 'a) (f : unit -> 'a) =
          let top = isTopLevel.Value
          if top then isTopLevel.Value <- false
  
          let res =
              lock x (fun () ->
                  if x.OutOfDate then
                      IncrementalLog.startEvaluate x
                      let r = f()
                      x.OutOfDate <- false
                      IncrementalLog.endEvaluate x
                      r
                  else
                      otherwise
              )
  
          if top then 
              isTopLevel.Value <- true
              if time.Outputs.Count > 0 then
                  let t = Transaction()
                  for o in time.Outputs do
                      t.Enqueue(o)
                  t.Commit()
  
          res
  
      /// <summary>
      /// utility function for evaluating an object even if it
  