1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
let
  f1 = x: x;
  f2 = x: x;

  inf = let f = n: if n == 0 then 1.0 else 10 * f (n - 1); in f 1000;
  nan = inf * 0;

  # all of these sets and lists are assumed to have different *addresses* as long as CSE does not occur
  sets = rec {
    set1 = {
      f = f1;
    };
    set1' = {
      f = f2;
    };
    set2 = {
      f = f1;
    };
    set2' = {
      f = f2;
    };
    bigSet1 = {
      f = f1;
      meow = true;
    };
    bigSet1' = {
      f = f2;
      meow = true;
    };
    bigSet2 = bigSet1 // {
      meow = true;
    };
    bigSet2' = bigSet1' // {
      meow = true;
    };
    bigSet3 = {
      f = f1;
      meow = true;
    };
    bigSet3' = {
      f = f2;
      meow = true;
    };
  };

  lists = rec {
    list1 = [ f1 ];
    list1' = [ f2 ];
    list2 = [ f1 ];
    list2' = [ f2 ];
    bigList1 = [ f1 true ];
    bigList1' = [ f2 true ];
    bigList2 = map (e: if builtins.isBool e then true else e) bigList1;
    bigList2'= map (e: if builtins.isBool e then true else e) bigList1';
    bigList3 = [ f1 true ];
    bigList3' = [ f2 true ];
  };

  nans = rec {
    plain = nan;
    list = [ nan ];
    set = { inherit nan; };
  };

  compareAllPairs = cases:
    let
      names = builtins.attrNames cases;
    in
      builtins.listToAttrs (map
        (n1: {
          name = n1;
          value = builtins.listToAttrs (map
            (n2: { name = n2; value = cases.${n1} == cases.${n2}; })
            names);
        })
        names);

  results = {
    functionsDirect = [
      (f1 == f1)
      (f1 == f2)
      (f2 == f1)
      (f2 == f2)
    ];
    functionsSelected = [
      (sets.set1.f == sets.set1.f)
      (sets.set1.f == sets.set1'.f)
      (sets.set1'.f == sets.set1.f)
      (sets.set1'.f == sets.set1'.f)
    ];
    sets = compareAllPairs sets;
    lists = compareAllPairs lists;
    nans = compareAllPairs nans;
  };
in
builtins.deepSeq results results