nt/nt/mix/mixture.nix
2026-01-28 10:50:12 +10:00

68 lines
1.5 KiB
Nix

{
this,
nt,
...
}: let
inherit
(this)
mkIncludes
mkSubMods
;
inherit
(nt.parse)
projectOnto
;
in {
newMixture = inputs: modBuilder: let
mkInputs = this: {inherit this;} // inputs;
# parse mixture declaration structure
decl =
modBuilder mixture.private
|> projectOnto
{
includes = {
public = [];
private = [];
protected = [];
};
submods = {
public = [];
private = [];
protected = [];
};
# XXX: TODO: are these needed?
# options = Wrap {};
# config = Wrap {};
};
descendentInputs = mkInputs mixture.protected;
mkMixtureIncludes = layer: mkIncludes decl.includes.${layer} descendentInputs;
mkMixtureSubMods = layer: mkSubMods decl.submods.${layer} descendentInputs;
includes = {
public = mkMixtureIncludes "public";
protected = includes.public // mkMixtureIncludes "protected";
private = includes.protected // mkMixtureIncludes "private";
};
submods = {
public = mkMixtureSubMods "public";
protected = submods.public // mkMixtureSubMods "protected";
private = submods.protected // mkMixtureSubMods "private";
};
# mixture components are ordered based on shadowing
mixture = {
public =
includes.public
// submods.public;
protected =
includes.protected
// submods.protected;
private =
includes.private
// submods.private;
};
in
mixture.public;
}