2023-12-07 09:05:24 -06:00
# Some of these functions were taken from https://github.com/NixOS/nixpkgs/blob/master/lib/
2024-01-30 22:07:30 -06:00
{ lib ? ( import <nixpkgs> { } ) . lib }:
2023-12-07 09:05:24 -06:00
rec {
hasSuffix =
suffix :
string :
let
lenSuffix = builtins . stringLength suffix ;
lenString = builtins . stringLength string ;
in
(
lenString >= lenSuffix && ( builtins . substring ( lenString - lenSuffix ) lenString string ) == suffix
) ;
recurseDir = dir :
let
dirContents = builtins . readDir dir ;
in
( builtins . concatMap
( dirItem :
let
itemType = builtins . getAttr dirItem dirContents ;
itemPath = dir + " / ${ dirItem } " ;
in
if itemType == " d i r e c t o r y " 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 ) ;
2024-01-30 22:07:30 -06:00
# Full credit to https://stackoverflow.com/questions/54504685/nix-function-to-merge-attributes-records-recursively-and-concatenate-arrays/54505212#54505212
recursiveMerge = attrList :
let
f = attrPath :
lib . zipAttrsWith ( n : values :
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 lib . last values
) ;
in
f [ ] attrList ;
}