{ pkgs, ... }:

# Using this as a library to define some common utility functions that I often
# reach for.
{
  # A unary function that returns its argument.
  identity = x: x;

  # Create a derivation that creates an executable shell script named `as` that
  # calls the program located at `path`, forwarding all of the arguments.
  wrapNonNixProgram = { path, as }: pkgs.writeShellScriptBin as ''
    exec ${path} "$@"
  '';

  # Expose the buildInputs from a Nix shell to an Emacs buffer. Intended to be
  # called from dir-locals.nix files.
  nixBufferFromShell = path: let
    shell = import path;
  in pkgs.nixBufferBuilders.withPackages shell.buildInputs;
}