dots/lib/default.nix

50 lines
1.6 KiB
Nix
Raw Normal View History

# Some of these functions were taken from https://github.com/NixOS/nixpkgs/blob/master/lib/
2024-04-19 22:27:46 -05:00
{
lib ? (import <nixpkgs> { }).lib,
}:
rec {
hasSuffix =
suffix: string:
let
lenSuffix = builtins.stringLength suffix;
lenString = builtins.stringLength string;
2024-04-19 22:27:46 -05:00
in
(lenString >= lenSuffix && (builtins.substring (lenString - lenSuffix) lenString string) == suffix);
recurseDir =
dir:
let
dirContents = builtins.readDir dir;
in
(builtins.concatMap (
dirItem:
2024-03-16 13:01:28 -05:00
let
itemType = builtins.getAttr dirItem dirContents;
itemPath = dir + "/${dirItem}";
2024-04-19 22:27:46 -05:00
in
if itemType == "directory" then (recurseDir itemPath) else [ itemPath ]
) (builtins.attrNames dirContents));
recurseFilesInDir =
dir: suffix: (builtins.filter (file: hasSuffix "${suffix}" file) (recurseDir dir));
recurseFilesInDirs =
dirs: suffix: (builtins.concatMap (dir: (recurseFilesInDir dir "${suffix}")) dirs);
# Full credit to https://stackoverflow.com/questions/54504685/nix-function-to-merge-attributes-records-recursively-and-concatenate-arrays/54505212#54505212
2024-04-19 22:27:46 -05:00
recursiveMerge =
attrList:
let
2024-04-19 22:27:46 -05:00
f =
attrPath:
lib.zipAttrsWith (
n: values:
2024-03-16 13:01:28 -05:00
if lib.tail values == [ ] then
lib.head values
else if lib.all builtins.isList values then
lib.unique (lib.concatLists values)
else if lib.all builtins.isAttrs values then
f (attrPath ++ [ n ]) values
else
2024-04-19 22:27:46 -05:00
lib.last values
);
in
f [ ] attrList;
}