anchor.diff:      notifyChange(previous, value);
     }
   
  +  /// Listens to the given stream and sets the reference's value to whatever is
  +  /// emitted on the stream.
  +  ///
  +  /// Returns a [Future] that completes when the stream is done, analogous to
  +  /// `StreamController.addStream`.
  +  Future listen(Stream<T> stream) {
  +    _listenSub?.cancel();
  +    _listenSub = stream.listen((v) {
  +      value = v;
  +    });
  +    return _listenSub.asFuture();
  +  }
  +
     @override
     void dispose() {
       super.dispose();
  +    _listenSub?.cancel();
       _value = null;
     }
   }
  
positive.code: 
  /// A read-only 'view' of something. Allows getting the current value and
  /// listening for values and changes.
  abstract class ObservableView<T> extends ChangeAware<T> {
    T get value;
  }
  
  /// A mutable object holder that allows listening on a stream of changes.
  
negative.code: /// Changes to the value using `value=` are added to a broadcast stream. If the
  /// new value is equivalent to the current value, nothing's added to the stream.
  class ObservableReference<T> extends ChangeNotificationProvider<T>
      with ObservableViewMixin<T> {
    static bool _defaultEq(a, b) => a == b;
  
    final EqualsFn _equalsFn;
    StreamSubscription _listenSub;
    T _value;
  
    /// Creates a listenable value holder, starting with the given value.
    /// Optionally takes custom equality function.
  