{
  self,
  lib,
  ...
}: let
  inherit (builtins) attrValues readDir pathExists concatLists;
  inherit (lib) id mapAttrsToList filterAttrs hasPrefix hasSuffix nameValuePair removeSuffix;
  inherit (self.attrs) mapFilterAttrs;
in rec {
  mapModules = dir: fn:
    mapFilterAttrs
    (n: v:
      v
      != null
      && !(hasPrefix "__" n))
    (n: v: let
      path = "${toString dir}/${n}";
    in
      if v == "directory" && pathExists "${path}/default.nix"
      then nameValuePair n (fn path)
      else if
        v
        == "regular"
        && n != "default.nix"
        && hasSuffix ".nix" n
      then nameValuePair (removeSuffix ".nix" n) (fn path)
      else nameValuePair "" null)
    (readDir dir);

  mapModules' = dir: fn:
    attrValues (mapModules dir fn);

  mapModulesRec = dir: fn:
    mapFilterAttrs
    (n: v:
      v
      != null
      && !(hasPrefix "__" n))
    (n: v: let
      path = "${toString dir}/${n}";
    in
      if v == "directory"
      then nameValuePair n (mapModulesRec path fn)
      else if v == "regular" && n != "default.nix" && hasSuffix ".nix" n
      then nameValuePair (removeSuffix ".nix" n) (fn path)
      else nameValuePair "" null)
    (readDir dir);

  mapModulesRec' = dir: fn: let
    dirs =
      mapAttrsToList
      (k: _: "${dir}/${k}")
      (filterAttrs
        (n: v: v == "directory" && !(hasPrefix "__" n))
        # (n: v: v == "directory" && !(hasPrefix "__" n) && !(builtins.elem n))
        (readDir dir));
    files = mapModules' dir id;
    # files = attrValues (mapModules dir id);
    paths = files ++ concatLists (map (d: mapModulesRec' d id) dirs);
  in
    map fn paths;
}
