anchor.diff:  import 'dart:convert' show Encoding, utf8;
   import 'dart:io';
   
  -import 'package:quiver/async.dart';
  -
   ///  Converts a [Stream] of byte lists to a [String].
   Future<String> byteStreamToString(Stream<List<int>> stream,
       {Encoding encoding: utf8}) {
  
positive.code: /// into sub-directories based on the return value of [visit].
  ///
  /// [visit] is called with a [File], [Directory] or [Link] to a directory,
  /// never a Symlink to a File. If [visit] returns true, then it's argument is
  /// listed recursively.
  Future visitDirectory(Directory dir, Future<bool> visit(FileSystemEntity f)) {
    var futureGroup = new FutureGroup();
  
    void _list(Directory dir) {
      var completer = new Completer();
      futureGroup.add(completer.future);
      dir.list(followLinks: false).listen((FileSystemEntity entity) {
        var future = visit(entity);
        if (future != null) {
          futureGroup.add(future.then((bool recurse) {
            // recurse on directories, but not cyclic symlinks
            if (entity is! File && recurse == true) {
              if (entity is Link) {
  
negative.code:               _list(entity);
              }
            }
          });
        }
      }, onDone: () {
        directories[dir.path] = true;
        if (directories.values.every((v) => v)) {
          completer.complete();
        }
      }, onError: (e) {
        completer.completeError(e);
      }, cancelOnError: true);
    }
  
    _list(dir);
  
    return completer.future;
  }
  