anchor.diff:    /// ```
     static List<String> listFiles({
       String beneath = '',
  -    @required Iterable<String> Function(String) listDir,
  -    @required Ignore Function(String) ignoreForDir,
  -    @required bool Function(String) isDir,
  +    required Iterable<String> Function(String) listDir,
  +    required Ignore? Function(String) ignoreForDir,
  +    required bool Function(String) isDir,
       bool includeDirs = false,
     }) {
       if (beneath.startsWith('/') ||
  
positive.code:   if (first == end) return _IgnoreParseResult.empty(pattern);
  
    var current = first;
    String peekChar() => current >= end ? null : pattern[current];
  
    var expr = '';
  
    // Parses the inside of a [] range. Returns the value as a RegExp character
    // range, or null if the pattern was broken.
    String parseCharacterRange() {
      var characterRange = '';
      var first = true;
      for (;;) {
  
negative.code: /// expects [path] to start with '/'
  ///
  /// If [path] should be matched as a directory, it should end with '/'.
  bool _matchesStack(List<_IgnorePrefixPair?> ignores, String path) {
    // This is optimized by trying the rules in reverse order.
    // If a rule matches, the result is true if the rule is not negative.
    for (final ignorePair in ignores.reversed) {
  