about summary refs log tree commit diff
path: root/users/wpcarro/utils
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2021-12-13T22·51+0300
committerVincent Ambo <mail@tazj.in>2021-12-13T23·15+0300
commit019f8fd2113df4c5247c3969c60fd4f0e08f91f7 (patch)
tree76a857f61aa88f62a30e854651e8439db77fd0ea /users/wpcarro/utils
parent464bbcb15c09813172c79820bcf526bb10cf4208 (diff)
parent6123e976928ca3d8d93f0b2006b10b5f659eb74d (diff)
subtree(users/wpcarro): docking briefcase at '24f5a642' r/3226
git-subtree-dir: users/wpcarro
git-subtree-mainline: 464bbcb15c09813172c79820bcf526bb10cf4208
git-subtree-split: 24f5a642af3aa1627bbff977f0a101907a02c69f
Change-Id: I6105b3762b79126b3488359c95978cadb3efa789
Diffstat (limited to 'users/wpcarro/utils')
-rw-r--r--users/wpcarro/utils/README.md8
-rw-r--r--users/wpcarro/utils/builder.nix11
-rw-r--r--users/wpcarro/utils/default.nix14
-rw-r--r--users/wpcarro/utils/fs.nix41
4 files changed, 74 insertions, 0 deletions
diff --git a/users/wpcarro/utils/README.md b/users/wpcarro/utils/README.md
new file mode 100644
index 000000000000..0724dff2a992
--- /dev/null
+++ b/users/wpcarro/utils/README.md
@@ -0,0 +1,8 @@
+# Nix Utils
+
+Nix is useful and well-designed in many cases. Nix's standard library of is not
+a representative example of the value of Nix. I'm hoping to replace some of the
+standard library functions with versions that I find more intuitive and
+ergonomic to consume.
+
+This directcory is where I will host that work.
diff --git a/users/wpcarro/utils/builder.nix b/users/wpcarro/utils/builder.nix
new file mode 100644
index 000000000000..45e783cf0ba8
--- /dev/null
+++ b/users/wpcarro/utils/builder.nix
@@ -0,0 +1,11 @@
+{ pkgs, ... }:
+
+let
+  inherit (pkgs) writeShellScriptBin;
+in {
+  # 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 }: writeShellScriptBin as ''
+    exec ${path} "$@"
+  '';
+}
diff --git a/users/wpcarro/utils/default.nix b/users/wpcarro/utils/default.nix
new file mode 100644
index 000000000000..db01702a1fec
--- /dev/null
+++ b/users/wpcarro/utils/default.nix
@@ -0,0 +1,14 @@
+args@{ pkgs, ... }:
+
+# This top-level module exposes all of my utility functions for Nix. It should
+# be used like:
+# ```nix
+# inherit (briefcase.utils) fs;
+# ```
+
+let
+  builder = import ./builder.nix args;
+  fs      = import ./fs.nix args;
+in {
+  inherit builder fs;
+}
diff --git a/users/wpcarro/utils/fs.nix b/users/wpcarro/utils/fs.nix
new file mode 100644
index 000000000000..6305e705b141
--- /dev/null
+++ b/users/wpcarro/utils/fs.nix
@@ -0,0 +1,41 @@
+{ pkgs, ... }:
+
+# `fs` contains utility functions for working with the filesystem.
+
+let
+  inherit (builtins) attrNames hasAttr map readDir;
+  inherit (pkgs.lib) filterAttrs;
+in {
+  # Returns a list of all of the regular files in `dir`.
+  files = dir:
+    map (name: dir + "/${name}")
+      (attrNames
+        (filterAttrs (_: type: type == "regular") (readDir dir)));
+
+  # Returns a list of all of the directories in `dir`.
+  dirs = dir:
+    map (name: dir + "/${name}")
+      (attrNames
+        (filterAttrs (_: type: type == "directory") (readDir dir)));
+
+  # Returns a list of paths to all of the `name` files starting at `dir`.
+  find = name: dir:
+    if hasAttr name (readDir dir) then
+      [ (dir + name) ] ++ concatMap findAllDefaultNix (dirs dir)
+    else
+      concatMap findAllDefaultNix (dirs dir);
+
+  # Looks for `name` in `dir`; if it cannot find it, it checks the parent
+  # directory.
+  resolve = name: dir:
+    if hasAttr name (readDir dir) then
+      dir + "/${name}"
+    else
+      # This prevents the function from infinitely recursing and eventually
+      # stack overflowing.
+      if (dirOf dir) == dir then
+        null
+      else
+        resolve name (dirOf dir);
+  };
+}