@@ -0,0 +1,45 @@
1+# Architecture of the cleaned-up Haskell packages set in Nixpkgs.
3+# run: rm -f /tmp/test ; nix-build -o /tmp/test ng.nix -A hsemail --show-trace && tree /tmp/test/
7+ pkgs = import <nixpkgs> {};
10+ inherit (lib) callPackageWith;
12+ fix = f: let tmp = rec { x = f x; }; in tmp.x;
14+ extend = rattrs: f: self: let super = rattrs self; in super // f self super;
18+ simplePackage = { name, buildInputs ? [], override, overrideDerivation, deepOverride }: pkgs.stdenv.mkDerivation {
19+ inherit name buildInputs;
20+ phases = ["installPhase"];
22+ install -D /dev/null $out/$name
23+ for dir in $buildInputs $nativeBuildInputs $propagatedBuildInputs; do
24+ cp --no-clobber "$dir/"* $out/
29+ package = f: args: simplePackage (callPackageWith self f args);
32+ hsemail = package ({ mtl, parsec } : { name = "hsemail-0"; buildInputs = [mtl parsec]; }) { mtl = self.mtl2; };
33+ mtl1 = package ({ transformers } : { name = "mtl-1"; buildInputs = [transformers]; }) {};
34+ mtl2 = package ({ transformers } : { name = "mtl-2"; buildInputs = [transformers]; }) {};
35+ parsec = package ({ mtl } : { name = "parsec-0"; buildInputs = [mtl]; }) {};
36+ transformers = package ({} : { name = "transformers-0"; }) {};
39+ defaultConfiguration = self: super: { mtl = self.mtl1; };
41+ otherConfiguration = self: super: { };
45+ fix (extend (extend hpkgs defaultConfiguration) otherConfiguration)