anchor.diff:      readFile
       ;
   
  -  # Returns the type of a path: regular (for file), symlink, or directory
  -  pathType = p: getAttr (baseNameOf p) (readDir (dirOf p));
  -
  -  # Returns true if the path exists and is a directory, false otherwise
  -  pathIsDirectory = p: if pathExists p then (pathType p) == "directory" else false;
  -
  -  # Returns true if the path exists and is a regular file, false otherwise
  -  pathIsRegularFile = p: if pathExists p then (pathType p) == "regular" else false;
  -
  -  # Bring in a path as a source, filtering out all Subversion and CVS
  -  # directories, as well as backup files (*~).
  +  /*
  +    Returns the type of a path: regular (for file), symlink, or directory.
  +  */
  +  pathType = path: getAttr (baseNameOf path) (readDir (dirOf path));
  +
  +  /*
  +    Returns true if the path exists and is a directory, false otherwise.
  +  */
  +  pathIsDirectory = path: if pathExists path then (pathType path) == "directory" else false;
  +
  +  /*
  +    Returns true if the path exists and is a regular file, false otherwise.
  +  */
  +  pathIsRegularFile = path: if pathExists path then (pathType path) == "regular" else false;
  +
  +  /*
  +    A basic filter for `cleanSourceWith` that removes
  +    directories of version control system, backup files (*~)
  +    and some generated files.
  +  */
     cleanSourceFilter = name: type: let baseName = baseNameOf (toString name); in ! (
       # Filter out version control software files/directories
       (baseName == ".git" || type == "directory" && (baseName == ".svn" || baseName == "CVS" || baseName == ".hg")) ||
  
positive.code:     (type == "unknown")
    );
  
    # Filters a source tree removing version control files and directories using cleanSourceWith
    #
    # Example:
    #          cleanSource ./.
    cleanSource = src: cleanSourceWith { filter = cleanSourceFilter; inherit src; };
  
    # Like `builtins.filterSource`, except it will compose with itself,
    # allowing you to chain multiple calls together without any
    # intermediate copies being put in the nix store.
    #
    #     lib.cleanSourceWith {
    #       filter = f;
    #       src = lib.cleanSourceWith {
    #         filter = g;
    #         src = ./.;
    #       };
    #     }
    #     # Succeeds!
    #
    #     builtins.filterSource f (builtins.filterSource g ./.)
    #     # Fails!
    #
    # Parameters:
    #
    #   src:      A path or cleanSourceWith result to filter and/or rename.
    #
    #   filter:   A function (path -> type -> bool)
    #             Optional with default value: constant true (include everything)
    #             The function will be combined with the && operator such
    #             that src.filter is called lazily.
    #             For implementing a filter, see
    #             https://nixos.org/nix/manual/#builtin-filterSource
    #
    #   name:     Optional name to use as part of the store path.
    #             This defaults to `src.name` or otherwise `"source"`.
    #
    cleanSourceWith = { filter ? _path: _type: true, src, name ? null }:
      let
        orig = toSourceAttributes src;
      in fromSourceAttributes {
  
negative.code:         satisfiesSubpathInvariant = src ? satisfiesSubpathInvariant && src.satisfiesSubpathInvariant;
        };
  
    /*
      Filter sources by a list of regular expressions.
  
      Example: src = sourceByRegex ./my-subproject [".*\.py$" "^database.sql$"]
    */
    sourceByRegex = src: regexes:
      let
        isFiltered = src ? _isLibCleanSourceWith;
  