diff --git a/lib/default.nix b/lib/default.nix new file mode 100644 index 0000000..024f465 --- /dev/null +++ b/lib/default.nix @@ -0,0 +1,20 @@ +{ lib, ... }: + +let + trivial = import ./trivial.nix; +in + +trivial // (with trivial; rec { + 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 (../keys + "/${name}.keys"))); + + /* List version of getKeys */ + getAllKeys = names: builtins.concatLists (builtins.map getKeys names); + + getKeyFiles = builtins.map (compose (n: "${n}.keys") (mkRel ../keys)); +}) diff --git a/lib/trivial.nix b/lib/trivial.nix new file mode 100644 index 0000000..f9952d0 --- /dev/null +++ b/lib/trivial.nix @@ -0,0 +1,39 @@ +rec { + /* Fuses a list of attribute sets into a single attribute set. + + Example: + x = [ { a = 1; } { b = 2; } ] + fuseAttrs x + => { a = 1; b = 2; } + */ + fuseAttrs = builtins.foldl' (attrs: x: attrs // x) { }; + + /* Maps then fuses a list of attribute sets into a single attribute set. + + Example: + x = [ "a" "b" ] + mapFuse (c: { ${c} = 42; }) x + => { a = 42; b = 42; } + */ + mapFuse = f: attrsList: fuseAttrs (builtins.map f attrsList); + + /* Equivalent of lib.singleton but for an attribute set. + + Example: + singleAttr "a" 1 + => { a = 1; } + */ + singleAttr = name: value: { ${name} = value; }; + + mapSingleFuse = f: mapFuse (x: singleAttr x (f x)); + + /* Creates a relative path as a string + + Example: + mkRel /home/test/ "file.txt" + => "/home/test/file.txt" + */ + mkRel = path: file: builtins.toString (path + "/${file}"); + + compose = f: g: (x: g (f x)); +}