fake.modules transposition for aspect-oriented Dendritic Nix. with cross-aspect dependencies. Discussions: https://oeiuwq.zulipchat.com/join/nqp26cd4kngon6mo3ncgnuap/ dendrix.oeiuwq.com/Dendritic.html
dendritic nix aspect oriented

allow parametric context-aware aspects at top-level (#14)

authored by oeiuwq.com and committed by

GitHub 1941f184 4cbae79b

+58 -27
+57 -26
checkmate.nix
··· 187 187 aspects."test resolve aspect-chain" = 188 188 let 189 189 flake = mkFlake { 190 - flake.aspects = { 191 - aspectOne = 192 - { aspect, ... }: 193 - { 190 + flake.aspects = 191 + { aspects, ... }: 192 + { 193 + aspectOne = { 194 194 name = "one"; 195 - includes = [ aspect.provides.dos ]; 195 + includes = [ aspects.aspectOne.provides.dos ]; 196 196 classOne.bar = [ "zzz" ]; 197 197 provides.dos = 198 198 { aspect-chain, ... }: 199 199 { 200 200 name = "dos"; 201 - includes = [ aspect.provides.tres ]; 201 + includes = [ aspects.aspectOne.provides.tres ]; 202 202 classOne.bar = map (x: x.name) aspect-chain; 203 203 }; 204 204 ··· 209 209 classOne.bar = [ (lib.last aspect-chain).name ]; 210 210 }; 211 211 }; 212 - }; 212 + }; 213 213 }; 214 214 mod = { 215 215 imports = [ ··· 295 295 ]; 296 296 }; 297 297 298 - aspectTwo = 299 - { aspect, ... }: 300 - { 301 - classOne.bar = [ "2" ]; 302 - includes = [ aspect.provides.three-and-four-and-five ]; 303 - provides = 304 - { provides, ... }: 305 - { 306 - three-and-four-and-five = { 307 - classOne.bar = [ "3" ]; 308 - includes = [ 309 - provides.four 310 - aspects.five 311 - ]; 312 - }; 313 - four = { 314 - classOne.bar = [ "4" ]; 315 - }; 298 + aspectTwo = { 299 + classOne.bar = [ "2" ]; 300 + includes = [ aspects.aspectTwo.provides.three-and-four-and-five ]; 301 + provides = 302 + { provides, ... }: 303 + { 304 + three-and-four-and-five = { 305 + classOne.bar = [ "3" ]; 306 + includes = [ 307 + provides.four 308 + aspects.five 309 + ]; 310 + }; 311 + four = { 312 + classOne.bar = [ "4" ]; 316 313 }; 317 - }; 314 + }; 315 + }; 318 316 319 317 five.classOne.bar = [ "5" ]; 320 318 }; ··· 412 410 }; 413 411 aspectTwo.__functor = 414 412 _aspect: 413 + { message }: 414 + { 415 + classOne.bar = [ message ]; 416 + }; 417 + }; 418 + }; 419 + 420 + expr = (evalMod "classOne" flake.modules.classOne.aspectOne).bar; 421 + expected = [ 422 + "hello" 423 + "from-functor" 424 + ]; 425 + in 426 + { 427 + inherit expr expected; 428 + }; 429 + 430 + aspects."test define top-level context-aware aspect" = 431 + let 432 + flake = mkFlake { 433 + flake.aspects = 434 + { aspects, ... }: 435 + { 436 + aspectOne = { 437 + classOne.bar = [ "should-not-be-present" ]; 438 + includes = [ aspects.aspectTwo ]; 439 + __functor = aspect: { 440 + includes = [ 441 + { classOne.bar = [ "from-functor" ]; } 442 + ] ++ map (f: f { message = "hello"; }) aspect.includes; 443 + }; 444 + }; 445 + aspectTwo = 415 446 { message }: 416 447 { 417 448 classOne.bar = [ message ];
+1 -1
nix/types.nix
··· 5 5 aspectsType = lib.types.submodule ( 6 6 { config, ... }: 7 7 { 8 - freeformType = lib.types.attrsOf aspectSubmodule; 8 + freeformType = lib.types.attrsOf providerType; 9 9 config._module.args.aspects = config; 10 10 } 11 11 );