{ lib, ... }:

let
  trivial = import ./trivial.nix;
in

trivial // (with trivial; rec {
  recursiveFuse = builtins.foldl' lib.recursiveUpdate { };

  mkImport = root: file:
    let path = mkRel root file; in
    path + (lib.optionalString (!lib.pathIsDirectory path) ".nix");

  mkImports = root: builtins.map (mkImport root);

  getKeys = name: builtins.filter
    (k: k != "")
    (lib.splitString "\n" (builtins.readFile (mkRel ../keys "${name}.keys")));

  /* List version of getKeys */
  getAllKeys = names: builtins.concatLists (builtins.map getKeys names);

  getKeyFiles = builtins.map (compose (n: "${n}.keys") (mkRel ../keys));

  getNodeKeys = node:
    let
      meta = import ../meta;
      names = builtins.foldl'
        (names: group: names ++ meta.members.groups.${group})
        (meta.nodes.${node}.admins ++ [ "/machines/${node}" ])
        (meta.nodes.${node}.adminGroups ++ [ "root" ]);
    in
    getAllKeys names;
})