anchor.diff:  
       member private this.Signal() = dependencies.Signal this |> ignore
   
  -    override this.Finalize() =
  -        (this :> IDisposable).Dispose()
  -        GC.SuppressFinalize this
  -
  -    interface IObservable<'a> with
  -        member __.Subscribe obs = 
  -            dependencies.Add obs
  -            { 
  -                new IDisposable with
  -                    member __.Dispose() = dependencies.Remove obs
  -            }
  -
  -    interface ITracksDependents with
  -        member __.Track dep = dependencies.Add dep
  -        member __.Untrack dep = dependencies.Remove dep
  -
  -    interface IView<'a> with
  -        member __.Value with get() = v
  -
  -    interface IDependent with
  -        member this.RequestRefresh _ =
  -            if handle <> null then
  -                match handle.TryGetTarget() with
  -                | true, provider -> 
  -                    let value = provider.Value                    
  +    member private this.UpdateAndGetValue () =
  +        if handle <> null then
  +            match handle.TryGetTarget() with
  +            | true, provider ->
  +                let value = provider.Value
  +                if not <| EqualityComparer<'a>.Default.Equals(v, value) then
                       v <- value
                       this.Signal()
  -                | false,_ -> ()
  +            | false, _ -> ()
  +        v
  +
  +    override this.Finalize() =
  +        (this :> IDisposable).Dispose()
  +        GC.SuppressFinalize this
  +
  +    interface IObservable<'a> with
  +        member __.Subscribe obs = 
  +            dependencies.Add obs
  +            { 
  +                new IDisposable with
  +                    member __.Dispose() = dependencies.Remove obs
  +            }
  +
  +    interface ITracksDependents with
  +        member __.Track dep = dependencies.Add dep
  +        member __.Untrack dep = dependencies.Remove dep
  +
  +    interface IView<'a> with
  +        member this.Value with get() = this.UpdateAndGetValue()
  +
  +    interface IDependent with
  +        member this.RequestRefresh _ =
  +            this.UpdateAndGetValue()
  +            |> ignore
           member __.HasDependencies with get() = dependencies.HasDependencies
   
       interface IDisposable with
  
positive.code: 
      member private this.Signal() = dependencies.Signal this |> ignore
  
      override this.Finalize() =
          (this :> IDisposable).Dispose()
          GC.SuppressFinalize this
  
      interface IObservable<'a> with
          member __.Subscribe obs = 
              dependencies.Add obs
              { 
                  new IDisposable with
                      member __.Dispose() = dependencies.Remove obs
              }
  
      interface ITracksDependents with
          member __.Track dep = dependencies.Add dep
          member __.Untrack dep = dependencies.Remove dep
  
      interface IView<'a> with
          member __.Value with get() = v
  
      interface IDependent with
          member this.RequestRefresh _ = 
              match valueProvider with
              | None -> ()
              | Some(provider) ->
                  let value = provider.Value
                  if filter(value) then
                      v <- value
                      this.Signal()
          member __.HasDependencies with get() = dependencies.HasDependencies
                  
      interface IDisposable with
  
negative.code:             if handle <> null then
                  match handle.TryGetTarget() with
                  | true, v ->
                      v.Untrack this                    
                      handle <- null
                  | false,_ -> ()
              dependencies.RemoveAll()