lib: Add composeManyExtensions
This commit is contained in:
parent
bacdeffd80
commit
c3b35f21f7
@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
let
|
let
|
||||||
|
|
||||||
inherit (import ./fixed-points.nix {}) makeExtensible;
|
inherit (import ./fixed-points.nix { inherit lib; }) makeExtensible;
|
||||||
|
|
||||||
lib = makeExtensible (self: let
|
lib = makeExtensible (self: let
|
||||||
callLibs = file: import file { lib = self; };
|
callLibs = file: import file { lib = self; };
|
||||||
@ -69,7 +69,7 @@ let
|
|||||||
importJSON importTOML warn info showWarnings nixpkgsVersion version mod compare
|
importJSON importTOML warn info showWarnings nixpkgsVersion version mod compare
|
||||||
splitByAndCompare functionArgs setFunctionArgs isFunction toHexString toBaseDigits;
|
splitByAndCompare functionArgs setFunctionArgs isFunction toHexString toBaseDigits;
|
||||||
inherit (self.fixedPoints) fix fix' converge extends composeExtensions
|
inherit (self.fixedPoints) fix fix' converge extends composeExtensions
|
||||||
makeExtensible makeExtensibleWithCustomName;
|
composeManyExtensions makeExtensible makeExtensibleWithCustomName;
|
||||||
inherit (self.attrsets) attrByPath hasAttrByPath setAttrByPath
|
inherit (self.attrsets) attrByPath hasAttrByPath setAttrByPath
|
||||||
getAttrFromPath attrVals attrValues getAttrs catAttrs filterAttrs
|
getAttrFromPath attrVals attrValues getAttrs catAttrs filterAttrs
|
||||||
filterAttrsRecursive foldAttrs collect nameValuePair mapAttrs
|
filterAttrsRecursive foldAttrs collect nameValuePair mapAttrs
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{ ... }:
|
{ lib, ... }:
|
||||||
rec {
|
rec {
|
||||||
# Compute the fixed point of the given function `f`, which is usually an
|
# Compute the fixed point of the given function `f`, which is usually an
|
||||||
# attribute set that expects its final, non-recursive representation as an
|
# attribute set that expects its final, non-recursive representation as an
|
||||||
@ -77,6 +77,15 @@ rec {
|
|||||||
super' = super // fApplied;
|
super' = super // fApplied;
|
||||||
in fApplied // g self super';
|
in fApplied // g self super';
|
||||||
|
|
||||||
|
# Compose several extending functions of the type expected by 'extends' into
|
||||||
|
# one where changes made in preceding functions are made available to
|
||||||
|
# subsequent ones.
|
||||||
|
#
|
||||||
|
# composeManyExtensions : [packageSet -> packageSet -> packageSet] -> packageSet -> packageSet -> packageSet
|
||||||
|
# ^final ^prev ^overrides ^final ^prev ^overrides
|
||||||
|
composeManyExtensions =
|
||||||
|
lib.foldr (x: y: composeExtensions x y) (self: super: {});
|
||||||
|
|
||||||
# Create an overridable, recursive attribute set. For example:
|
# Create an overridable, recursive attribute set. For example:
|
||||||
#
|
#
|
||||||
# nix-repl> obj = makeExtensible (self: { })
|
# nix-repl> obj = makeExtensible (self: { })
|
||||||
|
@ -87,6 +87,26 @@ runTests {
|
|||||||
expected = true;
|
expected = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
testComposeManyExtensions0 = {
|
||||||
|
expr = let obj = makeExtensible (self: { foo = true; });
|
||||||
|
emptyComposition = composeManyExtensions [];
|
||||||
|
composed = obj.extend emptyComposition;
|
||||||
|
in composed.foo;
|
||||||
|
expected = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
testComposeManyExtensions =
|
||||||
|
let f = self: super: { bar = false; baz = true; };
|
||||||
|
g = self: super: { bar = super.baz or false; };
|
||||||
|
h = self: super: { qux = super.bar or false; };
|
||||||
|
obj = makeExtensible (self: { foo = self.qux; });
|
||||||
|
in {
|
||||||
|
expr = let composition = composeManyExtensions [f g h];
|
||||||
|
composed = obj.extend composition;
|
||||||
|
in composed.foo;
|
||||||
|
expected = (obj.extend (composeExtensions f (composeExtensions g h))).foo;
|
||||||
|
};
|
||||||
|
|
||||||
testBitAnd = {
|
testBitAnd = {
|
||||||
expr = (bitAnd 3 10);
|
expr = (bitAnd 3 10);
|
||||||
expected = 2;
|
expected = 2;
|
||||||
|
Loading…
Reference in New Issue
Block a user