anchor.diff:  
     final _replies = new StreamController<Reply>.broadcast(sync: true);
   
  -  Dialog(this._markup, this._scope, this._speaker, this._target);
  +  Speech(this._markup, this._scope, this._speaker, this._target);
   
     Reply addReply(String markup, {Scope scope: const Always()}) {
       var reply = new Reply(this, markup, scope);
  
positive.code:     return reply;
    }
  
    Stream<Dialog> get _onRemove => _scope.onExit.map((_) => this);
    Stream<Reply> get _onReplyAvailable => _replies.stream;
  }
  
  class Reply {
    final Dialog dialog;
    final String _markup;
    final _uses = new StreamController.broadcast(sync: true);
  
  
negative.code: }
  
  class DialogUi {
    final Dialog _dialogs;
    final Sink<Interaction> _interactions;
  
    DialogUi(this._dialogs, this._interactions);
  
    Stream<UiSpeech> get onAdd =>
        _dialogs._onAddDialog.map((d) => new UiSpeech(d, _interactions));
  }
  
  class UiSpeech {
    final Speech _dialog;
    final Sink<Interaction> _interactions;
  
    UiSpeech(this._dialog, this._interactions);
  
    Stream<UiSpeech> get onRemove => _dialog._onRemove.map((_) => this);
    Stream<UiReply> get onReplyAvailable =>
        _dialog._onReplyAvailable.map((r) => new UiReply(r, _interactions));
  }
  