From 60158b4c8193a58683c211c9851ec11c6b7fafa1 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Thu, 23 Dec 2021 04:34:47 +0100 Subject: [PATCH] Update lib overlay --- nixpkgs/overlays/lib/attrsets.nix | 45 ++++++++++++++++++++++++++--- nixpkgs/overlays/lib/default.nix | 13 +++++---- nixpkgs/overlays/lib/lists.nix | 8 ++--- nixpkgs/overlays/lib/strings.nix | 9 +++--- nixpkgs/overlays/lib/termColors.nix | 7 +++-- nixpkgs/overlays/lib/trivial.nix | 7 +++++ 6 files changed, 68 insertions(+), 21 deletions(-) create mode 100644 nixpkgs/overlays/lib/trivial.nix diff --git a/nixpkgs/overlays/lib/attrsets.nix b/nixpkgs/overlays/lib/attrsets.nix index a54acf8..454f1e3 100644 --- a/nixpkgs/overlays/lib/attrsets.nix +++ b/nixpkgs/overlays/lib/attrsets.nix @@ -1,12 +1,49 @@ -self: super: +final: prev: let - inherit (super.lib.attrsets) listToAttrs nameValuePair; - inherit (super.lib.lists) foldr; -in super.lib.attrsets // { + inherit (prev.lib.attrsets) mapAttrs isAttrs filterAttrs listToAttrs nameValuePair attrNames mapAttrsToList; + inherit (prev.lib.lists) foldr imap0 imap1; +in prev.lib.attrsets // rec { # a -> [String] -> AttrSet{a} mapToAttrsWithConst = constant: items: listToAttrs (map (name: nameValuePair name constant) items); # [AttrSet] -> AttrSet concatAttrs = foldr (a: b: a // b) {}; + + # (Int -> String -> a -> a) -> AttrSet -> AttrSet + imap0Attrs = f: set: + listToAttrs (imap0 (i: attr: nameValuePair attr (f i attr set.${attr})) (attrNames set)); + + # (Int -> String -> a -> a) -> AttrSet -> AttrSet + imap1Attrs = f: set: + listToAttrs (imap1 (i: attr: nameValuePair attr (f i attr set.${attr})) (attrNames set)); + + # (Int -> String -> a -> nameValuePair) -> AttrSet -> AttrSet + imap0Attrs' = f: set: + listToAttrs (imap0 (i: attr: f i attr set.${attr}) (attrNames set)); + + # (Int -> String -> a -> nameValuePair) -> AttrSet -> AttrSet + imap1Attrs' = f: set: + listToAttrs (imap1 (i: attr: f i attr set.${attr}) (attrNames set)); + + # AttrSet -> AttrSet + recursivelyFlatten = set: let + shouldRecurse = filterAttrs (n: v: isAttrs v) set; + shouldNotRecurse = filterAttrs (n: v: !(isAttrs v)) set; + recursedAttrs = mapAttrsToList (n: v: recursivelyFlatten v) shouldRecurse; + in + concatAttrs ([shouldNotRecurse] ++ recursedAttrs); + + # Takes in a predicate which decides whether or not to recurse further. (true -> recurse) + # This will let you recurse until you recurse until you hit attrsets with a special meaning + # that you would like to handle after flattening. + # It will also stop at everything other than an attribute set. + # + # (a -> Bool) -> AttrSet -> AttrSet + recursivelyFlattenUntil = pred: set: let + shouldRecurse = filterAttrs (n: v: isAttrs v && !(pred v)) set; + shouldNotRecurse = filterAttrs (n: v: !(isAttrs v) || pred v) set; + recursedAttrs = mapAttrsToList (n: v: recursivelyFlattenUntil pred v) shouldRecurse; + in + concatAttrs ([shouldNotRecurse] ++ recursedAttrs); } diff --git a/nixpkgs/overlays/lib/default.nix b/nixpkgs/overlays/lib/default.nix index 41a2936..3d356bc 100644 --- a/nixpkgs/overlays/lib/default.nix +++ b/nixpkgs/overlays/lib/default.nix @@ -1,9 +1,10 @@ -self: super: +final: prev: { - lib = super.lib // { - attrsets = import ./attrsets.nix self super; - lists = import ./lists.nix self super; - strings = import ./strings.nix self super; - termColors = import ./termColors.nix self super; + lib = prev.lib // { + attrsets = (import ./attrsets.nix) final prev; + lists = (import ./lists.nix) final prev; + strings = (import ./strings.nix) final prev; + termColors = (import ./termColors.nix) final prev; + trivial = (import ./trivial.nix) final prev; }; } diff --git a/nixpkgs/overlays/lib/lists.nix b/nixpkgs/overlays/lib/lists.nix index fb9dfad..f5cd805 100644 --- a/nixpkgs/overlays/lib/lists.nix +++ b/nixpkgs/overlays/lib/lists.nix @@ -1,8 +1,8 @@ -self: super: +final: prev: let - inherit (super.lib.trivial) const; - inherit (super.lib.lists) range any all; -in super.lib.lists // { + inherit (prev.lib.trivial) const; + inherit (prev.lib.lists) range any all; +in prev.lib.lists // { # a -> Int -> [a] repeat = item: times: map (const item) (range 1 times); diff --git a/nixpkgs/overlays/lib/strings.nix b/nixpkgs/overlays/lib/strings.nix index 13d71f8..4891f45 100644 --- a/nixpkgs/overlays/lib/strings.nix +++ b/nixpkgs/overlays/lib/strings.nix @@ -1,8 +1,9 @@ -self: super: +final: prev: let - inherit (self.lib.lists) repeat length; - inherit (super.lib.strings) concatStringsSep replaceStrings splitString; -in super.lib.strings // rec { + inherit (final.lib.lists) repeat length; + inherit (prev.lib.strings) concatStringsSep replaceStrings splitString; + # inherit (final.lib.strings) wrap; +in prev.lib.strings // rec { # String -> [String] lines = splitString "\n"; diff --git a/nixpkgs/overlays/lib/termColors.nix b/nixpkgs/overlays/lib/termColors.nix index 0879ac5..e04c653 100644 --- a/nixpkgs/overlays/lib/termColors.nix +++ b/nixpkgs/overlays/lib/termColors.nix @@ -1,7 +1,8 @@ -self: super: +final: prev: let - inherit (self.lib.strings) wrap; - inherit (super.lib.attrsets) mapAttrs' nameValuePair; + inherit (final.lib.strings) wrap; + inherit (prev.lib.attrsets) mapAttrs' nameValuePair; + # inherit (final.lib.myStuff.termColors) escapeCharacter escapeColor resetCharacter wrapWithColor' colorMappings; in rec { # String escapeCharacter = ""; diff --git a/nixpkgs/overlays/lib/trivial.nix b/nixpkgs/overlays/lib/trivial.nix new file mode 100644 index 0000000..54c53b7 --- /dev/null +++ b/nixpkgs/overlays/lib/trivial.nix @@ -0,0 +1,7 @@ +final: prev: +let +in prev.lib.trivial // { + # a -> b -> Either (a b) + withDefault = default: value: + if (value == null) then default else value; +}