summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--lib/attrsets.nix18
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/attrsets.nix b/lib/attrsets.nix
index 4161fa546c8..70986195ae0 100644
--- a/lib/attrsets.nix
+++ b/lib/attrsets.nix
@@ -438,6 +438,24 @@ rec {
   overrideExisting = old: new:
     old // listToAttrs (map (attr: nameValuePair attr (attrByPath [attr] old.${attr} new)) (attrNames old));
 
+  /* Try given attributes in order. If no attributes are found, return
+     attribute list itself.
+
+     Example:
+       tryAttrs ["a" "b"] { a = 1; b = 2; }
+       => 1
+       tryAttrs ["a" "b"] { c = 3; }
+       => { c = 3; }
+  */
+  tryAttrs = allAttrs: set:
+    let tryAttrs_ = attrs:
+      if attrs == [] then set
+      else
+        (let h = head attrs; in
+         if hasAttr h set then getAttr h set
+         else tryAttrs_ (tail attrs));
+    in tryAttrs_ allAttrs;
+
 
   /*** deprecated stuff ***/