{ pkgs,
  lib,
  fetchurl,
  buildLinux,
  linuxPackagesFor,
}:

let
  inherit (builtins) elem;
  inherit (lib) recurseIntoAttrs types versions;

  repos = pkgs.callPackage ../repos.nix {};

  linuxPackage =
    { url ? "mirror://kernel/linux/kernel/v${versions.major version}.x/linux-${version}.tar.xz",
      sha256 ? null,
      src ? (fetchurl { inherit url sha256; }),
      version,
      modDirVersion ? (versions.pad 3 version),
      kernelPatches ? [],
      ...
    } @ args: let
      inherit (builtins) removeAttrs;

      args' = {
        inherit src version modDirVersion kernelPatches;
      } // removeAttrs args [ "url" "sha256" ];
      linuxPackage = buildLinux args';
      linuxPackages' = recurseIntoAttrs (linuxPackagesFor linuxPackage);
    in linuxPackages';

  surfacePatches =
    { patchSrc ? (repos.linux-surface + "/patches/${versions.majorMinor version}"),
      version,
      patchFn,
    }: pkgs.callPackage patchFn {
      inherit (lib) kernel;
      inherit version patchSrc;
    };

  versionsOf = version:
    # Provides a list of versions that can be used as an enum option for this full version:
    [ version (versions.majorMinor version) ];

  versionsOfEnum = version:
    # Provide an enum option for versions of this kernel:
    types.enum (versionsOf version);

  isVersionOf = kernelVersion: version:
    # Test if the provided version is considered one of the list of versions from above:
    elem version (versionsOf version);

in {
  inherit linuxPackage repos surfacePatches versionsOf isVersionOf versionsOfEnum;
}