anchor.diff:                          value, if value <>& null then value.GetType() else fi.FieldType //use the actual type if we can
                       with e ->
                           box e, e.GetType()
  -                if typeof<System.Collections.IEnumerator>.IsAssignableFrom(valueTy) then
  -                    { Custom.Text=pretext valueTy.FSharpName ""; Children=(createResultWatches (value :?> System.Collections.IEnumerator)) }
  -                else
  -                    { Text=pretext valueTy.FSharpName (sprintValue value valueTy); Children=(createChildren value valueTy) })
  -            DataMember({LoadingText=pretext fi.FieldType.FSharpName "Loading..." ; Lazy=delayed })
  +                makeMemberLazyCustomInfo value valueTy pretext)
  +            DataMember({LoadingText=pretext fi.FieldType.FSharpName loadingText ; Lazy=delayed })
   
           let getMethodWatch (mi:MethodInfo) =
               let pretext = sprintf "(M) %s() : %s%s" (getMemberName mi)
  
positive.code: open Microsoft.FSharp.Reflection
  open Swensen.Utils
  
  //how to add icons to tree view: http://msdn.microsoft.com/en-us/library/aa983725(v=vs.71).aspx
  type Root = { Text: string ; Children:seq<Watch> ; Value:obj ; Name: String }
  and Custom = { Text: string ; Children:seq<Watch>}
  and DataMember = { LoadingText: string ; Lazy: Lazy<Custom>}
  and CallMember = { InitialText: string ; LoadingText: string ; Lazy: Lazy<Custom>}
  and Watch =
      | Root of Root
  
negative.code:                     let nextResult = createChild pos ie.Current
                      if pos % 100 = 0 && pos <> 0 then
                          let rest = seq { yield nextResult; yield! calcRest (pos+1) ie }
                          yield Custom({Text="Rest" ; Children=rest ; ValueText=None})
                      else
                          yield nextResult;
                          yield! calcRest (pos+1) ie }
              
              seq { yield! calcRest 0 value } //should use "use" when getting enumerator?
  
          //if member is inherited from base type or explicit interface, fully qualify
          let getMemberName (mi:Reflection.MemberInfo) =
              if mi.ReflectedType <> ownerTy then
                  mi.ReflectedType.FSharpName + "." + mi.Name
              else
                  mi.Name
  
          let makeMemberLazyCustomInfo (value:obj) valueTy pretext =
              if typeof<System.Collections.IEnumerator>.IsAssignableFrom(valueTy) then
                  { Custom.Text=pretext valueTy.FSharpName ""; Children=(createResultWatches (value :?> System.Collections.IEnumerator)) ; ValueText=None }
              else
                  let valueText = sprintValue value valueTy
                  { Text=pretext valueTy.FSharpName (" = " + valueText); Children=(createChildren value valueTy) ; ValueText=Some(valueText) }
  
          let loadingText = " = Loading..."
  
          let getPropertyWatch (pi:PropertyInfo) =
              let pretext = sprintf "(P) %s : %s%s" (getMemberName pi)
              let delayed = lazy(
                  let value, valueTy =
                      try
  