@@ -0,0 +1,45 @@
1+# Architecture of the cleaned-up Haskell packages set in Nixpkgs.
2+
3+# run: rm -f /tmp/test ; nix-build -o /tmp/test ng.nix -A hsemail --show-trace && tree /tmp/test/
4+
5+let
6+
7+ pkgs = import <nixpkgs> {};
8+ lib = pkgs.lib;
9+
10+ inherit (lib) callPackageWith;
11+
12+ fix = f: let tmp = rec { x = f x; }; in tmp.x;
13+
14+ extend = rattrs: f: self: let super = rattrs self; in super // f self super;
15+
16+ hpkgs = self:
17+ let
18+ simplePackage = { name, buildInputs ? [], override, overrideDerivation, deepOverride }: pkgs.stdenv.mkDerivation {
19+ inherit name buildInputs;
20+ phases = ["installPhase"];
21+ installPhase = ''
22+ install -D /dev/null $out/$name
23+ for dir in $buildInputs $nativeBuildInputs $propagatedBuildInputs; do
24+ cp --no-clobber "$dir/"* $out/
25+ done
26+ '';
27+ };
28+
29+ package = f: args: simplePackage (callPackageWith self f args);
30+ in
31+ {
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"; }) {};
37+ };
38+
39+ defaultConfiguration = self: super: { mtl = self.mtl1; };
40+
41+ otherConfiguration = self: super: { };
42+
43+in
44+
45+ fix (extend (extend hpkgs defaultConfiguration) otherConfiguration)