diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.0.0.1
+
+- Added JSON golden test files to source distribution.
+
 # 0.0.0.0
 
 - Initial release.
diff --git a/golden/MonoidMap (Int,Int) (Dual Text).json b/golden/MonoidMap (Int,Int) (Dual Text).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) (Dual Text).json
@@ -0,0 +1,613 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    7,
+                    12
+                ],
+                "abbaaaaaa"
+            ],
+            [
+                [
+                    8,
+                    10
+                ],
+                "baa"
+            ],
+            [
+                [
+                    11,
+                    -14
+                ],
+                "aa"
+            ],
+            [
+                [
+                    12,
+                    4
+                ],
+                "aaaaaabaaaaadb"
+            ]
+        ],
+        [
+            [
+                [
+                    -9,
+                    -4
+                ],
+                "aba"
+            ],
+            [
+                [
+                    -8,
+                    0
+                ],
+                "caba"
+            ],
+            [
+                [
+                    -7,
+                    -9
+                ],
+                "caaaabaac"
+            ],
+            [
+                [
+                    -2,
+                    -14
+                ],
+                "abaa"
+            ],
+            [
+                [
+                    -2,
+                    12
+                ],
+                "aabcaaaaaaaba"
+            ],
+            [
+                [
+                    2,
+                    -2
+                ],
+                "aaaaaacabaaa"
+            ],
+            [
+                [
+                    2,
+                    1
+                ],
+                "baadaabaacba"
+            ],
+            [
+                [
+                    4,
+                    -6
+                ],
+                "aac"
+            ],
+            [
+                [
+                    5,
+                    -10
+                ],
+                "aaacbaaaa"
+            ],
+            [
+                [
+                    6,
+                    -6
+                ],
+                "a"
+            ],
+            [
+                [
+                    7,
+                    13
+                ],
+                "caa"
+            ],
+            [
+                [
+                    11,
+                    -13
+                ],
+                "aaabaaac"
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -14
+                ],
+                "aaaaaa"
+            ],
+            [
+                [
+                    -13,
+                    -5
+                ],
+                "dabacdaaa"
+            ],
+            [
+                [
+                    -12,
+                    -4
+                ],
+                "aa"
+            ],
+            [
+                [
+                    -11,
+                    -1
+                ],
+                "baabaaaaaabaa"
+            ],
+            [
+                [
+                    -7,
+                    -10
+                ],
+                "a"
+            ],
+            [
+                [
+                    -4,
+                    4
+                ],
+                "aaabaaa"
+            ],
+            [
+                [
+                    1,
+                    -8
+                ],
+                "caa"
+            ],
+            [
+                [
+                    2,
+                    -11
+                ],
+                "abbcca"
+            ],
+            [
+                [
+                    5,
+                    10
+                ],
+                "aaa"
+            ]
+        ],
+        [
+            [
+                [
+                    -6,
+                    -8
+                ],
+                "aaaaa"
+            ],
+            [
+                [
+                    -3,
+                    11
+                ],
+                "a"
+            ],
+            [
+                [
+                    -1,
+                    -5
+                ],
+                "caa"
+            ],
+            [
+                [
+                    3,
+                    -7
+                ],
+                "aaabbaaaaaaaa"
+            ],
+            [
+                [
+                    3,
+                    -4
+                ],
+                "aaaaa"
+            ],
+            [
+                [
+                    6,
+                    9
+                ],
+                "baaabaaabaaac"
+            ],
+            [
+                [
+                    6,
+                    12
+                ],
+                "aababaaa"
+            ],
+            [
+                [
+                    9,
+                    -2
+                ],
+                "bab"
+            ],
+            [
+                [
+                    10,
+                    -4
+                ],
+                "aacaaaaaaaaaaa"
+            ],
+            [
+                [
+                    10,
+                    7
+                ],
+                "a"
+            ],
+            [
+                [
+                    14,
+                    8
+                ],
+                "aaaaaaababc"
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    12
+                ],
+                "aaaaaaaaaa"
+            ],
+            [
+                [
+                    -11,
+                    -11
+                ],
+                "aa"
+            ],
+            [
+                [
+                    -9,
+                    -4
+                ],
+                "dacaa"
+            ],
+            [
+                [
+                    -7,
+                    -10
+                ],
+                "aabaaaaab"
+            ],
+            [
+                [
+                    -6,
+                    12
+                ],
+                "bacaabbaaca"
+            ],
+            [
+                [
+                    5,
+                    -8
+                ],
+                "aaabaaba"
+            ],
+            [
+                [
+                    10,
+                    -13
+                ],
+                "abccabada"
+            ],
+            [
+                [
+                    13,
+                    -6
+                ],
+                "aaaaaaaba"
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -5
+                ],
+                "babaa"
+            ],
+            [
+                [
+                    -14,
+                    7
+                ],
+                "baaaaaaaaabaa"
+            ],
+            [
+                [
+                    -13,
+                    14
+                ],
+                "aaaabaabbabba"
+            ],
+            [
+                [
+                    -12,
+                    -4
+                ],
+                "aaaaa"
+            ],
+            [
+                [
+                    -9,
+                    -2
+                ],
+                "aabba"
+            ],
+            [
+                [
+                    1,
+                    -11
+                ],
+                "babaa"
+            ],
+            [
+                [
+                    4,
+                    -7
+                ],
+                "aaaaaaabaa"
+            ],
+            [
+                [
+                    4,
+                    0
+                ],
+                "caaaaaabaaa"
+            ],
+            [
+                [
+                    6,
+                    11
+                ],
+                "c"
+            ],
+            [
+                [
+                    7,
+                    -11
+                ],
+                "babba"
+            ],
+            [
+                [
+                    12,
+                    -4
+                ],
+                "aaaaaabaa"
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    -3
+                ],
+                "aaaaaaaa"
+            ],
+            [
+                [
+                    -11,
+                    -3
+                ],
+                "aab"
+            ],
+            [
+                [
+                    -10,
+                    -11
+                ],
+                "aaaaaaabaaa"
+            ],
+            [
+                [
+                    -9,
+                    -4
+                ],
+                "aabac"
+            ],
+            [
+                [
+                    -7,
+                    12
+                ],
+                "baaa"
+            ],
+            [
+                [
+                    -4,
+                    -8
+                ],
+                "aadcabaaaabbaa"
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    -1
+                ],
+                "b"
+            ],
+            [
+                [
+                    -10,
+                    -3
+                ],
+                "baabbaaaa"
+            ],
+            [
+                [
+                    -5,
+                    -8
+                ],
+                "a"
+            ],
+            [
+                [
+                    2,
+                    8
+                ],
+                "aa"
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    13
+                ],
+                "a"
+            ],
+            [
+                [
+                    -12,
+                    -13
+                ],
+                "abc"
+            ],
+            [
+                [
+                    -11,
+                    9
+                ],
+                "a"
+            ],
+            [
+                [
+                    -8,
+                    -6
+                ],
+                "aababbd"
+            ],
+            [
+                [
+                    -7,
+                    -7
+                ],
+                "aaaaaaaaaaaa"
+            ],
+            [
+                [
+                    -6,
+                    -9
+                ],
+                "ababaababb"
+            ],
+            [
+                [
+                    7,
+                    -2
+                ],
+                "babaaaaaa"
+            ],
+            [
+                [
+                    8,
+                    7
+                ],
+                "ab"
+            ],
+            [
+                [
+                    8,
+                    10
+                ],
+                "baaa"
+            ],
+            [
+                [
+                    11,
+                    -10
+                ],
+                "aba"
+            ],
+            [
+                [
+                    13,
+                    -10
+                ],
+                "abbaaaaabaaaaa"
+            ],
+            [
+                [
+                    13,
+                    1
+                ],
+                "aaaaaaaaaa"
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -10
+                ],
+                "aaaaadaaca"
+            ],
+            [
+                [
+                    -14,
+                    -8
+                ],
+                "acabaaaa"
+            ],
+            [
+                [
+                    -6,
+                    -11
+                ],
+                "aaabaca"
+            ],
+            [
+                [
+                    5,
+                    12
+                ],
+                "aabaada"
+            ],
+            [
+                [
+                    7,
+                    -12
+                ],
+                "aaaaaaaaaa"
+            ],
+            [
+                [
+                    11,
+                    9
+                ],
+                "cacabaaabaaaaa"
+            ],
+            [
+                [
+                    13,
+                    13
+                ],
+                "abaadaada"
+            ]
+        ]
+    ],
+    "seed": -49794578
+}
diff --git a/golden/MonoidMap (Int,Int) (Dual [Int]).json b/golden/MonoidMap (Int,Int) (Dual [Int]).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) (Dual [Int]).json
@@ -0,0 +1,764 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -13,
+                    3
+                ],
+                [
+                    3
+                ]
+            ],
+            [
+                [
+                    10,
+                    7
+                ],
+                [
+                    10,
+                    -1,
+                    8,
+                    6,
+                    2,
+                    -2
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -4
+                ],
+                [
+                    6
+                ]
+            ],
+            [
+                [
+                    -4,
+                    -8
+                ],
+                [
+                    -1,
+                    -2,
+                    3,
+                    -7,
+                    -10,
+                    -1,
+                    -14,
+                    4,
+                    -4,
+                    -14,
+                    5,
+                    -12
+                ]
+            ],
+            [
+                [
+                    -3,
+                    -9
+                ],
+                [
+                    -1,
+                    12,
+                    6
+                ]
+            ],
+            [
+                [
+                    -1,
+                    12
+                ],
+                [
+                    1,
+                    11,
+                    8,
+                    7,
+                    -10,
+                    -4,
+                    -11,
+                    10,
+                    1,
+                    8,
+                    6,
+                    7,
+                    -7
+                ]
+            ],
+            [
+                [
+                    0,
+                    -8
+                ],
+                [
+                    5,
+                    11,
+                    -2,
+                    -2,
+                    6,
+                    -7,
+                    -9,
+                    3,
+                    8,
+                    2,
+                    -11,
+                    7,
+                    0
+                ]
+            ],
+            [
+                [
+                    4,
+                    10
+                ],
+                [
+                    11,
+                    1,
+                    -14,
+                    12,
+                    13,
+                    11,
+                    -11,
+                    -9,
+                    -14,
+                    6,
+                    8
+                ]
+            ],
+            [
+                [
+                    11,
+                    13
+                ],
+                [
+                    12,
+                    -10,
+                    -3
+                ]
+            ],
+            [
+                [
+                    14,
+                    -2
+                ],
+                [
+                    -2,
+                    -7,
+                    -13,
+                    8,
+                    -10
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    10,
+                    -5
+                ],
+                [
+                    -12,
+                    4,
+                    -11,
+                    4,
+                    6,
+                    -5,
+                    -13,
+                    -8,
+                    1,
+                    5,
+                    -8,
+                    4,
+                    10,
+                    -4
+                ]
+            ],
+            [
+                [
+                    10,
+                    -4
+                ],
+                [
+                    -4,
+                    -8,
+                    -14,
+                    -2,
+                    -13,
+                    -7,
+                    -5,
+                    -4,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -7
+                ],
+                [
+                    -10,
+                    -2,
+                    -13,
+                    -5,
+                    8,
+                    -2,
+                    12
+                ]
+            ],
+            [
+                [
+                    -7,
+                    9
+                ],
+                [
+                    1,
+                    0,
+                    -12,
+                    10,
+                    11,
+                    -5,
+                    4
+                ]
+            ],
+            [
+                [
+                    -6,
+                    4
+                ],
+                [
+                    1,
+                    -12,
+                    -1,
+                    8,
+                    -12,
+                    2,
+                    -6,
+                    10
+                ]
+            ],
+            [
+                [
+                    -2,
+                    4
+                ],
+                [
+                    -13
+                ]
+            ],
+            [
+                [
+                    1,
+                    11
+                ],
+                [
+                    -1,
+                    4,
+                    1,
+                    6,
+                    3,
+                    -4,
+                    -7
+                ]
+            ],
+            [
+                [
+                    2,
+                    -11
+                ],
+                [
+                    9,
+                    -10,
+                    -1
+                ]
+            ],
+            [
+                [
+                    5,
+                    0
+                ],
+                [
+                    12,
+                    -7,
+                    13,
+                    5,
+                    -10,
+                    10,
+                    -6,
+                    14,
+                    -3
+                ]
+            ],
+            [
+                [
+                    8,
+                    -3
+                ],
+                [
+                    13,
+                    -7,
+                    10,
+                    -4,
+                    -11,
+                    -11
+                ]
+            ],
+            [
+                [
+                    9,
+                    -10
+                ],
+                [
+                    12,
+                    -12,
+                    -7,
+                    -14,
+                    11,
+                    14,
+                    11,
+                    7,
+                    12,
+                    14,
+                    -7,
+                    0,
+                    -9
+                ]
+            ],
+            [
+                [
+                    10,
+                    6
+                ],
+                [
+                    -7,
+                    9,
+                    12,
+                    14,
+                    -9,
+                    -2,
+                    10,
+                    -9,
+                    -9,
+                    13
+                ]
+            ],
+            [
+                [
+                    13,
+                    -14
+                ],
+                [
+                    -8,
+                    -5,
+                    -2,
+                    -6
+                ]
+            ],
+            [
+                [
+                    13,
+                    -2
+                ],
+                [
+                    -10
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    12,
+                    13
+                ],
+                [
+                    -1,
+                    7,
+                    14,
+                    3,
+                    5,
+                    -1,
+                    1,
+                    -13,
+                    10,
+                    -11,
+                    8,
+                    -12,
+                    13,
+                    -4
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    -8
+                ],
+                [
+                    14,
+                    -4,
+                    11,
+                    -14,
+                    -10,
+                    8,
+                    1,
+                    -4,
+                    -8,
+                    12,
+                    -8,
+                    14,
+                    -6,
+                    12
+                ]
+            ],
+            [
+                [
+                    -10,
+                    6
+                ],
+                [
+                    14,
+                    -4,
+                    0,
+                    -11,
+                    7,
+                    14,
+                    -3
+                ]
+            ],
+            [
+                [
+                    -8,
+                    -6
+                ],
+                [
+                    7,
+                    14,
+                    12,
+                    9,
+                    13,
+                    6,
+                    11,
+                    1,
+                    -6,
+                    -4,
+                    0,
+                    10,
+                    -13,
+                    4
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -10
+                ],
+                [
+                    11,
+                    -12,
+                    -3,
+                    6,
+                    -6,
+                    -11,
+                    -5,
+                    9,
+                    13,
+                    3,
+                    7,
+                    -7,
+                    4,
+                    1
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -7,
+                    -7
+                ],
+                [
+                    5,
+                    -4,
+                    -2,
+                    -1,
+                    -13,
+                    12,
+                    14,
+                    6,
+                    2
+                ]
+            ],
+            [
+                [
+                    -4,
+                    13
+                ],
+                [
+                    14,
+                    8,
+                    0,
+                    8,
+                    -5,
+                    12,
+                    6,
+                    -11,
+                    -6,
+                    -1,
+                    11,
+                    2,
+                    -14
+                ]
+            ],
+            [
+                [
+                    -3,
+                    10
+                ],
+                [
+                    4,
+                    3,
+                    10,
+                    1,
+                    -13,
+                    1,
+                    -11,
+                    10
+                ]
+            ],
+            [
+                [
+                    7,
+                    -6
+                ],
+                [
+                    -8,
+                    -3,
+                    6,
+                    -6,
+                    -8,
+                    -9,
+                    13,
+                    5,
+                    -10,
+                    -13
+                ]
+            ],
+            [
+                [
+                    10,
+                    2
+                ],
+                [
+                    -13,
+                    4,
+                    -3,
+                    -5,
+                    10,
+                    1,
+                    12,
+                    11
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -9,
+                    -3
+                ],
+                [
+                    14
+                ]
+            ],
+            [
+                [
+                    3,
+                    2
+                ],
+                [
+                    9,
+                    2,
+                    -1,
+                    -2,
+                    9,
+                    2,
+                    0,
+                    -7,
+                    -8,
+                    14,
+                    -1,
+                    -2
+                ]
+            ],
+            [
+                [
+                    4,
+                    -13
+                ],
+                [
+                    13,
+                    -12,
+                    8,
+                    3,
+                    -4
+                ]
+            ],
+            [
+                [
+                    4,
+                    -11
+                ],
+                [
+                    0,
+                    -4,
+                    -7
+                ]
+            ],
+            [
+                [
+                    4,
+                    3
+                ],
+                [
+                    11,
+                    3,
+                    10,
+                    -13,
+                    13
+                ]
+            ],
+            [
+                [
+                    5,
+                    -2
+                ],
+                [
+                    6,
+                    -4,
+                    -14,
+                    -7,
+                    8,
+                    -10
+                ]
+            ],
+            [
+                [
+                    14,
+                    -11
+                ],
+                [
+                    -10,
+                    7,
+                    7,
+                    -12
+                ]
+            ]
+        ],
+        [],
+        [
+            [
+                [
+                    -9,
+                    -8
+                ],
+                [
+                    -14,
+                    1,
+                    -13,
+                    1,
+                    -14,
+                    -13,
+                    10,
+                    4,
+                    0,
+                    13,
+                    9,
+                    0,
+                    14
+                ]
+            ],
+            [
+                [
+                    -8,
+                    -8
+                ],
+                [
+                    -11,
+                    -7,
+                    10
+                ]
+            ],
+            [
+                [
+                    -6,
+                    0
+                ],
+                [
+                    -10,
+                    0,
+                    -13,
+                    7
+                ]
+            ],
+            [
+                [
+                    -1,
+                    4
+                ],
+                [
+                    3,
+                    6
+                ]
+            ],
+            [
+                [
+                    7,
+                    -5
+                ],
+                [
+                    -8,
+                    0,
+                    -3,
+                    2
+                ]
+            ],
+            [
+                [
+                    10,
+                    0
+                ],
+                [
+                    1,
+                    -14,
+                    -3,
+                    3,
+                    -8,
+                    -3,
+                    -12,
+                    6,
+                    5,
+                    8,
+                    12,
+                    6
+                ]
+            ],
+            [
+                [
+                    13,
+                    3
+                ],
+                [
+                    -11,
+                    0,
+                    -14,
+                    10
+                ]
+            ]
+        ]
+    ],
+    "seed": -333481523
+}
diff --git a/golden/MonoidMap (Int,Int) (Dual [Natural]).json b/golden/MonoidMap (Int,Int) (Dual [Natural]).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) (Dual [Natural]).json
@@ -0,0 +1,1263 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -13,
+                    -5
+                ],
+                [
+                    14,
+                    11,
+                    11,
+                    0,
+                    9
+                ]
+            ],
+            [
+                [
+                    -11,
+                    6
+                ],
+                [
+                    1,
+                    13,
+                    14,
+                    3
+                ]
+            ],
+            [
+                [
+                    -9,
+                    -4
+                ],
+                [
+                    9,
+                    14,
+                    12,
+                    11
+                ]
+            ],
+            [
+                [
+                    1,
+                    -7
+                ],
+                [
+                    1,
+                    9,
+                    11,
+                    8,
+                    5,
+                    0,
+                    14,
+                    7,
+                    4,
+                    8,
+                    11
+                ]
+            ],
+            [
+                [
+                    4,
+                    -12
+                ],
+                [
+                    2,
+                    11,
+                    6,
+                    8,
+                    10
+                ]
+            ],
+            [
+                [
+                    7,
+                    8
+                ],
+                [
+                    14,
+                    5,
+                    6,
+                    6,
+                    11,
+                    5,
+                    9
+                ]
+            ],
+            [
+                [
+                    10,
+                    1
+                ],
+                [
+                    12,
+                    6,
+                    0,
+                    11,
+                    0,
+                    1
+                ]
+            ],
+            [
+                [
+                    10,
+                    8
+                ],
+                [
+                    5,
+                    8,
+                    10,
+                    2,
+                    3
+                ]
+            ],
+            [
+                [
+                    11,
+                    -11
+                ],
+                [
+                    1,
+                    1,
+                    6,
+                    0,
+                    4,
+                    6,
+                    13,
+                    12,
+                    3,
+                    9,
+                    8,
+                    8
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    13
+                ],
+                [
+                    2,
+                    5,
+                    12,
+                    2
+                ]
+            ],
+            [
+                [
+                    -9,
+                    -5
+                ],
+                [
+                    5,
+                    12,
+                    6,
+                    1,
+                    2,
+                    12,
+                    8,
+                    2,
+                    4
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -12
+                ],
+                [
+                    1,
+                    1,
+                    1,
+                    0,
+                    7,
+                    12
+                ]
+            ],
+            [
+                [
+                    -1,
+                    -2
+                ],
+                [
+                    12,
+                    10,
+                    6
+                ]
+            ],
+            [
+                [
+                    2,
+                    9
+                ],
+                [
+                    9,
+                    5,
+                    1,
+                    5,
+                    5,
+                    7,
+                    2,
+                    14,
+                    10,
+                    7,
+                    3,
+                    9,
+                    8,
+                    5
+                ]
+            ],
+            [
+                [
+                    3,
+                    0
+                ],
+                [
+                    10,
+                    10,
+                    13,
+                    7,
+                    5,
+                    10,
+                    11,
+                    10,
+                    7,
+                    0,
+                    7,
+                    1,
+                    9,
+                    8
+                ]
+            ],
+            [
+                [
+                    3,
+                    6
+                ],
+                [
+                    11,
+                    5,
+                    7,
+                    10,
+                    8
+                ]
+            ],
+            [
+                [
+                    8,
+                    1
+                ],
+                [
+                    11,
+                    7,
+                    2,
+                    14,
+                    0,
+                    14,
+                    8,
+                    8,
+                    8,
+                    0,
+                    13,
+                    5,
+                    11,
+                    1
+                ]
+            ],
+            [
+                [
+                    12,
+                    14
+                ],
+                [
+                    6,
+                    1,
+                    2,
+                    12,
+                    0,
+                    3,
+                    4,
+                    3,
+                    0,
+                    4,
+                    10,
+                    14,
+                    11,
+                    14
+                ]
+            ],
+            [
+                [
+                    13,
+                    14
+                ],
+                [
+                    11,
+                    7
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    6
+                ],
+                [
+                    6,
+                    0,
+                    13,
+                    12,
+                    7
+                ]
+            ],
+            [
+                [
+                    -11,
+                    8
+                ],
+                [
+                    6,
+                    11,
+                    5
+                ]
+            ],
+            [
+                [
+                    -10,
+                    -1
+                ],
+                [
+                    5,
+                    2
+                ]
+            ],
+            [
+                [
+                    -6,
+                    -2
+                ],
+                [
+                    2
+                ]
+            ],
+            [
+                [
+                    1,
+                    4
+                ],
+                [
+                    2,
+                    9,
+                    4,
+                    9,
+                    1,
+                    2,
+                    13,
+                    7,
+                    6,
+                    11
+                ]
+            ],
+            [
+                [
+                    6,
+                    -1
+                ],
+                [
+                    10,
+                    8,
+                    14,
+                    8,
+                    14,
+                    11,
+                    5,
+                    4,
+                    2,
+                    9,
+                    11,
+                    10,
+                    12,
+                    13
+                ]
+            ],
+            [
+                [
+                    6,
+                    9
+                ],
+                [
+                    7,
+                    4,
+                    10,
+                    6,
+                    9,
+                    10,
+                    14,
+                    3,
+                    2,
+                    13,
+                    14,
+                    6,
+                    14
+                ]
+            ],
+            [
+                [
+                    7,
+                    8
+                ],
+                [
+                    10,
+                    13,
+                    1,
+                    4,
+                    8,
+                    5,
+                    4,
+                    6,
+                    10,
+                    10,
+                    9,
+                    10,
+                    14
+                ]
+            ],
+            [
+                [
+                    8,
+                    12
+                ],
+                [
+                    2,
+                    8,
+                    3,
+                    14,
+                    1,
+                    13,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    11,
+                    -6
+                ],
+                [
+                    13,
+                    0,
+                    8,
+                    14,
+                    3,
+                    0,
+                    13,
+                    7,
+                    11
+                ]
+            ],
+            [
+                [
+                    13,
+                    -10
+                ],
+                [
+                    10,
+                    3,
+                    8,
+                    1,
+                    1,
+                    11,
+                    13,
+                    5,
+                    13,
+                    11,
+                    14
+                ]
+            ],
+            [
+                [
+                    13,
+                    0
+                ],
+                [
+                    0,
+                    3,
+                    0,
+                    10,
+                    1,
+                    5,
+                    0,
+                    0,
+                    14,
+                    3
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -14
+                ],
+                [
+                    0,
+                    7,
+                    8,
+                    12,
+                    14,
+                    5,
+                    14,
+                    9
+                ]
+            ],
+            [
+                [
+                    -13,
+                    -13
+                ],
+                [
+                    4,
+                    7,
+                    9,
+                    7
+                ]
+            ],
+            [
+                [
+                    -10,
+                    -3
+                ],
+                [
+                    5,
+                    2,
+                    4,
+                    1,
+                    6,
+                    7,
+                    6,
+                    14,
+                    4,
+                    11
+                ]
+            ],
+            [
+                [
+                    -3,
+                    -7
+                ],
+                [
+                    0,
+                    11,
+                    5,
+                    0,
+                    11,
+                    3,
+                    2,
+                    5,
+                    9,
+                    6,
+                    9,
+                    1,
+                    2
+                ]
+            ],
+            [
+                [
+                    0,
+                    -7
+                ],
+                [
+                    5,
+                    11,
+                    4,
+                    10,
+                    0,
+                    13,
+                    1
+                ]
+            ],
+            [
+                [
+                    2,
+                    -8
+                ],
+                [
+                    4,
+                    8,
+                    5,
+                    12,
+                    13,
+                    12,
+                    12,
+                    4,
+                    10,
+                    0,
+                    12,
+                    0,
+                    7,
+                    9
+                ]
+            ],
+            [
+                [
+                    5,
+                    0
+                ],
+                [
+                    1,
+                    14,
+                    3,
+                    9,
+                    0,
+                    11,
+                    14,
+                    0,
+                    6,
+                    8,
+                    0
+                ]
+            ],
+            [
+                [
+                    6,
+                    9
+                ],
+                [
+                    10,
+                    4,
+                    8,
+                    3,
+                    5,
+                    12,
+                    9
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    13
+                ],
+                [
+                    9,
+                    13,
+                    11,
+                    8,
+                    0,
+                    7,
+                    11,
+                    6,
+                    8,
+                    0,
+                    12,
+                    6,
+                    4,
+                    12
+                ]
+            ],
+            [
+                [
+                    -7,
+                    7
+                ],
+                [
+                    10,
+                    2,
+                    7
+                ]
+            ],
+            [
+                [
+                    -5,
+                    7
+                ],
+                [
+                    9
+                ]
+            ],
+            [
+                [
+                    -4,
+                    5
+                ],
+                [
+                    3,
+                    13,
+                    5,
+                    5,
+                    13,
+                    11,
+                    0
+                ]
+            ],
+            [
+                [
+                    -3,
+                    3
+                ],
+                [
+                    7,
+                    6
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -14
+                ],
+                [
+                    5,
+                    13,
+                    4,
+                    5
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -1
+                ],
+                [
+                    7,
+                    12,
+                    4,
+                    3,
+                    9,
+                    9,
+                    10,
+                    11,
+                    13,
+                    8,
+                    10,
+                    8,
+                    8,
+                    2
+                ]
+            ],
+            [
+                [
+                    2,
+                    -11
+                ],
+                [
+                    3,
+                    9,
+                    9,
+                    14,
+                    11,
+                    13,
+                    7,
+                    8,
+                    8,
+                    14,
+                    7,
+                    1
+                ]
+            ],
+            [
+                [
+                    3,
+                    -10
+                ],
+                [
+                    9,
+                    6
+                ]
+            ],
+            [
+                [
+                    3,
+                    14
+                ],
+                [
+                    10,
+                    12,
+                    9,
+                    1,
+                    1,
+                    4,
+                    8,
+                    10,
+                    8,
+                    6,
+                    3,
+                    5,
+                    9
+                ]
+            ],
+            [
+                [
+                    13,
+                    -8
+                ],
+                [
+                    7,
+                    8,
+                    4,
+                    4,
+                    12,
+                    0,
+                    6,
+                    7,
+                    10,
+                    7,
+                    10,
+                    11,
+                    6
+                ]
+            ],
+            [
+                [
+                    13,
+                    7
+                ],
+                [
+                    13,
+                    13,
+                    13,
+                    13,
+                    2,
+                    5,
+                    12,
+                    4,
+                    5,
+                    7,
+                    14,
+                    3,
+                    11,
+                    6
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    13,
+                    -13
+                ],
+                [
+                    12,
+                    4,
+                    10
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    11
+                ],
+                [
+                    0,
+                    7,
+                    2,
+                    5,
+                    13,
+                    1,
+                    2,
+                    8,
+                    14,
+                    12,
+                    8
+                ]
+            ],
+            [
+                [
+                    4,
+                    13
+                ],
+                [
+                    13
+                ]
+            ],
+            [
+                [
+                    6,
+                    -11
+                ],
+                [
+                    1,
+                    10,
+                    9,
+                    5,
+                    1,
+                    7,
+                    10
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    -1
+                ],
+                [
+                    10
+                ]
+            ],
+            [
+                [
+                    -8,
+                    14
+                ],
+                [
+                    11,
+                    2,
+                    7,
+                    3,
+                    9,
+                    3,
+                    13
+                ]
+            ],
+            [
+                [
+                    5,
+                    -5
+                ],
+                [
+                    2,
+                    6,
+                    3,
+                    14,
+                    0,
+                    2,
+                    11,
+                    1,
+                    4,
+                    7
+                ]
+            ],
+            [
+                [
+                    9,
+                    8
+                ],
+                [
+                    2,
+                    7,
+                    12,
+                    1,
+                    9,
+                    14,
+                    2,
+                    12,
+                    9,
+                    6,
+                    1,
+                    10,
+                    8
+                ]
+            ],
+            [
+                [
+                    12,
+                    -1
+                ],
+                [
+                    3
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -7
+                ],
+                [
+                    14
+                ]
+            ],
+            [
+                [
+                    -9,
+                    -1
+                ],
+                [
+                    14,
+                    11,
+                    11,
+                    3,
+                    4,
+                    13,
+                    6,
+                    6,
+                    7
+                ]
+            ],
+            [
+                [
+                    -8,
+                    -14
+                ],
+                [
+                    0,
+                    3,
+                    2,
+                    10,
+                    10,
+                    14,
+                    7,
+                    12,
+                    13,
+                    12,
+                    8,
+                    11,
+                    2,
+                    9
+                ]
+            ],
+            [
+                [
+                    -4,
+                    -8
+                ],
+                [
+                    4,
+                    4,
+                    11,
+                    11
+                ]
+            ],
+            [
+                [
+                    -4,
+                    0
+                ],
+                [
+                    10,
+                    4,
+                    9,
+                    5,
+                    7,
+                    12,
+                    8,
+                    10,
+                    13,
+                    1,
+                    2
+                ]
+            ],
+            [
+                [
+                    -1,
+                    -8
+                ],
+                [
+                    9,
+                    12,
+                    0,
+                    1,
+                    8,
+                    11,
+                    1,
+                    9
+                ]
+            ],
+            [
+                [
+                    -1,
+                    12
+                ],
+                [
+                    1,
+                    11,
+                    10,
+                    6,
+                    0,
+                    13,
+                    0,
+                    9,
+                    12
+                ]
+            ],
+            [
+                [
+                    3,
+                    -8
+                ],
+                [
+                    6
+                ]
+            ],
+            [
+                [
+                    4,
+                    14
+                ],
+                [
+                    4,
+                    3,
+                    2,
+                    6,
+                    14,
+                    6,
+                    11,
+                    3,
+                    8,
+                    10,
+                    13,
+                    14,
+                    6,
+                    7
+                ]
+            ],
+            [
+                [
+                    7,
+                    -10
+                ],
+                [
+                    9,
+                    4,
+                    10,
+                    1,
+                    2,
+                    14,
+                    0,
+                    6,
+                    11,
+                    10,
+                    4,
+                    10,
+                    14
+                ]
+            ],
+            [
+                [
+                    8,
+                    3
+                ],
+                [
+                    3,
+                    12,
+                    4,
+                    11,
+                    6
+                ]
+            ],
+            [
+                [
+                    13,
+                    -8
+                ],
+                [
+                    9,
+                    8,
+                    1,
+                    14,
+                    14,
+                    11,
+                    11,
+                    1,
+                    2,
+                    5,
+                    0
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -6,
+                    -10
+                ],
+                [
+                    13,
+                    12,
+                    7,
+                    0,
+                    6
+                ]
+            ],
+            [
+                [
+                    -6,
+                    -7
+                ],
+                [
+                    10,
+                    1,
+                    8,
+                    12,
+                    4,
+                    1,
+                    6,
+                    1,
+                    3,
+                    3,
+                    4
+                ]
+            ],
+            [
+                [
+                    -3,
+                    -13
+                ],
+                [
+                    14,
+                    3,
+                    4,
+                    1,
+                    6,
+                    4,
+                    13,
+                    8,
+                    9
+                ]
+            ],
+            [
+                [
+                    0,
+                    -8
+                ],
+                [
+                    7,
+                    10,
+                    13,
+                    7,
+                    10,
+                    2,
+                    7,
+                    9,
+                    2,
+                    9,
+                    8
+                ]
+            ],
+            [
+                [
+                    5,
+                    0
+                ],
+                [
+                    3,
+                    8,
+                    12,
+                    7,
+                    1,
+                    0,
+                    2
+                ]
+            ],
+            [
+                [
+                    9,
+                    13
+                ],
+                [
+                    5
+                ]
+            ]
+        ]
+    ],
+    "seed": -1135643618
+}
diff --git a/golden/MonoidMap (Int,Int) (MonoidMap (Key 2) (Sum Int)).json b/golden/MonoidMap (Int,Int) (MonoidMap (Key 2) (Sum Int)).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) (MonoidMap (Key 2) (Sum Int)).json
@@ -0,0 +1,725 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -14,
+                    -1
+                ],
+                {
+                    "A": -11,
+                    "B": 2,
+                    "C": -21,
+                    "D": 12
+                }
+            ],
+            [
+                [
+                    -6,
+                    -9
+                ],
+                {
+                    "A": -9,
+                    "B": -7,
+                    "C": -7,
+                    "D": -16
+                }
+            ],
+            [
+                [
+                    -2,
+                    -4
+                ],
+                {
+                    "A": 28,
+                    "B": 2,
+                    "D": 5
+                }
+            ],
+            [
+                [
+                    3,
+                    -11
+                ],
+                {
+                    "A": -27,
+                    "B": -3,
+                    "C": -4,
+                    "D": 24
+                }
+            ],
+            [
+                [
+                    12,
+                    -6
+                ],
+                {
+                    "B": 6,
+                    "C": 8,
+                    "D": -11
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -7,
+                    -6
+                ],
+                {
+                    "B": -5,
+                    "C": 23,
+                    "D": -13
+                }
+            ],
+            [
+                [
+                    -5,
+                    -3
+                ],
+                {
+                    "A": -20,
+                    "B": -32,
+                    "C": -15,
+                    "D": 5
+                }
+            ],
+            [
+                [
+                    -1,
+                    0
+                ],
+                {
+                    "C": -14,
+                    "D": 13
+                }
+            ],
+            [
+                [
+                    8,
+                    10
+                ],
+                {
+                    "A": 14,
+                    "B": -14,
+                    "C": 7,
+                    "D": 13
+                }
+            ],
+            [
+                [
+                    9,
+                    -6
+                ],
+                {
+                    "A": -7,
+                    "B": 5,
+                    "C": 20,
+                    "D": 8
+                }
+            ],
+            [
+                [
+                    9,
+                    2
+                ],
+                {
+                    "A": -4,
+                    "D": 11
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    0
+                ],
+                {
+                    "A": 7,
+                    "B": -6,
+                    "C": -10,
+                    "D": 28
+                }
+            ],
+            [
+                [
+                    -5,
+                    10
+                ],
+                {
+                    "A": 5,
+                    "B": 6,
+                    "C": -6,
+                    "D": 11
+                }
+            ],
+            [
+                [
+                    -5,
+                    11
+                ],
+                {
+                    "A": -7,
+                    "C": 23,
+                    "D": -6
+                }
+            ],
+            [
+                [
+                    -1,
+                    -7
+                ],
+                {
+                    "A": 9,
+                    "B": 1,
+                    "C": 7,
+                    "D": -7
+                }
+            ],
+            [
+                [
+                    0,
+                    6
+                ],
+                {
+                    "A": -10,
+                    "B": 13,
+                    "C": -4,
+                    "D": -9
+                }
+            ],
+            [
+                [
+                    1,
+                    -10
+                ],
+                {
+                    "A": -13,
+                    "B": 4,
+                    "C": -6,
+                    "D": 34
+                }
+            ],
+            [
+                [
+                    1,
+                    -8
+                ],
+                {
+                    "A": 12,
+                    "B": -16,
+                    "C": 32,
+                    "D": 20
+                }
+            ],
+            [
+                [
+                    1,
+                    7
+                ],
+                {
+                    "B": -8,
+                    "C": 7,
+                    "D": 5
+                }
+            ],
+            [
+                [
+                    2,
+                    -4
+                ],
+                {
+                    "A": -8,
+                    "B": -11
+                }
+            ],
+            [
+                [
+                    5,
+                    4
+                ],
+                {
+                    "A": -3,
+                    "C": 16,
+                    "D": 8
+                }
+            ],
+            [
+                [
+                    9,
+                    5
+                ],
+                {
+                    "A": -11,
+                    "B": 1,
+                    "C": -3
+                }
+            ],
+            [
+                [
+                    11,
+                    13
+                ],
+                {
+                    "A": -7,
+                    "B": -17,
+                    "C": -10,
+                    "D": -10
+                }
+            ],
+            [
+                [
+                    14,
+                    -12
+                ],
+                {
+                    "A": 9,
+                    "B": 10,
+                    "C": 9,
+                    "D": 10
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    6
+                ],
+                {
+                    "B": -4,
+                    "C": 17
+                }
+            ],
+            [
+                [
+                    -13,
+                    11
+                ],
+                {
+                    "B": -8,
+                    "D": -7
+                }
+            ],
+            [
+                [
+                    -2,
+                    -2
+                ],
+                {
+                    "A": 4,
+                    "D": 7
+                }
+            ],
+            [
+                [
+                    3,
+                    -4
+                ],
+                {
+                    "A": 9,
+                    "B": -1,
+                    "C": -15,
+                    "D": 34
+                }
+            ],
+            [
+                [
+                    4,
+                    11
+                ],
+                {
+                    "A": 6,
+                    "B": 7,
+                    "C": -9,
+                    "D": 1
+                }
+            ],
+            [
+                [
+                    7,
+                    10
+                ],
+                {
+                    "A": -5,
+                    "B": -12,
+                    "C": 9,
+                    "D": 6
+                }
+            ],
+            [
+                [
+                    12,
+                    -8
+                ],
+                {
+                    "A": -14,
+                    "C": -2,
+                    "D": 3
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -9,
+                    -3
+                ],
+                {
+                    "A": -12,
+                    "B": 3,
+                    "C": 14,
+                    "D": -5
+                }
+            ],
+            [
+                [
+                    2,
+                    -10
+                ],
+                {
+                    "A": 6,
+                    "C": -6
+                }
+            ],
+            [
+                [
+                    6,
+                    10
+                ],
+                {
+                    "A": -2,
+                    "B": 1,
+                    "C": 8,
+                    "D": -18
+                }
+            ],
+            [
+                [
+                    13,
+                    7
+                ],
+                {
+                    "A": -13
+                }
+            ],
+            [
+                [
+                    13,
+                    11
+                ],
+                {
+                    "B": 3,
+                    "D": 3
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -9,
+                    6
+                ],
+                {
+                    "A": -2,
+                    "C": -2,
+                    "D": 17
+                }
+            ],
+            [
+                [
+                    -8,
+                    13
+                ],
+                {
+                    "A": -6,
+                    "B": 21,
+                    "C": 5,
+                    "D": 19
+                }
+            ],
+            [
+                [
+                    -7,
+                    -10
+                ],
+                {
+                    "B": 7,
+                    "D": -22
+                }
+            ],
+            [
+                [
+                    -7,
+                    3
+                ],
+                {
+                    "A": 3,
+                    "B": -3,
+                    "D": 14
+                }
+            ],
+            [
+                [
+                    -6,
+                    13
+                ],
+                {
+                    "C": -13
+                }
+            ],
+            [
+                [
+                    -2,
+                    2
+                ],
+                {
+                    "A": -12,
+                    "B": -7,
+                    "C": -10,
+                    "D": 1
+                }
+            ],
+            [
+                [
+                    2,
+                    -12
+                ],
+                {
+                    "A": 4
+                }
+            ],
+            [
+                [
+                    6,
+                    2
+                ],
+                {
+                    "C": 10
+                }
+            ],
+            [
+                [
+                    7,
+                    5
+                ],
+                {
+                    "A": 3,
+                    "C": -14,
+                    "D": 1
+                }
+            ],
+            [
+                [
+                    9,
+                    6
+                ],
+                {
+                    "A": -5,
+                    "B": 1,
+                    "C": -22
+                }
+            ],
+            [
+                [
+                    9,
+                    8
+                ],
+                {
+                    "A": 12,
+                    "C": 8,
+                    "D": 11
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    13
+                ],
+                {
+                    "A": 13,
+                    "B": -14,
+                    "C": -19,
+                    "D": 23
+                }
+            ],
+            [
+                [
+                    0,
+                    -1
+                ],
+                {
+                    "A": -25,
+                    "B": 15,
+                    "C": -27,
+                    "D": -7
+                }
+            ],
+            [
+                [
+                    14,
+                    -12
+                ],
+                {
+                    "B": -34,
+                    "C": 12,
+                    "D": -7
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    12
+                ],
+                {
+                    "B": 11,
+                    "D": 7
+                }
+            ],
+            [
+                [
+                    -8,
+                    -4
+                ],
+                {
+                    "C": -2,
+                    "D": 10
+                }
+            ],
+            [
+                [
+                    -7,
+                    4
+                ],
+                {
+                    "A": -11,
+                    "B": -26,
+                    "C": -11,
+                    "D": -1
+                }
+            ],
+            [
+                [
+                    -2,
+                    -7
+                ],
+                {
+                    "A": -9,
+                    "D": 6
+                }
+            ],
+            [
+                [
+                    -2,
+                    5
+                ],
+                {
+                    "A": 16,
+                    "B": 7,
+                    "C": 3,
+                    "D": -4
+                }
+            ],
+            [
+                [
+                    0,
+                    -11
+                ],
+                {
+                    "A": -8,
+                    "B": -11,
+                    "C": -4
+                }
+            ],
+            [
+                [
+                    10,
+                    -6
+                ],
+                {
+                    "A": -10,
+                    "B": -12
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -8,
+                    -1
+                ],
+                {
+                    "A": 7,
+                    "B": -4,
+                    "C": -6,
+                    "D": 5
+                }
+            ],
+            [
+                [
+                    -4,
+                    -5
+                ],
+                {
+                    "A": 12,
+                    "B": 8,
+                    "C": 3,
+                    "D": 12
+                }
+            ],
+            [
+                [
+                    0,
+                    13
+                ],
+                {
+                    "A": -4,
+                    "B": -15,
+                    "C": -14
+                }
+            ],
+            [
+                [
+                    3,
+                    5
+                ],
+                {
+                    "A": 9,
+                    "D": -5
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    7,
+                    10
+                ],
+                {
+                    "A": 22,
+                    "B": 15,
+                    "C": -7,
+                    "D": 17
+                }
+            ],
+            [
+                [
+                    14,
+                    7
+                ],
+                {
+                    "A": 11,
+                    "B": 7,
+                    "C": 7,
+                    "D": 12
+                }
+            ]
+        ]
+    ],
+    "seed": 796822681
+}
diff --git a/golden/MonoidMap (Int,Int) (MonoidMap (Key 2) (Sum Natural)).json b/golden/MonoidMap (Int,Int) (MonoidMap (Key 2) (Sum Natural)).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) (MonoidMap (Key 2) (Sum Natural)).json
@@ -0,0 +1,689 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -12,
+                    -7
+                ],
+                {
+                    "A": 23,
+                    "B": 11,
+                    "D": 32
+                }
+            ],
+            [
+                [
+                    -11,
+                    -10
+                ],
+                {
+                    "A": 5,
+                    "B": 8,
+                    "C": 19,
+                    "D": 13
+                }
+            ],
+            [
+                [
+                    -9,
+                    2
+                ],
+                {
+                    "A": 90,
+                    "B": 23,
+                    "C": 22,
+                    "D": 4
+                }
+            ],
+            [
+                [
+                    -5,
+                    -12
+                ],
+                {
+                    "A": 24,
+                    "C": 17
+                }
+            ],
+            [
+                [
+                    -4,
+                    -12
+                ],
+                {
+                    "A": 51,
+                    "B": 12,
+                    "D": 25
+                }
+            ],
+            [
+                [
+                    -4,
+                    -3
+                ],
+                {
+                    "A": 15,
+                    "B": 5,
+                    "C": 9,
+                    "D": 11
+                }
+            ],
+            [
+                [
+                    -2,
+                    1
+                ],
+                {
+                    "C": 10
+                }
+            ],
+            [
+                [
+                    1,
+                    -13
+                ],
+                {
+                    "A": 37,
+                    "C": 35,
+                    "D": 23
+                }
+            ],
+            [
+                [
+                    1,
+                    -12
+                ],
+                {
+                    "A": 3,
+                    "B": 22,
+                    "D": 42
+                }
+            ],
+            [
+                [
+                    5,
+                    -14
+                ],
+                {
+                    "A": 24,
+                    "B": 11,
+                    "C": 13,
+                    "D": 23
+                }
+            ],
+            [
+                [
+                    7,
+                    2
+                ],
+                {
+                    "A": 17,
+                    "B": 19,
+                    "C": 15,
+                    "D": 15
+                }
+            ],
+            [
+                [
+                    12,
+                    8
+                ],
+                {
+                    "A": 35,
+                    "B": 10,
+                    "C": 24,
+                    "D": 9
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    -5
+                ],
+                {
+                    "A": 14,
+                    "B": 11,
+                    "D": 16
+                }
+            ],
+            [
+                [
+                    -9,
+                    14
+                ],
+                {
+                    "A": 6
+                }
+            ],
+            [
+                [
+                    -8,
+                    7
+                ],
+                {
+                    "A": 2,
+                    "B": 1,
+                    "C": 12,
+                    "D": 5
+                }
+            ],
+            [
+                [
+                    -5,
+                    -1
+                ],
+                {
+                    "A": 37,
+                    "B": 46,
+                    "C": 7,
+                    "D": 2
+                }
+            ],
+            [
+                [
+                    -3,
+                    -10
+                ],
+                {
+                    "B": 9,
+                    "C": 6
+                }
+            ],
+            [
+                [
+                    -2,
+                    -5
+                ],
+                {
+                    "A": 22,
+                    "B": 36,
+                    "D": 26
+                }
+            ],
+            [
+                [
+                    3,
+                    14
+                ],
+                {
+                    "A": 4,
+                    "B": 38,
+                    "C": 25
+                }
+            ],
+            [
+                [
+                    5,
+                    6
+                ],
+                {
+                    "A": 37,
+                    "C": 26,
+                    "D": 28
+                }
+            ],
+            [
+                [
+                    6,
+                    -14
+                ],
+                {
+                    "B": 3,
+                    "C": 14,
+                    "D": 1
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -3,
+                    -14
+                ],
+                {
+                    "A": 21,
+                    "B": 13,
+                    "C": 26,
+                    "D": 26
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    12
+                ],
+                {
+                    "A": 13,
+                    "B": 12,
+                    "C": 22,
+                    "D": 35
+                }
+            ],
+            [
+                [
+                    -13,
+                    13
+                ],
+                {
+                    "A": 14,
+                    "B": 10,
+                    "C": 17,
+                    "D": 19
+                }
+            ],
+            [
+                [
+                    -9,
+                    -6
+                ],
+                {
+                    "B": 8,
+                    "D": 17
+                }
+            ],
+            [
+                [
+                    -6,
+                    9
+                ],
+                {
+                    "A": 4,
+                    "B": 11,
+                    "C": 37,
+                    "D": 37
+                }
+            ],
+            [
+                [
+                    0,
+                    0
+                ],
+                {
+                    "A": 10,
+                    "B": 12,
+                    "D": 27
+                }
+            ],
+            [
+                [
+                    7,
+                    14
+                ],
+                {
+                    "B": 19
+                }
+            ],
+            [
+                [
+                    10,
+                    6
+                ],
+                {
+                    "A": 10
+                }
+            ],
+            [
+                [
+                    14,
+                    -12
+                ],
+                {
+                    "C": 13,
+                    "D": 8
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    -3
+                ],
+                {
+                    "A": 32,
+                    "B": 26,
+                    "C": 30,
+                    "D": 18
+                }
+            ],
+            [
+                [
+                    0,
+                    -7
+                ],
+                {
+                    "C": 10
+                }
+            ],
+            [
+                [
+                    4,
+                    0
+                ],
+                {
+                    "A": 13,
+                    "B": 11,
+                    "C": 11,
+                    "D": 12
+                }
+            ],
+            [
+                [
+                    8,
+                    -9
+                ],
+                {
+                    "A": 13,
+                    "C": 8,
+                    "D": 10
+                }
+            ],
+            [
+                [
+                    13,
+                    13
+                ],
+                {
+                    "A": 7,
+                    "B": 14,
+                    "C": 8,
+                    "D": 11
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -6
+                ],
+                {
+                    "C": 12,
+                    "D": 9
+                }
+            ],
+            [
+                [
+                    -4,
+                    13
+                ],
+                {
+                    "A": 16,
+                    "D": 21
+                }
+            ],
+            [
+                [
+                    0,
+                    -8
+                ],
+                {
+                    "A": 47,
+                    "C": 3,
+                    "D": 31
+                }
+            ],
+            [
+                [
+                    3,
+                    9
+                ],
+                {
+                    "A": 23,
+                    "B": 42,
+                    "C": 48
+                }
+            ],
+            [
+                [
+                    5,
+                    -2
+                ],
+                {
+                    "B": 15,
+                    "C": 18,
+                    "D": 11
+                }
+            ],
+            [
+                [
+                    9,
+                    -8
+                ],
+                {
+                    "B": 26,
+                    "C": 2,
+                    "D": 14
+                }
+            ]
+        ],
+        [],
+        [
+            [
+                [
+                    -7,
+                    -5
+                ],
+                {
+                    "A": 10,
+                    "B": 1,
+                    "C": 22,
+                    "D": 21
+                }
+            ],
+            [
+                [
+                    -6,
+                    13
+                ],
+                {
+                    "B": 1,
+                    "C": 7
+                }
+            ],
+            [
+                [
+                    -4,
+                    2
+                ],
+                {
+                    "B": 8,
+                    "C": 25
+                }
+            ],
+            [
+                [
+                    0,
+                    7
+                ],
+                {
+                    "C": 15,
+                    "D": 28
+                }
+            ],
+            [
+                [
+                    3,
+                    13
+                ],
+                {
+                    "B": 12,
+                    "C": 1
+                }
+            ],
+            [
+                [
+                    9,
+                    -9
+                ],
+                {
+                    "A": 32,
+                    "B": 9,
+                    "C": 34,
+                    "D": 20
+                }
+            ],
+            [
+                [
+                    11,
+                    2
+                ],
+                {
+                    "A": 11,
+                    "B": 4,
+                    "C": 2,
+                    "D": 3
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    6
+                ],
+                {
+                    "A": 59,
+                    "B": 24,
+                    "C": 6,
+                    "D": 2
+                }
+            ],
+            [
+                [
+                    -7,
+                    10
+                ],
+                {
+                    "C": 8
+                }
+            ],
+            [
+                [
+                    -3,
+                    -2
+                ],
+                {
+                    "A": 18,
+                    "B": 35,
+                    "C": 29
+                }
+            ],
+            [
+                [
+                    0,
+                    2
+                ],
+                {
+                    "A": 11,
+                    "C": 9
+                }
+            ],
+            [
+                [
+                    6,
+                    9
+                ],
+                {
+                    "A": 17,
+                    "B": 23,
+                    "C": 17,
+                    "D": 25
+                }
+            ],
+            [
+                [
+                    9,
+                    -7
+                ],
+                {
+                    "A": 31,
+                    "C": 34
+                }
+            ],
+            [
+                [
+                    11,
+                    8
+                ],
+                {
+                    "A": 41,
+                    "B": 11,
+                    "C": 38,
+                    "D": 5
+                }
+            ],
+            [
+                [
+                    14,
+                    -3
+                ],
+                {
+                    "A": 13,
+                    "C": 14
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -1
+                ],
+                {
+                    "A": 25,
+                    "B": 7,
+                    "C": 43,
+                    "D": 13
+                }
+            ],
+            [
+                [
+                    -4,
+                    9
+                ],
+                {
+                    "B": 6
+                }
+            ],
+            [
+                [
+                    0,
+                    -6
+                ],
+                {
+                    "A": 12,
+                    "B": 33,
+                    "D": 7
+                }
+            ],
+            [
+                [
+                    12,
+                    6
+                ],
+                {
+                    "A": 2,
+                    "B": 15,
+                    "C": 37,
+                    "D": 12
+                }
+            ],
+            [
+                [
+                    13,
+                    3
+                ],
+                {
+                    "D": 8
+                }
+            ]
+        ]
+    ],
+    "seed": -224011605
+}
diff --git a/golden/MonoidMap (Int,Int) (Product Int).json b/golden/MonoidMap (Int,Int) (Product Int).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) (Product Int).json
@@ -0,0 +1,416 @@
+{
+    "samples": [
+        [],
+        [
+            [
+                [
+                    -3,
+                    -10
+                ],
+                -8
+            ],
+            [
+                [
+                    10,
+                    -12
+                ],
+                8
+            ],
+            [
+                [
+                    14,
+                    2
+                ],
+                -8
+            ],
+            [
+                [
+                    14,
+                    9
+                ],
+                5
+            ]
+        ],
+        [
+            [
+                [
+                    -3,
+                    -1
+                ],
+                0
+            ],
+            [
+                [
+                    4,
+                    -8
+                ],
+                5
+            ],
+            [
+                [
+                    5,
+                    -4
+                ],
+                6
+            ],
+            [
+                [
+                    8,
+                    11
+                ],
+                5
+            ],
+            [
+                [
+                    10,
+                    -12
+                ],
+                -14
+            ],
+            [
+                [
+                    13,
+                    14
+                ],
+                -9
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    7
+                ],
+                -9
+            ],
+            [
+                [
+                    0,
+                    -7
+                ],
+                13
+            ],
+            [
+                [
+                    11,
+                    -5
+                ],
+                13
+            ]
+        ],
+        [
+            [
+                [
+                    -8,
+                    4
+                ],
+                3
+            ],
+            [
+                [
+                    -7,
+                    -13
+                ],
+                -8
+            ],
+            [
+                [
+                    1,
+                    -9
+                ],
+                -6
+            ],
+            [
+                [
+                    3,
+                    -3
+                ],
+                -11
+            ],
+            [
+                [
+                    7,
+                    -2
+                ],
+                6
+            ],
+            [
+                [
+                    9,
+                    -12
+                ],
+                -5
+            ],
+            [
+                [
+                    10,
+                    -3
+                ],
+                -10
+            ],
+            [
+                [
+                    13,
+                    12
+                ],
+                0
+            ],
+            [
+                [
+                    14,
+                    -6
+                ],
+                2
+            ],
+            [
+                [
+                    14,
+                    6
+                ],
+                11
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -11
+                ],
+                0
+            ],
+            [
+                [
+                    -5,
+                    -4
+                ],
+                6
+            ],
+            [
+                [
+                    -4,
+                    -1
+                ],
+                5
+            ],
+            [
+                [
+                    0,
+                    12
+                ],
+                5
+            ],
+            [
+                [
+                    1,
+                    6
+                ],
+                -1
+            ],
+            [
+                [
+                    2,
+                    -14
+                ],
+                -6
+            ],
+            [
+                [
+                    4,
+                    12
+                ],
+                -3
+            ],
+            [
+                [
+                    5,
+                    -14
+                ],
+                10
+            ],
+            [
+                [
+                    9,
+                    -3
+                ],
+                13
+            ],
+            [
+                [
+                    9,
+                    9
+                ],
+                12
+            ],
+            [
+                [
+                    13,
+                    6
+                ],
+                -5
+            ]
+        ],
+        [
+            [
+                [
+                    -8,
+                    9
+                ],
+                7
+            ],
+            [
+                [
+                    4,
+                    0
+                ],
+                -14
+            ]
+        ],
+        [
+            [
+                [
+                    -5,
+                    11
+                ],
+                -5
+            ],
+            [
+                [
+                    -4,
+                    -12
+                ],
+                -7
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -4
+                ],
+                7
+            ],
+            [
+                [
+                    -12,
+                    13
+                ],
+                3
+            ],
+            [
+                [
+                    -11,
+                    1
+                ],
+                6
+            ],
+            [
+                [
+                    -11,
+                    14
+                ],
+                8
+            ],
+            [
+                [
+                    -9,
+                    -5
+                ],
+                -1
+            ],
+            [
+                [
+                    -9,
+                    -1
+                ],
+                0
+            ],
+            [
+                [
+                    -3,
+                    12
+                ],
+                14
+            ],
+            [
+                [
+                    0,
+                    -9
+                ],
+                7
+            ],
+            [
+                [
+                    1,
+                    -14
+                ],
+                -14
+            ],
+            [
+                [
+                    9,
+                    -5
+                ],
+                -13
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    12
+                ],
+                5
+            ],
+            [
+                [
+                    -8,
+                    -5
+                ],
+                5
+            ],
+            [
+                [
+                    -8,
+                    7
+                ],
+                12
+            ],
+            [
+                [
+                    -3,
+                    -11
+                ],
+                14
+            ],
+            [
+                [
+                    0,
+                    -9
+                ],
+                -8
+            ],
+            [
+                [
+                    0,
+                    5
+                ],
+                -6
+            ],
+            [
+                [
+                    9,
+                    -7
+                ],
+                -6
+            ],
+            [
+                [
+                    14,
+                    -6
+                ],
+                33
+            ]
+        ]
+    ],
+    "seed": -1794975766
+}
diff --git a/golden/MonoidMap (Int,Int) (Product Natural).json b/golden/MonoidMap (Int,Int) (Product Natural).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) (Product Natural).json
@@ -0,0 +1,396 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -8,
+                    -8
+                ],
+                5
+            ]
+        ],
+        [
+            [
+                [
+                    10,
+                    -2
+                ],
+                3
+            ],
+            [
+                [
+                    14,
+                    -3
+                ],
+                11
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    -10
+                ],
+                10
+            ],
+            [
+                [
+                    2,
+                    2
+                ],
+                13
+            ],
+            [
+                [
+                    14,
+                    -2
+                ],
+                12
+            ]
+        ],
+        [
+            [
+                [
+                    -3,
+                    -9
+                ],
+                4
+            ],
+            [
+                [
+                    -2,
+                    5
+                ],
+                13
+            ],
+            [
+                [
+                    -1,
+                    6
+                ],
+                10
+            ],
+            [
+                [
+                    4,
+                    -10
+                ],
+                4
+            ],
+            [
+                [
+                    7,
+                    -13
+                ],
+                14
+            ],
+            [
+                [
+                    8,
+                    -3
+                ],
+                7
+            ],
+            [
+                [
+                    9,
+                    -5
+                ],
+                5
+            ],
+            [
+                [
+                    14,
+                    8
+                ],
+                12
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    3
+                ],
+                4
+            ],
+            [
+                [
+                    -12,
+                    -5
+                ],
+                11
+            ],
+            [
+                [
+                    -10,
+                    -3
+                ],
+                6
+            ],
+            [
+                [
+                    -9,
+                    -9
+                ],
+                4
+            ],
+            [
+                [
+                    -6,
+                    1
+                ],
+                10
+            ],
+            [
+                [
+                    -6,
+                    8
+                ],
+                13
+            ],
+            [
+                [
+                    -3,
+                    12
+                ],
+                11
+            ],
+            [
+                [
+                    -2,
+                    -14
+                ],
+                10
+            ],
+            [
+                [
+                    -1,
+                    -3
+                ],
+                12
+            ],
+            [
+                [
+                    0,
+                    4
+                ],
+                7
+            ],
+            [
+                [
+                    1,
+                    6
+                ],
+                12
+            ],
+            [
+                [
+                    7,
+                    6
+                ],
+                2
+            ],
+            [
+                [
+                    14,
+                    -14
+                ],
+                12
+            ]
+        ],
+        [
+            [
+                [
+                    0,
+                    -3
+                ],
+                13
+            ],
+            [
+                [
+                    3,
+                    12
+                ],
+                7
+            ],
+            [
+                [
+                    11,
+                    0
+                ],
+                3
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    -11
+                ],
+                6
+            ],
+            [
+                [
+                    -9,
+                    -8
+                ],
+                4
+            ],
+            [
+                [
+                    -9,
+                    -3
+                ],
+                6
+            ],
+            [
+                [
+                    -3,
+                    7
+                ],
+                11
+            ],
+            [
+                [
+                    -2,
+                    2
+                ],
+                2
+            ],
+            [
+                [
+                    7,
+                    0
+                ],
+                6
+            ],
+            [
+                [
+                    14,
+                    7
+                ],
+                0
+            ],
+            [
+                [
+                    14,
+                    11
+                ],
+                12
+            ]
+        ],
+        [
+            [
+                [
+                    0,
+                    7
+                ],
+                0
+            ],
+            [
+                [
+                    5,
+                    7
+                ],
+                4
+            ],
+            [
+                [
+                    10,
+                    14
+                ],
+                13
+            ],
+            [
+                [
+                    11,
+                    -3
+                ],
+                6
+            ],
+            [
+                [
+                    14,
+                    0
+                ],
+                2
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -6
+                ],
+                4
+            ],
+            [
+                [
+                    -9,
+                    7
+                ],
+                4
+            ],
+            [
+                [
+                    -6,
+                    0
+                ],
+                10
+            ],
+            [
+                [
+                    -4,
+                    4
+                ],
+                9
+            ],
+            [
+                [
+                    5,
+                    8
+                ],
+                7
+            ],
+            [
+                [
+                    9,
+                    -4
+                ],
+                3
+            ]
+        ],
+        [
+            [
+                [
+                    -2,
+                    7
+                ],
+                8
+            ],
+            [
+                [
+                    0,
+                    -6
+                ],
+                3
+            ],
+            [
+                [
+                    3,
+                    -2
+                ],
+                12
+            ],
+            [
+                [
+                    12,
+                    2
+                ],
+                11
+            ]
+        ]
+    ],
+    "seed": 1723569514
+}
diff --git a/golden/MonoidMap (Int,Int) (Set Int).json b/golden/MonoidMap (Int,Int) (Set Int).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) (Set Int).json
@@ -0,0 +1,907 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -14,
+                    14
+                ],
+                [
+                    -9,
+                    -3,
+                    5,
+                    7,
+                    9,
+                    12
+                ]
+            ],
+            [
+                [
+                    -4,
+                    -4
+                ],
+                [
+                    -8,
+                    -3,
+                    13
+                ]
+            ],
+            [
+                [
+                    0,
+                    1
+                ],
+                [
+                    -14,
+                    -13,
+                    -11,
+                    -5,
+                    8,
+                    10
+                ]
+            ],
+            [
+                [
+                    14,
+                    -12
+                ],
+                [
+                    -14,
+                    -7,
+                    -5,
+                    -4,
+                    -3,
+                    6,
+                    11
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    13
+                ],
+                [
+                    -11,
+                    -4,
+                    -3,
+                    11,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -3
+                ],
+                [
+                    -11,
+                    3
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -8,
+                    -5
+                ],
+                [
+                    -11,
+                    -2,
+                    9,
+                    14
+                ]
+            ],
+            [
+                [
+                    -8,
+                    10
+                ],
+                [
+                    -12,
+                    -9,
+                    -7,
+                    -3,
+                    -2,
+                    3,
+                    5,
+                    8,
+                    9,
+                    13
+                ]
+            ],
+            [
+                [
+                    -8,
+                    13
+                ],
+                [
+                    -13,
+                    -12,
+                    -10,
+                    -9,
+                    1,
+                    3,
+                    5
+                ]
+            ],
+            [
+                [
+                    0,
+                    -3
+                ],
+                [
+                    -13,
+                    -9,
+                    -6,
+                    -3,
+                    6,
+                    8,
+                    9
+                ]
+            ],
+            [
+                [
+                    1,
+                    -11
+                ],
+                [
+                    -12,
+                    -9,
+                    -6,
+                    -4,
+                    -3,
+                    0,
+                    1,
+                    2,
+                    3,
+                    11
+                ]
+            ],
+            [
+                [
+                    3,
+                    14
+                ],
+                [
+                    -13,
+                    -9,
+                    -8,
+                    -7,
+                    -5,
+                    -3,
+                    -2,
+                    -1,
+                    1,
+                    10,
+                    11
+                ]
+            ],
+            [
+                [
+                    7,
+                    2
+                ],
+                [
+                    -10,
+                    -8,
+                    -6,
+                    -5
+                ]
+            ],
+            [
+                [
+                    10,
+                    13
+                ],
+                [
+                    -14,
+                    -13,
+                    -7,
+                    7,
+                    8,
+                    10,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    11,
+                    0
+                ],
+                [
+                    6,
+                    8,
+                    12
+                ]
+            ],
+            [
+                [
+                    12,
+                    -12
+                ],
+                [
+                    -7,
+                    -1,
+                    4,
+                    5,
+                    6,
+                    7,
+                    8,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    10
+                ],
+                [
+                    -13,
+                    -7,
+                    0,
+                    3
+                ]
+            ],
+            [
+                [
+                    -10,
+                    -7
+                ],
+                [
+                    -7,
+                    -2,
+                    2
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    12
+                ],
+                [
+                    -14,
+                    -13,
+                    -11,
+                    -7,
+                    -6,
+                    -5,
+                    -2,
+                    -1,
+                    6
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -3
+                ],
+                [
+                    -14,
+                    -9,
+                    -8,
+                    -6,
+                    -3,
+                    -2,
+                    3,
+                    9,
+                    14
+                ]
+            ],
+            [
+                [
+                    12,
+                    0
+                ],
+                [
+                    -11,
+                    -10,
+                    -7,
+                    -5,
+                    6
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -14
+                ],
+                [
+                    -4,
+                    -2,
+                    1,
+                    11,
+                    14
+                ]
+            ],
+            [
+                [
+                    -12,
+                    -5
+                ],
+                [
+                    -5,
+                    0
+                ]
+            ],
+            [
+                [
+                    -11,
+                    2
+                ],
+                [
+                    -13,
+                    -12,
+                    -6,
+                    0,
+                    1,
+                    3,
+                    5,
+                    6,
+                    9,
+                    14
+                ]
+            ],
+            [
+                [
+                    -5,
+                    -6
+                ],
+                [
+                    -9,
+                    -4,
+                    -3,
+                    -2,
+                    1,
+                    4,
+                    10,
+                    12,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -1,
+                    13
+                ],
+                [
+                    -13,
+                    -10,
+                    -5,
+                    -2,
+                    3,
+                    6,
+                    13
+                ]
+            ],
+            [
+                [
+                    0,
+                    -9
+                ],
+                [
+                    -1,
+                    8,
+                    10
+                ]
+            ],
+            [
+                [
+                    0,
+                    0
+                ],
+                [
+                    -14,
+                    -12,
+                    -11,
+                    -10,
+                    -9,
+                    -8,
+                    -6,
+                    1,
+                    8,
+                    9,
+                    13
+                ]
+            ],
+            [
+                [
+                    2,
+                    -13
+                ],
+                [
+                    -14,
+                    -9,
+                    -8,
+                    -7,
+                    -5,
+                    -3,
+                    -2,
+                    0,
+                    8,
+                    10
+                ]
+            ],
+            [
+                [
+                    2,
+                    -12
+                ],
+                [
+                    -11,
+                    0,
+                    10
+                ]
+            ],
+            [
+                [
+                    2,
+                    -2
+                ],
+                [
+                    -13,
+                    -9,
+                    12
+                ]
+            ],
+            [
+                [
+                    2,
+                    2
+                ],
+                [
+                    -14,
+                    -13,
+                    -10,
+                    -6,
+                    0,
+                    1,
+                    4,
+                    5,
+                    9,
+                    13
+                ]
+            ],
+            [
+                [
+                    2,
+                    7
+                ],
+                [
+                    -11,
+                    -6,
+                    -4,
+                    -3,
+                    -2,
+                    10,
+                    11
+                ]
+            ],
+            [
+                [
+                    9,
+                    6
+                ],
+                [
+                    -7,
+                    2,
+                    3,
+                    10,
+                    12
+                ]
+            ],
+            [
+                [
+                    14,
+                    -11
+                ],
+                [
+                    -14,
+                    -7,
+                    1,
+                    7,
+                    9,
+                    11,
+                    12
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    -5
+                ],
+                [
+                    3
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    1,
+                    -8
+                ],
+                [
+                    -13,
+                    -10,
+                    -9,
+                    -5,
+                    -3,
+                    0,
+                    8,
+                    9,
+                    10,
+                    11
+                ]
+            ],
+            [
+                [
+                    5,
+                    0
+                ],
+                [
+                    -14,
+                    -10,
+                    0,
+                    7,
+                    10,
+                    13
+                ]
+            ],
+            [
+                [
+                    6,
+                    -13
+                ],
+                [
+                    -13,
+                    -12,
+                    -9,
+                    -6,
+                    -5,
+                    5,
+                    6,
+                    8,
+                    11,
+                    12,
+                    13
+                ]
+            ],
+            [
+                [
+                    7,
+                    -3
+                ],
+                [
+                    -3,
+                    5,
+                    10
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    13
+                ],
+                [
+                    -13,
+                    -10,
+                    -8,
+                    -6,
+                    -5,
+                    -1,
+                    0,
+                    3,
+                    4,
+                    7,
+                    14
+                ]
+            ],
+            [
+                [
+                    -13,
+                    -11
+                ],
+                [
+                    -12,
+                    -10,
+                    -9,
+                    -5,
+                    6,
+                    8
+                ]
+            ],
+            [
+                [
+                    -4,
+                    -6
+                ],
+                [
+                    -13,
+                    -9,
+                    3,
+                    4,
+                    10,
+                    12
+                ]
+            ],
+            [
+                [
+                    3,
+                    -14
+                ],
+                [
+                    -13,
+                    -9,
+                    -5,
+                    -4,
+                    -2,
+                    2,
+                    5,
+                    6,
+                    7,
+                    9,
+                    10,
+                    13
+                ]
+            ],
+            [
+                [
+                    3,
+                    -7
+                ],
+                [
+                    -12,
+                    -3,
+                    1,
+                    5,
+                    10,
+                    13
+                ]
+            ],
+            [
+                [
+                    5,
+                    -12
+                ],
+                [
+                    -14,
+                    -12,
+                    -7,
+                    -1,
+                    7,
+                    9,
+                    12
+                ]
+            ],
+            [
+                [
+                    5,
+                    5
+                ],
+                [
+                    -9,
+                    -8,
+                    -5,
+                    1,
+                    6,
+                    9,
+                    13
+                ]
+            ],
+            [
+                [
+                    6,
+                    2
+                ],
+                [
+                    -12,
+                    -11,
+                    -8,
+                    -1,
+                    2,
+                    5,
+                    10,
+                    11,
+                    12
+                ]
+            ],
+            [
+                [
+                    10,
+                    7
+                ],
+                [
+                    -12,
+                    -11,
+                    -5,
+                    -4,
+                    -3,
+                    -1,
+                    1,
+                    2,
+                    3,
+                    13
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    -12
+                ],
+                [
+                    -13,
+                    -7,
+                    -5,
+                    4,
+                    7
+                ]
+            ],
+            [
+                [
+                    -9,
+                    5
+                ],
+                [
+                    -14,
+                    -13,
+                    -4,
+                    -1,
+                    0,
+                    6
+                ]
+            ],
+            [
+                [
+                    -7,
+                    -7
+                ],
+                [
+                    -12,
+                    -9,
+                    0,
+                    1,
+                    4,
+                    5,
+                    6,
+                    10,
+                    11,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    -6,
+                    -11
+                ],
+                [
+                    -14,
+                    -10,
+                    -6,
+                    -4,
+                    1,
+                    2,
+                    4,
+                    5
+                ]
+            ],
+            [
+                [
+                    -6,
+                    9
+                ],
+                [
+                    -10,
+                    -9,
+                    -8,
+                    -6,
+                    -4,
+                    5,
+                    6,
+                    7
+                ]
+            ],
+            [
+                [
+                    -4,
+                    10
+                ],
+                [
+                    -14,
+                    -13,
+                    -9,
+                    -7,
+                    -3,
+                    -1,
+                    5,
+                    7,
+                    8
+                ]
+            ],
+            [
+                [
+                    -3,
+                    -3
+                ],
+                [
+                    -10,
+                    -6,
+                    -5,
+                    -4,
+                    4,
+                    5,
+                    6,
+                    9
+                ]
+            ],
+            [
+                [
+                    1,
+                    7
+                ],
+                [
+                    -14,
+                    -10,
+                    -9,
+                    -8,
+                    -4,
+                    0,
+                    6,
+                    7,
+                    10,
+                    11
+                ]
+            ],
+            [
+                [
+                    2,
+                    14
+                ],
+                [
+                    -11,
+                    -10,
+                    -5,
+                    0,
+                    7,
+                    11
+                ]
+            ],
+            [
+                [
+                    11,
+                    -3
+                ],
+                [
+                    -11,
+                    -9,
+                    -8,
+                    -6,
+                    -3,
+                    -2,
+                    0,
+                    1,
+                    14
+                ]
+            ]
+        ]
+    ],
+    "seed": -965854402
+}
diff --git a/golden/MonoidMap (Int,Int) (Set Natural).json b/golden/MonoidMap (Int,Int) (Set Natural).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) (Set Natural).json
@@ -0,0 +1,588 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -7,
+                    7
+                ],
+                [
+                    2,
+                    3,
+                    4,
+                    5,
+                    6,
+                    8,
+                    9,
+                    10,
+                    11,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    8,
+                    -11
+                ],
+                [
+                    0,
+                    1,
+                    6,
+                    13,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    -13
+                ],
+                [
+                    2,
+                    3,
+                    6,
+                    7,
+                    8,
+                    9,
+                    14
+                ]
+            ],
+            [
+                [
+                    -11,
+                    2
+                ],
+                [
+                    5,
+                    8,
+                    11,
+                    13
+                ]
+            ],
+            [
+                [
+                    -9,
+                    8
+                ],
+                [
+                    1,
+                    3,
+                    4,
+                    5,
+                    7,
+                    9,
+                    10,
+                    11
+                ]
+            ],
+            [
+                [
+                    -6,
+                    -8
+                ],
+                [
+                    1,
+                    2,
+                    8,
+                    10
+                ]
+            ],
+            [
+                [
+                    0,
+                    -10
+                ],
+                [
+                    4,
+                    9,
+                    14
+                ]
+            ],
+            [
+                [
+                    1,
+                    2
+                ],
+                [
+                    0,
+                    6,
+                    7,
+                    9,
+                    10,
+                    11,
+                    14
+                ]
+            ],
+            [
+                [
+                    1,
+                    3
+                ],
+                [
+                    0,
+                    10
+                ]
+            ],
+            [
+                [
+                    4,
+                    -7
+                ],
+                [
+                    0,
+                    5,
+                    9,
+                    10,
+                    12,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    4,
+                    8
+                ],
+                [
+                    0,
+                    2,
+                    4,
+                    6,
+                    7,
+                    8,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    12,
+                    0
+                ],
+                [
+                    0,
+                    4,
+                    8,
+                    9,
+                    10,
+                    13
+                ]
+            ]
+        ],
+        [],
+        [
+            [
+                [
+                    -9,
+                    -8
+                ],
+                [
+                    2,
+                    12
+                ]
+            ],
+            [
+                [
+                    -7,
+                    -9
+                ],
+                [
+                    0,
+                    5
+                ]
+            ],
+            [
+                [
+                    -1,
+                    6
+                ],
+                [
+                    0,
+                    9
+                ]
+            ],
+            [
+                [
+                    10,
+                    0
+                ],
+                [
+                    1
+                ]
+            ],
+            [
+                [
+                    12,
+                    -5
+                ],
+                [
+                    3,
+                    4,
+                    7,
+                    8,
+                    9,
+                    11,
+                    12
+                ]
+            ],
+            [
+                [
+                    14,
+                    -4
+                ],
+                [
+                    7
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -9,
+                    -4
+                ],
+                [
+                    0,
+                    2,
+                    3,
+                    4,
+                    6,
+                    8,
+                    9,
+                    11
+                ]
+            ],
+            [
+                [
+                    -8,
+                    -7
+                ],
+                [
+                    0,
+                    1,
+                    3,
+                    4,
+                    6,
+                    9
+                ]
+            ],
+            [
+                [
+                    -7,
+                    -11
+                ],
+                [
+                    5,
+                    7,
+                    8,
+                    9,
+                    10,
+                    11,
+                    14
+                ]
+            ],
+            [
+                [
+                    2,
+                    -2
+                ],
+                [
+                    1,
+                    2,
+                    6,
+                    7,
+                    8,
+                    13
+                ]
+            ],
+            [
+                [
+                    3,
+                    8
+                ],
+                [
+                    1,
+                    2,
+                    3,
+                    5,
+                    8,
+                    11,
+                    14
+                ]
+            ],
+            [
+                [
+                    4,
+                    0
+                ],
+                [
+                    1,
+                    4,
+                    5,
+                    6,
+                    7,
+                    9,
+                    12
+                ]
+            ],
+            [
+                [
+                    7,
+                    0
+                ],
+                [
+                    0,
+                    1,
+                    3,
+                    4,
+                    5,
+                    6,
+                    7,
+                    8,
+                    11,
+                    14
+                ]
+            ],
+            [
+                [
+                    10,
+                    5
+                ],
+                [
+                    6,
+                    11
+                ]
+            ],
+            [
+                [
+                    14,
+                    -14
+                ],
+                [
+                    1,
+                    6,
+                    11
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    -9
+                ],
+                [
+                    0,
+                    3,
+                    4,
+                    6,
+                    8,
+                    9,
+                    10,
+                    13
+                ]
+            ],
+            [
+                [
+                    -11,
+                    -7
+                ],
+                [
+                    1,
+                    2,
+                    4,
+                    5,
+                    8,
+                    10,
+                    11,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    -10,
+                    4
+                ],
+                [
+                    1,
+                    2,
+                    10,
+                    11,
+                    12,
+                    13
+                ]
+            ],
+            [
+                [
+                    -8,
+                    -6
+                ],
+                [
+                    14
+                ]
+            ],
+            [
+                [
+                    -7,
+                    -11
+                ],
+                [
+                    0,
+                    12
+                ]
+            ],
+            [
+                [
+                    -4,
+                    -14
+                ],
+                [
+                    2,
+                    7,
+                    10,
+                    13
+                ]
+            ],
+            [
+                [
+                    -1,
+                    0
+                ],
+                [
+                    3,
+                    4,
+                    8,
+                    10,
+                    14
+                ]
+            ],
+            [
+                [
+                    -1,
+                    9
+                ],
+                [
+                    13
+                ]
+            ],
+            [
+                [
+                    2,
+                    0
+                ],
+                [
+                    1,
+                    2,
+                    3,
+                    7,
+                    9,
+                    12,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    4,
+                    0
+                ],
+                [
+                    2,
+                    5,
+                    6,
+                    9,
+                    12,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    5,
+                    12
+                ],
+                [
+                    2,
+                    3,
+                    4,
+                    8,
+                    9,
+                    10,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    7,
+                    14
+                ],
+                [
+                    1,
+                    2,
+                    4,
+                    9,
+                    10,
+                    11,
+                    12,
+                    13
+                ]
+            ],
+            [
+                [
+                    13,
+                    -5
+                ],
+                [
+                    4,
+                    7,
+                    9,
+                    11,
+                    13,
+                    14
+                ]
+            ]
+        ],
+        [],
+        [
+            [
+                [
+                    -2,
+                    -3
+                ],
+                [
+                    0,
+                    3,
+                    4,
+                    6,
+                    8,
+                    9,
+                    10,
+                    11,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    11,
+                    -1
+                ],
+                [
+                    3,
+                    6,
+                    8,
+                    9,
+                    10
+                ]
+            ]
+        ],
+        [],
+        []
+    ],
+    "seed": -224227343
+}
diff --git a/golden/MonoidMap (Int,Int) (Sum Int).json b/golden/MonoidMap (Int,Int) (Sum Int).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) (Sum Int).json
@@ -0,0 +1,564 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -9,
+                    -6
+                ],
+                8
+            ],
+            [
+                [
+                    -7,
+                    3
+                ],
+                -3
+            ],
+            [
+                [
+                    -6,
+                    7
+                ],
+                4
+            ],
+            [
+                [
+                    11,
+                    1
+                ],
+                -10
+            ],
+            [
+                [
+                    11,
+                    8
+                ],
+                4
+            ],
+            [
+                [
+                    14,
+                    2
+                ],
+                -11
+            ]
+        ],
+        [
+            [
+                [
+                    6,
+                    -9
+                ],
+                -12
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -9
+                ],
+                7
+            ],
+            [
+                [
+                    -8,
+                    -6
+                ],
+                -7
+            ],
+            [
+                [
+                    -6,
+                    14
+                ],
+                3
+            ],
+            [
+                [
+                    -2,
+                    -6
+                ],
+                11
+            ],
+            [
+                [
+                    0,
+                    -10
+                ],
+                9
+            ],
+            [
+                [
+                    0,
+                    14
+                ],
+                8
+            ],
+            [
+                [
+                    2,
+                    -3
+                ],
+                7
+            ],
+            [
+                [
+                    10,
+                    8
+                ],
+                13
+            ]
+        ],
+        [
+            [
+                [
+                    7,
+                    3
+                ],
+                -3
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    1
+                ],
+                -7
+            ],
+            [
+                [
+                    -8,
+                    -14
+                ],
+                9
+            ],
+            [
+                [
+                    -7,
+                    0
+                ],
+                -8
+            ],
+            [
+                [
+                    -4,
+                    1
+                ],
+                1
+            ],
+            [
+                [
+                    -2,
+                    -11
+                ],
+                7
+            ],
+            [
+                [
+                    -2,
+                    -6
+                ],
+                12
+            ],
+            [
+                [
+                    0,
+                    3
+                ],
+                14
+            ],
+            [
+                [
+                    8,
+                    10
+                ],
+                -8
+            ],
+            [
+                [
+                    11,
+                    12
+                ],
+                11
+            ],
+            [
+                [
+                    14,
+                    -6
+                ],
+                -6
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -9
+                ],
+                -13
+            ],
+            [
+                [
+                    -14,
+                    0
+                ],
+                -8
+            ],
+            [
+                [
+                    -11,
+                    10
+                ],
+                10
+            ],
+            [
+                [
+                    -10,
+                    -7
+                ],
+                11
+            ],
+            [
+                [
+                    -10,
+                    1
+                ],
+                9
+            ],
+            [
+                [
+                    -8,
+                    -1
+                ],
+                8
+            ],
+            [
+                [
+                    -6,
+                    -4
+                ],
+                13
+            ],
+            [
+                [
+                    -5,
+                    -3
+                ],
+                1
+            ],
+            [
+                [
+                    -4,
+                    7
+                ],
+                -13
+            ],
+            [
+                [
+                    0,
+                    -4
+                ],
+                6
+            ],
+            [
+                [
+                    2,
+                    11
+                ],
+                -7
+            ],
+            [
+                [
+                    5,
+                    5
+                ],
+                5
+            ],
+            [
+                [
+                    6,
+                    6
+                ],
+                -2
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    0
+                ],
+                13
+            ],
+            [
+                [
+                    -13,
+                    4
+                ],
+                5
+            ],
+            [
+                [
+                    -8,
+                    -8
+                ],
+                13
+            ],
+            [
+                [
+                    -7,
+                    1
+                ],
+                -7
+            ],
+            [
+                [
+                    -3,
+                    -4
+                ],
+                7
+            ],
+            [
+                [
+                    1,
+                    12
+                ],
+                8
+            ],
+            [
+                [
+                    2,
+                    1
+                ],
+                12
+            ],
+            [
+                [
+                    3,
+                    4
+                ],
+                8
+            ],
+            [
+                [
+                    3,
+                    13
+                ],
+                10
+            ],
+            [
+                [
+                    9,
+                    6
+                ],
+                14
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    13
+                ],
+                7
+            ],
+            [
+                [
+                    -10,
+                    10
+                ],
+                11
+            ],
+            [
+                [
+                    -6,
+                    13
+                ],
+                -5
+            ],
+            [
+                [
+                    -5,
+                    0
+                ],
+                10
+            ],
+            [
+                [
+                    -4,
+                    -4
+                ],
+                14
+            ],
+            [
+                [
+                    0,
+                    -3
+                ],
+                -8
+            ],
+            [
+                [
+                    0,
+                    4
+                ],
+                -4
+            ],
+            [
+                [
+                    1,
+                    11
+                ],
+                -1
+            ],
+            [
+                [
+                    3,
+                    0
+                ],
+                -4
+            ],
+            [
+                [
+                    3,
+                    12
+                ],
+                13
+            ],
+            [
+                [
+                    8,
+                    -7
+                ],
+                2
+            ],
+            [
+                [
+                    14,
+                    -5
+                ],
+                -8
+            ],
+            [
+                [
+                    14,
+                    1
+                ],
+                13
+            ]
+        ],
+        [
+            [
+                [
+                    -9,
+                    1
+                ],
+                1
+            ],
+            [
+                [
+                    -8,
+                    11
+                ],
+                5
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    8
+                ],
+                3
+            ],
+            [
+                [
+                    -6,
+                    -14
+                ],
+                -14
+            ],
+            [
+                [
+                    -6,
+                    11
+                ],
+                2
+            ],
+            [
+                [
+                    -6,
+                    14
+                ],
+                6
+            ],
+            [
+                [
+                    -4,
+                    -1
+                ],
+                -5
+            ],
+            [
+                [
+                    0,
+                    0
+                ],
+                14
+            ],
+            [
+                [
+                    1,
+                    11
+                ],
+                8
+            ],
+            [
+                [
+                    2,
+                    4
+                ],
+                -12
+            ],
+            [
+                [
+                    6,
+                    -8
+                ],
+                7
+            ],
+            [
+                [
+                    8,
+                    -5
+                ],
+                4
+            ],
+            [
+                [
+                    12,
+                    -6
+                ],
+                5
+            ],
+            [
+                [
+                    13,
+                    14
+                ],
+                -4
+            ],
+            [
+                [
+                    14,
+                    0
+                ],
+                -3
+            ]
+        ]
+    ],
+    "seed": -142737232
+}
diff --git a/golden/MonoidMap (Int,Int) (Sum Natural).json b/golden/MonoidMap (Int,Int) (Sum Natural).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) (Sum Natural).json
@@ -0,0 +1,353 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -7,
+                    -13
+                ],
+                1
+            ],
+            [
+                [
+                    -1,
+                    -3
+                ],
+                3
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    2
+                ],
+                7
+            ],
+            [
+                [
+                    -1,
+                    9
+                ],
+                14
+            ],
+            [
+                [
+                    0,
+                    10
+                ],
+                4
+            ],
+            [
+                [
+                    5,
+                    4
+                ],
+                11
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    1
+                ],
+                2
+            ],
+            [
+                [
+                    -14,
+                    5
+                ],
+                9
+            ],
+            [
+                [
+                    -12,
+                    4
+                ],
+                9
+            ],
+            [
+                [
+                    -11,
+                    11
+                ],
+                13
+            ],
+            [
+                [
+                    -11,
+                    14
+                ],
+                3
+            ],
+            [
+                [
+                    5,
+                    2
+                ],
+                1
+            ],
+            [
+                [
+                    7,
+                    0
+                ],
+                13
+            ],
+            [
+                [
+                    8,
+                    4
+                ],
+                4
+            ],
+            [
+                [
+                    11,
+                    -7
+                ],
+                11
+            ],
+            [
+                [
+                    13,
+                    -2
+                ],
+                7
+            ]
+        ],
+        [
+            [
+                [
+                    -9,
+                    3
+                ],
+                8
+            ],
+            [
+                [
+                    -4,
+                    -4
+                ],
+                7
+            ],
+            [
+                [
+                    12,
+                    -1
+                ],
+                2
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    14
+                ],
+                12
+            ],
+            [
+                [
+                    -5,
+                    9
+                ],
+                2
+            ],
+            [
+                [
+                    1,
+                    0
+                ],
+                13
+            ]
+        ],
+        [
+            [
+                [
+                    0,
+                    -10
+                ],
+                11
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    9
+                ],
+                11
+            ],
+            [
+                [
+                    -8,
+                    -3
+                ],
+                11
+            ],
+            [
+                [
+                    -6,
+                    -13
+                ],
+                4
+            ],
+            [
+                [
+                    -6,
+                    8
+                ],
+                8
+            ],
+            [
+                [
+                    -3,
+                    -14
+                ],
+                11
+            ],
+            [
+                [
+                    -2,
+                    9
+                ],
+                10
+            ],
+            [
+                [
+                    6,
+                    -13
+                ],
+                9
+            ],
+            [
+                [
+                    10,
+                    -11
+                ],
+                12
+            ],
+            [
+                [
+                    12,
+                    -10
+                ],
+                9
+            ],
+            [
+                [
+                    12,
+                    -5
+                ],
+                13
+            ],
+            [
+                [
+                    14,
+                    6
+                ],
+                9
+            ]
+        ],
+        [
+            [
+                [
+                    -9,
+                    13
+                ],
+                14
+            ],
+            [
+                [
+                    -2,
+                    -13
+                ],
+                3
+            ],
+            [
+                [
+                    0,
+                    -14
+                ],
+                3
+            ],
+            [
+                [
+                    1,
+                    -14
+                ],
+                7
+            ],
+            [
+                [
+                    1,
+                    -4
+                ],
+                1
+            ],
+            [
+                [
+                    7,
+                    -7
+                ],
+                9
+            ],
+            [
+                [
+                    7,
+                    0
+                ],
+                13
+            ],
+            [
+                [
+                    13,
+                    4
+                ],
+                1
+            ]
+        ],
+        [
+            [
+                [
+                    -6,
+                    -5
+                ],
+                9
+            ],
+            [
+                [
+                    -6,
+                    1
+                ],
+                13
+            ],
+            [
+                [
+                    11,
+                    -1
+                ],
+                10
+            ],
+            [
+                [
+                    12,
+                    4
+                ],
+                12
+            ],
+            [
+                [
+                    14,
+                    -3
+                ],
+                8
+            ]
+        ],
+        []
+    ],
+    "seed": 8531488
+}
diff --git a/golden/MonoidMap (Int,Int) Text.json b/golden/MonoidMap (Int,Int) Text.json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) Text.json
@@ -0,0 +1,408 @@
+{
+    "samples": [
+        [],
+        [
+            [
+                [
+                    -8,
+                    10
+                ],
+                "aaaaaaaaaaaab"
+            ],
+            [
+                [
+                    -1,
+                    -4
+                ],
+                "baaa"
+            ],
+            [
+                [
+                    14,
+                    -7
+                ],
+                "aaaacabaabaaaa"
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    11
+                ],
+                "aacabcabb"
+            ],
+            [
+                [
+                    -10,
+                    6
+                ],
+                "aaacbbcabaa"
+            ],
+            [
+                [
+                    -9,
+                    9
+                ],
+                "aaaabaaaaba"
+            ],
+            [
+                [
+                    -7,
+                    -12
+                ],
+                "aaaaaaaa"
+            ],
+            [
+                [
+                    -6,
+                    5
+                ],
+                "ba"
+            ],
+            [
+                [
+                    4,
+                    -10
+                ],
+                "abaaaaa"
+            ],
+            [
+                [
+                    8,
+                    11
+                ],
+                "aaadabcaa"
+            ],
+            [
+                [
+                    12,
+                    -5
+                ],
+                "a"
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    14
+                ],
+                "aaaaaba"
+            ],
+            [
+                [
+                    -4,
+                    -3
+                ],
+                "aab"
+            ],
+            [
+                [
+                    -3,
+                    11
+                ],
+                "abbbaaaaaaaa"
+            ],
+            [
+                [
+                    13,
+                    4
+                ],
+                "aaac"
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    2
+                ],
+                "aacaaa"
+            ],
+            [
+                [
+                    -1,
+                    3
+                ],
+                "aaaacab"
+            ],
+            [
+                [
+                    7,
+                    2
+                ],
+                "babaaaaabcabb"
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    12
+                ],
+                "aaacbababbbaa"
+            ],
+            [
+                [
+                    -11,
+                    -3
+                ],
+                "abbac"
+            ],
+            [
+                [
+                    -11,
+                    11
+                ],
+                "bbaaaaaaaaaa"
+            ],
+            [
+                [
+                    -5,
+                    9
+                ],
+                "aaa"
+            ],
+            [
+                [
+                    -5,
+                    14
+                ],
+                "ab"
+            ],
+            [
+                [
+                    -2,
+                    -11
+                ],
+                "aaaaaba"
+            ],
+            [
+                [
+                    1,
+                    9
+                ],
+                "aaaaadaaa"
+            ],
+            [
+                [
+                    2,
+                    8
+                ],
+                "aacaaaaabaaaa"
+            ],
+            [
+                [
+                    4,
+                    7
+                ],
+                "ababbaaaaaaca"
+            ],
+            [
+                [
+                    7,
+                    -4
+                ],
+                "babaaaabbb"
+            ],
+            [
+                [
+                    12,
+                    -5
+                ],
+                "aabaaaaaaaaaa"
+            ]
+        ],
+        [],
+        [
+            [
+                [
+                    -14,
+                    -12
+                ],
+                "aaaaabbaabb"
+            ],
+            [
+                [
+                    -12,
+                    3
+                ],
+                "aab"
+            ],
+            [
+                [
+                    -11,
+                    -12
+                ],
+                "aaa"
+            ],
+            [
+                [
+                    -9,
+                    5
+                ],
+                "aaaaaabaaa"
+            ],
+            [
+                [
+                    -7,
+                    -7
+                ],
+                "aaabaa"
+            ],
+            [
+                [
+                    -4,
+                    -5
+                ],
+                "aaaaa"
+            ],
+            [
+                [
+                    -2,
+                    -3
+                ],
+                "aaaaadaa"
+            ],
+            [
+                [
+                    1,
+                    -5
+                ],
+                "abacbbbaa"
+            ],
+            [
+                [
+                    2,
+                    2
+                ],
+                "aaaaaaabaa"
+            ],
+            [
+                [
+                    2,
+                    5
+                ],
+                "aaaaaaaa"
+            ],
+            [
+                [
+                    6,
+                    -6
+                ],
+                "aaaa"
+            ],
+            [
+                [
+                    8,
+                    -4
+                ],
+                "aaaaaaaaaaaaa"
+            ],
+            [
+                [
+                    11,
+                    9
+                ],
+                "aaaababaabab"
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -14
+                ],
+                "aaab"
+            ],
+            [
+                [
+                    -9,
+                    1
+                ],
+                "aaaaaabaababa"
+            ],
+            [
+                [
+                    0,
+                    -8
+                ],
+                "ba"
+            ],
+            [
+                [
+                    1,
+                    -6
+                ],
+                "caabaa"
+            ],
+            [
+                [
+                    2,
+                    10
+                ],
+                "aaaa"
+            ],
+            [
+                [
+                    4,
+                    -5
+                ],
+                "b"
+            ],
+            [
+                [
+                    10,
+                    4
+                ],
+                "aaadababbaaba"
+            ],
+            [
+                [
+                    14,
+                    -13
+                ],
+                "aaaaa"
+            ],
+            [
+                [
+                    14,
+                    -10
+                ],
+                "abacaaaabaaa"
+            ]
+        ],
+        [
+            [
+                [
+                    -2,
+                    1
+                ],
+                "aaa"
+            ],
+            [
+                [
+                    1,
+                    -12
+                ],
+                "aaaaabaaaaaaab"
+            ],
+            [
+                [
+                    8,
+                    0
+                ],
+                "a"
+            ],
+            [
+                [
+                    11,
+                    13
+                ],
+                "aaaaaaa"
+            ]
+        ]
+    ],
+    "seed": -1516823690
+}
diff --git a/golden/MonoidMap (Int,Int) [Int].json b/golden/MonoidMap (Int,Int) [Int].json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) [Int].json
@@ -0,0 +1,1202 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -14,
+                    3
+                ],
+                [
+                    7,
+                    -6,
+                    9,
+                    -14,
+                    6,
+                    6,
+                    -9,
+                    11,
+                    -2
+                ]
+            ],
+            [
+                [
+                    -13,
+                    0
+                ],
+                [
+                    6,
+                    -11,
+                    -13,
+                    14,
+                    2,
+                    10,
+                    7,
+                    12,
+                    -3
+                ]
+            ],
+            [
+                [
+                    -8,
+                    1
+                ],
+                [
+                    8,
+                    10,
+                    4,
+                    3,
+                    -12,
+                    14,
+                    12,
+                    13,
+                    -10,
+                    -14,
+                    -7,
+                    -8,
+                    12
+                ]
+            ],
+            [
+                [
+                    -5,
+                    3
+                ],
+                [
+                    7,
+                    11,
+                    -12,
+                    12
+                ]
+            ],
+            [
+                [
+                    8,
+                    -12
+                ],
+                [
+                    -14,
+                    1,
+                    1
+                ]
+            ],
+            [
+                [
+                    12,
+                    -1
+                ],
+                [
+                    13,
+                    -9,
+                    -8
+                ]
+            ],
+            [
+                [
+                    13,
+                    4
+                ],
+                [
+                    7,
+                    -4,
+                    2,
+                    11,
+                    -2,
+                    5
+                ]
+            ],
+            [
+                [
+                    14,
+                    -3
+                ],
+                [
+                    -10,
+                    10,
+                    -5,
+                    3,
+                    2,
+                    4,
+                    -3,
+                    -6,
+                    -6,
+                    10,
+                    4
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    -7
+                ],
+                [
+                    6,
+                    -8,
+                    11,
+                    8
+                ]
+            ],
+            [
+                [
+                    -9,
+                    -5
+                ],
+                [
+                    -1,
+                    -7,
+                    10
+                ]
+            ],
+            [
+                [
+                    4,
+                    -14
+                ],
+                [
+                    -4,
+                    7,
+                    12
+                ]
+            ],
+            [
+                [
+                    12,
+                    -7
+                ],
+                [
+                    -14,
+                    -1,
+                    0,
+                    6,
+                    10,
+                    -1,
+                    -8,
+                    -2,
+                    -8
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    13
+                ],
+                [
+                    2,
+                    12,
+                    11,
+                    5,
+                    7,
+                    10,
+                    -3,
+                    -2
+                ]
+            ],
+            [
+                [
+                    -6,
+                    -7
+                ],
+                [
+                    0,
+                    14,
+                    -3
+                ]
+            ],
+            [
+                [
+                    -6,
+                    0
+                ],
+                [
+                    -6,
+                    -12,
+                    7,
+                    11,
+                    12,
+                    2,
+                    5,
+                    2,
+                    -9,
+                    -6,
+                    -7
+                ]
+            ],
+            [
+                [
+                    -4,
+                    -9
+                ],
+                [
+                    -14,
+                    0,
+                    -12,
+                    8,
+                    -9,
+                    -4,
+                    8,
+                    6
+                ]
+            ],
+            [
+                [
+                    -1,
+                    4
+                ],
+                [
+                    5,
+                    -4,
+                    -3,
+                    -7,
+                    -6,
+                    2,
+                    -8
+                ]
+            ],
+            [
+                [
+                    8,
+                    3
+                ],
+                [
+                    13,
+                    -12,
+                    4,
+                    10,
+                    -4,
+                    -2,
+                    -7,
+                    7,
+                    -7
+                ]
+            ],
+            [
+                [
+                    9,
+                    -2
+                ],
+                [
+                    -9,
+                    6,
+                    -5,
+                    11,
+                    4,
+                    11,
+                    6,
+                    -11,
+                    -3,
+                    0,
+                    10,
+                    -14,
+                    12,
+                    -6
+                ]
+            ]
+        ],
+        [],
+        [
+            [
+                [
+                    -14,
+                    -13
+                ],
+                [
+                    14,
+                    -11,
+                    4,
+                    3,
+                    8,
+                    7,
+                    -1,
+                    1,
+                    7,
+                    -11,
+                    -7,
+                    -12
+                ]
+            ],
+            [
+                [
+                    -13,
+                    -4
+                ],
+                [
+                    -13,
+                    3,
+                    5,
+                    -4,
+                    7,
+                    5,
+                    -9,
+                    -9,
+                    -1,
+                    -6,
+                    2,
+                    -7,
+                    -2,
+                    -12
+                ]
+            ],
+            [
+                [
+                    -12,
+                    7
+                ],
+                [
+                    -5,
+                    -4,
+                    3,
+                    -2,
+                    -11,
+                    -2
+                ]
+            ],
+            [
+                [
+                    -9,
+                    6
+                ],
+                [
+                    -10,
+                    0,
+                    0,
+                    13,
+                    -2,
+                    6,
+                    -3,
+                    -6,
+                    2
+                ]
+            ],
+            [
+                [
+                    -2,
+                    13
+                ],
+                [
+                    12,
+                    -2,
+                    -10,
+                    9,
+                    10
+                ]
+            ],
+            [
+                [
+                    2,
+                    -9
+                ],
+                [
+                    7,
+                    -13,
+                    12,
+                    -9,
+                    13,
+                    -13
+                ]
+            ],
+            [
+                [
+                    5,
+                    -12
+                ],
+                [
+                    7,
+                    -1,
+                    6,
+                    -4,
+                    1,
+                    11,
+                    -2,
+                    0,
+                    -5,
+                    -13
+                ]
+            ],
+            [
+                [
+                    7,
+                    14
+                ],
+                [
+                    2,
+                    6,
+                    -12,
+                    -9,
+                    -14
+                ]
+            ],
+            [
+                [
+                    9,
+                    -9
+                ],
+                [
+                    -4,
+                    7,
+                    -10,
+                    8,
+                    -8,
+                    -8,
+                    -3,
+                    6,
+                    -13,
+                    -12,
+                    10,
+                    11
+                ]
+            ],
+            [
+                [
+                    10,
+                    -9
+                ],
+                [
+                    -2,
+                    4,
+                    11,
+                    -6,
+                    -11,
+                    -2,
+                    0,
+                    1,
+                    -9,
+                    7,
+                    10
+                ]
+            ],
+            [
+                [
+                    13,
+                    -4
+                ],
+                [
+                    -8,
+                    -5,
+                    3,
+                    -6,
+                    -10,
+                    13,
+                    -4
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    11
+                ],
+                [
+                    2,
+                    4,
+                    0
+                ]
+            ],
+            [
+                [
+                    -8,
+                    -13
+                ],
+                [
+                    -8,
+                    -6,
+                    3
+                ]
+            ],
+            [
+                [
+                    -7,
+                    10
+                ],
+                [
+                    3,
+                    1,
+                    10,
+                    7,
+                    10,
+                    -3,
+                    -1
+                ]
+            ],
+            [
+                [
+                    -5,
+                    8
+                ],
+                [
+                    7
+                ]
+            ],
+            [
+                [
+                    -4,
+                    12
+                ],
+                [
+                    9
+                ]
+            ],
+            [
+                [
+                    3,
+                    -13
+                ],
+                [
+                    13,
+                    1,
+                    6,
+                    13,
+                    5,
+                    8,
+                    13,
+                    -2,
+                    4,
+                    -3,
+                    -6
+                ]
+            ],
+            [
+                [
+                    7,
+                    -13
+                ],
+                [
+                    -12,
+                    -3,
+                    9,
+                    -13,
+                    -1,
+                    -14,
+                    -4,
+                    4,
+                    -11,
+                    -8,
+                    13,
+                    13,
+                    -6
+                ]
+            ],
+            [
+                [
+                    8,
+                    -3
+                ],
+                [
+                    -9,
+                    -8,
+                    -10
+                ]
+            ],
+            [
+                [
+                    9,
+                    -7
+                ],
+                [
+                    3
+                ]
+            ],
+            [
+                [
+                    12,
+                    -9
+                ],
+                [
+                    -12,
+                    -8,
+                    -8,
+                    14,
+                    -9
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    5
+                ],
+                [
+                    3,
+                    12,
+                    0,
+                    -10,
+                    -7,
+                    -10,
+                    14,
+                    -1,
+                    -6,
+                    4
+                ]
+            ],
+            [
+                [
+                    -9,
+                    0
+                ],
+                [
+                    11,
+                    13,
+                    -14,
+                    0,
+                    -4,
+                    -9,
+                    0,
+                    -6,
+                    -2,
+                    -2,
+                    -11,
+                    1,
+                    4,
+                    3
+                ]
+            ],
+            [
+                [
+                    5,
+                    13
+                ],
+                [
+                    9,
+                    10,
+                    4
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -4,
+                    14
+                ],
+                [
+                    -9,
+                    1,
+                    -5,
+                    8,
+                    -10,
+                    5,
+                    0,
+                    -1,
+                    -8,
+                    -4
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -5
+                ],
+                [
+                    -3,
+                    5
+                ]
+            ],
+            [
+                [
+                    -2,
+                    0
+                ],
+                [
+                    1,
+                    -5,
+                    2,
+                    4,
+                    -5,
+                    -13,
+                    11,
+                    6,
+                    -14,
+                    6,
+                    13
+                ]
+            ],
+            [
+                [
+                    -1,
+                    7
+                ],
+                [
+                    -11,
+                    4,
+                    3,
+                    7,
+                    -9,
+                    7,
+                    8,
+                    5,
+                    1,
+                    -7
+                ]
+            ],
+            [
+                [
+                    -1,
+                    9
+                ],
+                [
+                    -2,
+                    7,
+                    -14,
+                    -6,
+                    -4,
+                    -3,
+                    4
+                ]
+            ],
+            [
+                [
+                    3,
+                    -3
+                ],
+                [
+                    6,
+                    -9,
+                    1
+                ]
+            ],
+            [
+                [
+                    5,
+                    12
+                ],
+                [
+                    2
+                ]
+            ],
+            [
+                [
+                    6,
+                    -9
+                ],
+                [
+                    2,
+                    -10,
+                    -13,
+                    5,
+                    -8,
+                    -14,
+                    0,
+                    -6,
+                    9,
+                    13
+                ]
+            ],
+            [
+                [
+                    7,
+                    14
+                ],
+                [
+                    -10,
+                    1,
+                    10,
+                    1,
+                    6,
+                    7
+                ]
+            ],
+            [
+                [
+                    13,
+                    -2
+                ],
+                [
+                    13,
+                    -12,
+                    14,
+                    -12,
+                    6,
+                    -2,
+                    12,
+                    2,
+                    10
+                ]
+            ],
+            [
+                [
+                    13,
+                    7
+                ],
+                [
+                    -3,
+                    9
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    4
+                ],
+                [
+                    14,
+                    14,
+                    13,
+                    12,
+                    4,
+                    -13,
+                    3,
+                    13
+                ]
+            ],
+            [
+                [
+                    -12,
+                    -14
+                ],
+                [
+                    -6,
+                    13,
+                    -14,
+                    -10,
+                    -8,
+                    10
+                ]
+            ],
+            [
+                [
+                    -10,
+                    8
+                ],
+                [
+                    13,
+                    5,
+                    -12,
+                    4,
+                    -10,
+                    8,
+                    -8,
+                    -12
+                ]
+            ],
+            [
+                [
+                    -5,
+                    6
+                ],
+                [
+                    -1,
+                    -9,
+                    -7,
+                    9,
+                    14,
+                    -1,
+                    -5
+                ]
+            ],
+            [
+                [
+                    -4,
+                    -7
+                ],
+                [
+                    -12,
+                    13,
+                    10,
+                    9,
+                    -7,
+                    2,
+                    0,
+                    8,
+                    -14,
+                    -1,
+                    1
+                ]
+            ],
+            [
+                [
+                    -1,
+                    -8
+                ],
+                [
+                    13,
+                    -5
+                ]
+            ],
+            [
+                [
+                    4,
+                    8
+                ],
+                [
+                    10,
+                    3,
+                    -13,
+                    -6,
+                    13
+                ]
+            ],
+            [
+                [
+                    4,
+                    10
+                ],
+                [
+                    -11,
+                    -9,
+                    -8
+                ]
+            ],
+            [
+                [
+                    7,
+                    10
+                ],
+                [
+                    -3,
+                    -4,
+                    4,
+                    -10
+                ]
+            ],
+            [
+                [
+                    9,
+                    1
+                ],
+                [
+                    14,
+                    1,
+                    -6,
+                    -5,
+                    -1,
+                    -3,
+                    -7,
+                    9
+                ]
+            ],
+            [
+                [
+                    13,
+                    -7
+                ],
+                [
+                    4,
+                    1,
+                    10,
+                    -8,
+                    -14,
+                    6,
+                    13,
+                    2,
+                    0,
+                    0,
+                    -3,
+                    4,
+                    1,
+                    -6
+                ]
+            ],
+            [
+                [
+                    14,
+                    -12
+                ],
+                [
+                    4,
+                    1,
+                    6
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -5,
+                    3
+                ],
+                [
+                    -3,
+                    -6
+                ]
+            ],
+            [
+                [
+                    -5,
+                    11
+                ],
+                [
+                    11,
+                    7,
+                    -5,
+                    4,
+                    14,
+                    -3,
+                    -7,
+                    -6,
+                    2,
+                    14,
+                    -1,
+                    8,
+                    6
+                ]
+            ],
+            [
+                [
+                    -4,
+                    8
+                ],
+                [
+                    3,
+                    0,
+                    5,
+                    -14,
+                    -4,
+                    -7,
+                    2
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -11
+                ],
+                [
+                    -7,
+                    4,
+                    4,
+                    6,
+                    -3,
+                    12
+                ]
+            ],
+            [
+                [
+                    1,
+                    -12
+                ],
+                [
+                    1,
+                    1,
+                    -3,
+                    0,
+                    10,
+                    -4,
+                    2,
+                    8,
+                    -9
+                ]
+            ],
+            [
+                [
+                    1,
+                    -5
+                ],
+                [
+                    -4,
+                    -5,
+                    -1,
+                    -5,
+                    7,
+                    -5,
+                    3,
+                    -7,
+                    -14,
+                    -11,
+                    13,
+                    -14,
+                    -13
+                ]
+            ],
+            [
+                [
+                    6,
+                    10
+                ],
+                [
+                    -8,
+                    13,
+                    -8,
+                    8,
+                    -6,
+                    -14,
+                    -5,
+                    -5,
+                    12,
+                    -1,
+                    -4
+                ]
+            ],
+            [
+                [
+                    7,
+                    7
+                ],
+                [
+                    -11,
+                    -12,
+                    13,
+                    11,
+                    -13,
+                    -14,
+                    -1
+                ]
+            ],
+            [
+                [
+                    9,
+                    -14
+                ],
+                [
+                    -11,
+                    -5
+                ]
+            ],
+            [
+                [
+                    9,
+                    9
+                ],
+                [
+                    13,
+                    -13,
+                    -12,
+                    14,
+                    -1,
+                    -1,
+                    -2,
+                    -5,
+                    13,
+                    -11
+                ]
+            ],
+            [
+                [
+                    11,
+                    10
+                ],
+                [
+                    -11,
+                    6,
+                    7
+                ]
+            ],
+            [
+                [
+                    12,
+                    -3
+                ],
+                [
+                    -11,
+                    -7,
+                    -7,
+                    8,
+                    -2,
+                    0,
+                    4,
+                    -7,
+                    7,
+                    7,
+                    8,
+                    -3
+                ]
+            ]
+        ]
+    ],
+    "seed": -428393891
+}
diff --git a/golden/MonoidMap (Int,Int) [Natural].json b/golden/MonoidMap (Int,Int) [Natural].json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap (Int,Int) [Natural].json
@@ -0,0 +1,1073 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    1,
+                    10
+                ],
+                [
+                    7,
+                    12,
+                    11,
+                    14
+                ]
+            ],
+            [
+                [
+                    1,
+                    12
+                ],
+                [
+                    4,
+                    11,
+                    12,
+                    9
+                ]
+            ],
+            [
+                [
+                    3,
+                    -13
+                ],
+                [
+                    13,
+                    12,
+                    0,
+                    9,
+                    6
+                ]
+            ],
+            [
+                [
+                    5,
+                    8
+                ],
+                [
+                    7,
+                    6,
+                    13,
+                    8,
+                    12,
+                    10,
+                    5,
+                    0,
+                    3,
+                    7,
+                    6,
+                    7,
+                    2
+                ]
+            ],
+            [
+                [
+                    6,
+                    -9
+                ],
+                [
+                    9,
+                    8,
+                    13,
+                    4,
+                    3,
+                    3,
+                    10,
+                    9,
+                    3,
+                    13,
+                    5,
+                    6,
+                    7
+                ]
+            ],
+            [
+                [
+                    6,
+                    8
+                ],
+                [
+                    13,
+                    5,
+                    11,
+                    1,
+                    3,
+                    3,
+                    5,
+                    3,
+                    10,
+                    0,
+                    9,
+                    14,
+                    8,
+                    8
+                ]
+            ],
+            [
+                [
+                    10,
+                    -12
+                ],
+                [
+                    12,
+                    0,
+                    0,
+                    11,
+                    6
+                ]
+            ],
+            [
+                [
+                    11,
+                    4
+                ],
+                [
+                    4,
+                    12,
+                    8,
+                    12,
+                    6,
+                    5,
+                    9
+                ]
+            ],
+            [
+                [
+                    13,
+                    -13
+                ],
+                [
+                    3,
+                    4,
+                    4,
+                    4,
+                    9,
+                    9,
+                    5,
+                    1,
+                    6,
+                    7,
+                    9,
+                    1,
+                    3
+                ]
+            ],
+            [
+                [
+                    13,
+                    10
+                ],
+                [
+                    13,
+                    10,
+                    10,
+                    11,
+                    13,
+                    1,
+                    8,
+                    0,
+                    10,
+                    12,
+                    4,
+                    0
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    -9
+                ],
+                [
+                    1
+                ]
+            ],
+            [
+                [
+                    -8,
+                    -2
+                ],
+                [
+                    4,
+                    1,
+                    6,
+                    9,
+                    12,
+                    12,
+                    2,
+                    1,
+                    8,
+                    1,
+                    10
+                ]
+            ],
+            [
+                [
+                    2,
+                    14
+                ],
+                [
+                    10,
+                    10,
+                    0,
+                    7,
+                    12,
+                    6,
+                    7,
+                    14,
+                    8,
+                    12,
+                    1,
+                    1
+                ]
+            ],
+            [
+                [
+                    9,
+                    -2
+                ],
+                [
+                    2
+                ]
+            ],
+            [
+                [
+                    10,
+                    10
+                ],
+                [
+                    2,
+                    3,
+                    14,
+                    0,
+                    1,
+                    9,
+                    1,
+                    10,
+                    13,
+                    10,
+                    6,
+                    6
+                ]
+            ],
+            [
+                [
+                    10,
+                    13
+                ],
+                [
+                    9,
+                    9,
+                    13,
+                    5,
+                    1,
+                    3,
+                    0,
+                    6,
+                    8,
+                    7,
+                    10
+                ]
+            ],
+            [
+                [
+                    12,
+                    -6
+                ],
+                [
+                    7,
+                    14,
+                    10,
+                    1,
+                    11,
+                    7,
+                    8,
+                    4
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    7
+                ],
+                [
+                    1,
+                    9,
+                    14,
+                    5,
+                    13,
+                    14,
+                    4,
+                    3,
+                    3,
+                    2
+                ]
+            ],
+            [
+                [
+                    -11,
+                    -4
+                ],
+                [
+                    7,
+                    11,
+                    7,
+                    10,
+                    13,
+                    6,
+                    6,
+                    12,
+                    3,
+                    9,
+                    10
+                ]
+            ],
+            [
+                [
+                    -4,
+                    13
+                ],
+                [
+                    5,
+                    2,
+                    5,
+                    1,
+                    6,
+                    6,
+                    12
+                ]
+            ],
+            [
+                [
+                    1,
+                    -1
+                ],
+                [
+                    11,
+                    6,
+                    5,
+                    12,
+                    5,
+                    10
+                ]
+            ],
+            [
+                [
+                    2,
+                    -1
+                ],
+                [
+                    8,
+                    0,
+                    3,
+                    6,
+                    12,
+                    6,
+                    11,
+                    3,
+                    0,
+                    11,
+                    8,
+                    7,
+                    9
+                ]
+            ],
+            [
+                [
+                    4,
+                    7
+                ],
+                [
+                    0,
+                    13,
+                    13
+                ]
+            ],
+            [
+                [
+                    12,
+                    8
+                ],
+                [
+                    4,
+                    6,
+                    0,
+                    10,
+                    6,
+                    12,
+                    5,
+                    11,
+                    5,
+                    8,
+                    0
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -3,
+                    -1
+                ],
+                [
+                    2,
+                    6,
+                    8,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    2,
+                    -14
+                ],
+                [
+                    5,
+                    4,
+                    12,
+                    1,
+                    9,
+                    11,
+                    9,
+                    6,
+                    3
+                ]
+            ],
+            [
+                [
+                    8,
+                    14
+                ],
+                [
+                    7,
+                    1,
+                    12
+                ]
+            ],
+            [
+                [
+                    13,
+                    -9
+                ],
+                [
+                    4,
+                    12,
+                    9,
+                    5,
+                    9,
+                    8,
+                    0,
+                    7,
+                    9,
+                    13,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -6,
+                    -2
+                ],
+                [
+                    14,
+                    3,
+                    14,
+                    7,
+                    10,
+                    4,
+                    1,
+                    1,
+                    6,
+                    13,
+                    11,
+                    8,
+                    9,
+                    2
+                ]
+            ],
+            [
+                [
+                    -6,
+                    2
+                ],
+                [
+                    7,
+                    14,
+                    4,
+                    6,
+                    14,
+                    10,
+                    0,
+                    1,
+                    1,
+                    7,
+                    7,
+                    6,
+                    10,
+                    13
+                ]
+            ],
+            [
+                [
+                    0,
+                    -10
+                ],
+                [
+                    12,
+                    14,
+                    0,
+                    4,
+                    9,
+                    10
+                ]
+            ],
+            [
+                [
+                    1,
+                    11
+                ],
+                [
+                    2,
+                    11,
+                    0,
+                    7,
+                    6
+                ]
+            ],
+            [
+                [
+                    2,
+                    8
+                ],
+                [
+                    0
+                ]
+            ],
+            [
+                [
+                    3,
+                    11
+                ],
+                [
+                    12,
+                    3,
+                    1,
+                    9,
+                    11,
+                    13,
+                    0,
+                    8
+                ]
+            ],
+            [
+                [
+                    7,
+                    12
+                ],
+                [
+                    0,
+                    0,
+                    8,
+                    3,
+                    7,
+                    13,
+                    14,
+                    12,
+                    12,
+                    6,
+                    12,
+                    8,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    -4
+                ],
+                [
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -10,
+                    12
+                ],
+                [
+                    12,
+                    1,
+                    12,
+                    9,
+                    10,
+                    3,
+                    12,
+                    4,
+                    1,
+                    8
+                ]
+            ],
+            [
+                [
+                    -6,
+                    1
+                ],
+                [
+                    12,
+                    7,
+                    6,
+                    8,
+                    12,
+                    3,
+                    11,
+                    12,
+                    14,
+                    12,
+                    7,
+                    14,
+                    14
+                ]
+            ],
+            [
+                [
+                    -5,
+                    -4
+                ],
+                [
+                    7,
+                    7,
+                    5,
+                    8,
+                    4,
+                    0
+                ]
+            ],
+            [
+                [
+                    -1,
+                    -10
+                ],
+                [
+                    10,
+                    7,
+                    13,
+                    2,
+                    11,
+                    6,
+                    9,
+                    2,
+                    12,
+                    3,
+                    2,
+                    6
+                ]
+            ],
+            [
+                [
+                    0,
+                    -12
+                ],
+                [
+                    6,
+                    10,
+                    8,
+                    6,
+                    2,
+                    7,
+                    12,
+                    4,
+                    10
+                ]
+            ],
+            [
+                [
+                    0,
+                    -9
+                ],
+                [
+                    5,
+                    0,
+                    4,
+                    10,
+                    14,
+                    7,
+                    6,
+                    11,
+                    12
+                ]
+            ],
+            [
+                [
+                    11,
+                    -7
+                ],
+                [
+                    4,
+                    1,
+                    3
+                ]
+            ],
+            [
+                [
+                    14,
+                    4
+                ],
+                [
+                    5
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    -14
+                ],
+                [
+                    2,
+                    9,
+                    12,
+                    5,
+                    2,
+                    11,
+                    5,
+                    8
+                ]
+            ],
+            [
+                [
+                    -11,
+                    2
+                ],
+                [
+                    1,
+                    11,
+                    10,
+                    5,
+                    4,
+                    0,
+                    14,
+                    3,
+                    10,
+                    0,
+                    6
+                ]
+            ],
+            [
+                [
+                    -9,
+                    -4
+                ],
+                [
+                    12,
+                    12,
+                    6,
+                    13,
+                    0,
+                    2,
+                    12,
+                    8,
+                    11,
+                    9,
+                    6,
+                    1,
+                    9,
+                    14
+                ]
+            ],
+            [
+                [
+                    -9,
+                    1
+                ],
+                [
+                    6,
+                    6
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -5
+                ],
+                [
+                    2,
+                    0
+                ]
+            ],
+            [
+                [
+                    0,
+                    -1
+                ],
+                [
+                    13,
+                    8,
+                    1,
+                    11,
+                    4
+                ]
+            ],
+            [
+                [
+                    0,
+                    12
+                ],
+                [
+                    0,
+                    8,
+                    13
+                ]
+            ],
+            [
+                [
+                    4,
+                    14
+                ],
+                [
+                    4
+                ]
+            ],
+            [
+                [
+                    5,
+                    12
+                ],
+                [
+                    7,
+                    9,
+                    8,
+                    4,
+                    4,
+                    11,
+                    8,
+                    4
+                ]
+            ],
+            [
+                [
+                    8,
+                    0
+                ],
+                [
+                    0
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    0,
+                    -14
+                ],
+                [
+                    10,
+                    9,
+                    1
+                ]
+            ],
+            [
+                [
+                    2,
+                    7
+                ],
+                [
+                    10,
+                    12,
+                    5,
+                    7,
+                    7,
+                    6
+                ]
+            ],
+            [
+                [
+                    3,
+                    -1
+                ],
+                [
+                    7,
+                    6
+                ]
+            ],
+            [
+                [
+                    3,
+                    11
+                ],
+                [
+                    14,
+                    6,
+                    3,
+                    0,
+                    10,
+                    3,
+                    4,
+                    8,
+                    2,
+                    4,
+                    12,
+                    6,
+                    0
+                ]
+            ],
+            [
+                [
+                    4,
+                    12
+                ],
+                [
+                    10,
+                    5,
+                    10
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    2
+                ],
+                [
+                    9,
+                    1,
+                    3,
+                    2,
+                    8,
+                    7,
+                    4,
+                    13,
+                    7,
+                    6,
+                    14,
+                    13
+                ]
+            ],
+            [
+                [
+                    -12,
+                    -12
+                ],
+                [
+                    9,
+                    6,
+                    5,
+                    9,
+                    4,
+                    11,
+                    6,
+                    6,
+                    2,
+                    7,
+                    9,
+                    9,
+                    1
+                ]
+            ],
+            [
+                [
+                    -7,
+                    -10
+                ],
+                [
+                    3,
+                    12,
+                    12,
+                    12,
+                    11,
+                    1,
+                    7,
+                    13,
+                    8
+                ]
+            ],
+            [
+                [
+                    -3,
+                    12
+                ],
+                [
+                    5,
+                    13,
+                    0,
+                    7,
+                    14
+                ]
+            ],
+            [
+                [
+                    3,
+                    6
+                ],
+                [
+                    9,
+                    2,
+                    11,
+                    13,
+                    13,
+                    14,
+                    6,
+                    12,
+                    5,
+                    9,
+                    0
+                ]
+            ],
+            [
+                [
+                    5,
+                    2
+                ],
+                [
+                    14,
+                    7,
+                    12
+                ]
+            ],
+            [
+                [
+                    6,
+                    9
+                ],
+                [
+                    8,
+                    14
+                ]
+            ],
+            [
+                [
+                    8,
+                    4
+                ],
+                [
+                    6
+                ]
+            ],
+            [
+                [
+                    9,
+                    -3
+                ],
+                [
+                    1,
+                    10,
+                    9,
+                    13,
+                    3,
+                    3
+                ]
+            ]
+        ]
+    ],
+    "seed": 1937777118
+}
diff --git a/golden/MonoidMap Int (Dual Text).json b/golden/MonoidMap Int (Dual Text).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int (Dual Text).json
@@ -0,0 +1,65 @@
+{
+    "samples": [
+        {
+            "-1": "aaaaaaaaaaaaababa",
+            "-13": "aaaaadacbcc",
+            "-3": "aabaab",
+            "-4": "abaaaaaadb",
+            "-7": "aaadaba",
+            "-8": "babbaabaaba",
+            "1": "aaadaaaa",
+            "11": "acaabacaabab",
+            "3": "daca",
+            "4": "cb",
+            "5": "abcadabaabaaaaabcaa",
+            "6": "abaaaaabaaaa"
+        },
+        {
+            "-1": "aacaabaa",
+            "-12": "aaabb",
+            "-6": "aaaaabaa",
+            "1": "aababaaaaaaaababaabaa",
+            "8": "aaababacababaa"
+        },
+        {
+            "-12": "baaabaabcaaaaaaaaaabc",
+            "12": "aaaaabbabab",
+            "5": "cbaababaa"
+        },
+        {},
+        {
+            "-9": "caaa",
+            "1": "aaaacabaa",
+            "12": "abcacaaaaa"
+        },
+        {
+            "-12": "abaaaa",
+            "-13": "aaacaa",
+            "-3": "aaaaaaaaba",
+            "-4": "a",
+            "-8": "abbcbaaaa",
+            "9": "bbaaab"
+        },
+        {
+            "-3": "aaaaaca"
+        },
+        {
+            "-11": "ba",
+            "8": "aaa"
+        },
+        {
+            "11": "aaaaa",
+            "13": "aaaaada",
+            "7": "accbaabac"
+        },
+        {
+            "-1": "aaaaacaababaabaaac",
+            "-4": "acaa",
+            "-7": "aaaabb",
+            "1": "bacbaaa",
+            "13": "badaaca",
+            "3": "acaaaaabaaaaaaaaaaa"
+        }
+    ],
+    "seed": 1485712058
+}
diff --git a/golden/MonoidMap Int (Dual [Int]).json b/golden/MonoidMap Int (Dual [Int]).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int (Dual [Int]).json
@@ -0,0 +1,474 @@
+{
+    "samples": [
+        {
+            "-12": [
+                2,
+                3,
+                -11,
+                -4,
+                -3,
+                -3,
+                9,
+                4,
+                -4,
+                5,
+                -1
+            ],
+            "-2": [
+                2,
+                -5,
+                12,
+                -10,
+                -14,
+                1,
+                2,
+                9,
+                -11,
+                5,
+                -9,
+                -10,
+                -11,
+                -13
+            ],
+            "-4": [
+                -14,
+                4,
+                12,
+                -12,
+                -11,
+                2,
+                8,
+                0,
+                11,
+                11
+            ],
+            "-8": [
+                2,
+                9,
+                -14,
+                -4,
+                11,
+                -3
+            ],
+            "12": [
+                3,
+                -9,
+                12,
+                7,
+                14,
+                6
+            ],
+            "4": [
+                -6,
+                10
+            ]
+        },
+        {
+            "-1": [
+                -12,
+                9,
+                2,
+                13,
+                10,
+                1,
+                -4,
+                8
+            ],
+            "-10": [
+                -14,
+                1,
+                -10
+            ],
+            "-11": [
+                -6,
+                6,
+                -7,
+                5,
+                -13,
+                1,
+                9,
+                -11,
+                13,
+                9,
+                -11,
+                14,
+                4,
+                -4
+            ],
+            "-2": [
+                -7,
+                12,
+                1,
+                2,
+                7,
+                -8,
+                8,
+                -4,
+                8
+            ],
+            "-6": [
+                -11,
+                11,
+                13,
+                14,
+                4,
+                3,
+                -1
+            ],
+            "-8": [
+                12,
+                -10,
+                -13,
+                9,
+                -7,
+                -2,
+                -12,
+                7,
+                11,
+                4,
+                -6,
+                -10,
+                -14
+            ],
+            "-9": [
+                -1,
+                -6,
+                -6
+            ],
+            "2": [
+                8,
+                -12,
+                -11,
+                -6,
+                12,
+                5,
+                3,
+                2,
+                -14,
+                14
+            ],
+            "5": [
+                -10,
+                8,
+                4,
+                -14
+            ],
+            "7": [
+                -12,
+                14,
+                -11,
+                -14,
+                11,
+                -5
+            ]
+        },
+        {
+            "-4": [
+                14,
+                12,
+                -9,
+                -7,
+                1,
+                2,
+                13,
+                3,
+                2,
+                14,
+                9,
+                -11,
+                11,
+                -8,
+                -12,
+                0,
+                1,
+                9,
+                -2,
+                7,
+                11,
+                -14,
+                14,
+                -13,
+                2,
+                -1,
+                4
+            ],
+            "-7": [
+                12,
+                7,
+                -9,
+                11,
+                4,
+                -2,
+                9,
+                -5,
+                -2,
+                -7,
+                6
+            ],
+            "-9": [
+                3,
+                3,
+                -3,
+                9,
+                2,
+                6,
+                -4,
+                3,
+                -7,
+                -1
+            ],
+            "13": [
+                3,
+                10,
+                7,
+                -3,
+                -12,
+                -1,
+                -2,
+                6,
+                -11,
+                -11,
+                -4
+            ],
+            "2": [
+                1,
+                11,
+                -2,
+                5
+            ],
+            "5": [
+                12,
+                -9,
+                1,
+                -9
+            ]
+        },
+        {
+            "9": [
+                13,
+                -5,
+                -5,
+                0,
+                -14,
+                9,
+                14,
+                12,
+                13,
+                -14,
+                -5
+            ]
+        },
+        {
+            "-13": [
+                9,
+                4,
+                12
+            ],
+            "-14": [
+                -1,
+                1
+            ],
+            "-2": [
+                -11,
+                4,
+                -2,
+                -6,
+                1,
+                -10,
+                -6,
+                -11,
+                0,
+                -14,
+                -5,
+                -3,
+                14,
+                4,
+                14
+            ],
+            "-4": [
+                14,
+                13,
+                -1,
+                -10,
+                2,
+                7,
+                2,
+                -4,
+                -7,
+                -11,
+                11,
+                1,
+                4,
+                -8
+            ],
+            "-6": [
+                -12,
+                10,
+                14,
+                11,
+                8,
+                11,
+                6,
+                4,
+                -12
+            ],
+            "-7": [
+                -9,
+                -6,
+                -14,
+                10
+            ],
+            "10": [
+                2,
+                -1,
+                -9,
+                -13,
+                6,
+                -11,
+                -2,
+                -7,
+                -12,
+                10,
+                -8,
+                5,
+                14,
+                2
+            ],
+            "11": [
+                3,
+                14
+            ],
+            "13": [
+                -10,
+                1,
+                5,
+                -6,
+                7
+            ],
+            "14": [
+                -3,
+                -10
+            ],
+            "7": [
+                14,
+                -6,
+                3,
+                -11,
+                7,
+                -13
+            ]
+        },
+        {
+            "-6": [
+                14,
+                7,
+                -8,
+                9,
+                0,
+                14,
+                6,
+                2,
+                12,
+                -1,
+                9,
+                -10
+            ],
+            "14": [
+                -13,
+                -14
+            ]
+        },
+        {
+            "-7": [
+                -10,
+                9,
+                5,
+                4,
+                6,
+                -4,
+                14,
+                -10,
+                -7
+            ],
+            "0": [
+                9
+            ],
+            "10": [
+                -5,
+                -5
+            ],
+            "13": [
+                7,
+                14,
+                1,
+                0,
+                3,
+                -3,
+                -10
+            ],
+            "4": [
+                -1,
+                -7,
+                -7,
+                -14,
+                1,
+                -10,
+                3
+            ]
+        },
+        {
+            "-2": [
+                -11,
+                -4
+            ],
+            "10": [
+                0,
+                -6,
+                0,
+                9,
+                -9,
+                -11,
+                -14,
+                9,
+                -1,
+                -4,
+                -11,
+                -4,
+                -6,
+                -5
+            ]
+        },
+        {
+            "-12": [
+                8,
+                0,
+                0
+            ]
+        },
+        {
+            "-14": [
+                0
+            ],
+            "-3": [
+                10,
+                -1,
+                2,
+                -5,
+                8
+            ],
+            "-5": [
+                3,
+                7,
+                -14,
+                -3,
+                -14,
+                6,
+                -11,
+                7,
+                0,
+                -8
+            ]
+        }
+    ],
+    "seed": 823018607
+}
diff --git a/golden/MonoidMap Int (Dual [Natural]).json b/golden/MonoidMap Int (Dual [Natural]).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int (Dual [Natural]).json
@@ -0,0 +1,635 @@
+{
+    "samples": [
+        {
+            "-4": [
+                10,
+                3,
+                9,
+                12,
+                13,
+                3
+            ],
+            "-7": [
+                8,
+                2,
+                10,
+                3,
+                8,
+                12,
+                12,
+                5,
+                14,
+                7
+            ],
+            "12": [
+                14,
+                9,
+                2,
+                9
+            ],
+            "13": [
+                12,
+                13,
+                14
+            ]
+        },
+        {
+            "-11": [
+                14,
+                7,
+                12,
+                8,
+                7,
+                5,
+                1,
+                14
+            ],
+            "-8": [
+                11,
+                12,
+                8,
+                12,
+                4,
+                11,
+                4,
+                14,
+                8,
+                12,
+                14,
+                1
+            ],
+            "5": [
+                1,
+                3,
+                12,
+                3,
+                4
+            ],
+            "8": [
+                5,
+                8,
+                9,
+                10,
+                3,
+                12,
+                3,
+                13,
+                5,
+                7
+            ]
+        },
+        {},
+        {
+            "-3": [
+                5,
+                5,
+                12,
+                11,
+                5,
+                1,
+                4,
+                1,
+                5,
+                10,
+                5
+            ],
+            "6": [
+                1
+            ],
+            "7": [
+                4,
+                7,
+                1,
+                11,
+                12,
+                3,
+                10,
+                10,
+                5
+            ],
+            "8": [
+                9,
+                6,
+                11,
+                5,
+                7,
+                9,
+                14,
+                11
+            ]
+        },
+        {
+            "-1": [
+                13,
+                14,
+                7,
+                6,
+                0,
+                11,
+                6,
+                10,
+                12,
+                12,
+                10
+            ],
+            "-12": [
+                8,
+                9,
+                10,
+                10,
+                14,
+                3,
+                5,
+                9,
+                12,
+                5,
+                11
+            ],
+            "-2": [
+                7,
+                13,
+                3,
+                1,
+                3,
+                14,
+                0,
+                1,
+                7,
+                1,
+                0
+            ],
+            "-4": [
+                3,
+                0,
+                14,
+                7,
+                1,
+                13,
+                5,
+                14,
+                2,
+                1,
+                9,
+                14,
+                1
+            ],
+            "-6": [
+                6,
+                0,
+                9,
+                1,
+                0
+            ],
+            "-9": [
+                7,
+                11,
+                3,
+                4,
+                8,
+                8
+            ],
+            "1": [
+                13,
+                8,
+                9,
+                14
+            ],
+            "13": [
+                1,
+                14,
+                9,
+                9,
+                6,
+                9,
+                11,
+                10,
+                7
+            ],
+            "14": [
+                3,
+                6,
+                7
+            ],
+            "4": [
+                6,
+                8,
+                10,
+                1,
+                2,
+                9,
+                8
+            ],
+            "7": [
+                13,
+                10,
+                13,
+                9,
+                14,
+                14,
+                0,
+                1
+            ]
+        },
+        {
+            "-12": [
+                12,
+                12,
+                14,
+                10
+            ],
+            "-14": [
+                0
+            ],
+            "-6": [
+                12,
+                5,
+                14,
+                3,
+                6,
+                0,
+                5,
+                13,
+                13
+            ],
+            "-7": [
+                14,
+                14,
+                3,
+                12,
+                2,
+                14,
+                2
+            ],
+            "10": [
+                11,
+                8,
+                3,
+                11
+            ],
+            "2": [
+                5,
+                1,
+                5,
+                12,
+                13,
+                12,
+                7,
+                10,
+                3,
+                5,
+                10
+            ]
+        },
+        {
+            "-10": [
+                9,
+                14,
+                3,
+                4,
+                1,
+                12
+            ],
+            "-11": [
+                7,
+                4,
+                4,
+                4,
+                13,
+                3
+            ],
+            "-3": [
+                2,
+                11,
+                12
+            ],
+            "-5": [
+                4,
+                8,
+                2,
+                14,
+                1,
+                6,
+                14,
+                4,
+                0,
+                11
+            ],
+            "-8": [
+                14,
+                5,
+                10,
+                1,
+                14
+            ],
+            "-9": [
+                11,
+                11
+            ],
+            "0": [
+                4,
+                5,
+                2,
+                7,
+                8,
+                5,
+                2,
+                8,
+                3,
+                11,
+                14,
+                6,
+                4,
+                5,
+                1,
+                6,
+                5,
+                11,
+                1,
+                2,
+                4,
+                14,
+                14,
+                3
+            ],
+            "4": [
+                10,
+                3,
+                1,
+                6,
+                8,
+                9,
+                14,
+                14
+            ],
+            "6": [
+                10,
+                10
+            ],
+            "9": [
+                13,
+                13,
+                5,
+                9,
+                11,
+                13,
+                1,
+                13,
+                2
+            ]
+        },
+        {
+            "-4": [
+                9,
+                1,
+                11,
+                5,
+                4,
+                5,
+                0,
+                1,
+                1,
+                10,
+                13,
+                6
+            ],
+            "-6": [
+                0,
+                7,
+                14,
+                9,
+                3,
+                9,
+                1,
+                8,
+                8,
+                8,
+                4,
+                14,
+                10,
+                3
+            ],
+            "-7": [
+                13,
+                1,
+                6
+            ],
+            "2": [
+                14,
+                4,
+                14,
+                14,
+                14,
+                11,
+                12,
+                6
+            ],
+            "4": [
+                14,
+                12,
+                0,
+                9,
+                1,
+                13,
+                0,
+                1,
+                9,
+                8,
+                1
+            ],
+            "5": [
+                5,
+                9,
+                13,
+                1,
+                8,
+                13
+            ]
+        },
+        {
+            "-1": [
+                0,
+                0,
+                6,
+                8,
+                11,
+                3,
+                4,
+                12,
+                12,
+                5
+            ],
+            "-14": [
+                10,
+                0,
+                8,
+                10,
+                9,
+                11
+            ],
+            "-2": [
+                5,
+                7,
+                5,
+                8,
+                12,
+                1,
+                3,
+                2,
+                14,
+                8,
+                10,
+                5,
+                6,
+                2
+            ],
+            "1": [
+                12,
+                1,
+                14,
+                10,
+                2,
+                12,
+                6,
+                8,
+                6,
+                3,
+                9,
+                7,
+                13,
+                0,
+                7,
+                9,
+                4,
+                10,
+                12
+            ],
+            "13": [
+                8,
+                13,
+                13,
+                2,
+                14
+            ],
+            "2": [
+                11,
+                12,
+                10,
+                3,
+                0,
+                8,
+                9,
+                6,
+                1,
+                2,
+                3,
+                8,
+                6
+            ],
+            "3": [
+                7,
+                2,
+                14,
+                1,
+                4,
+                8,
+                2,
+                9,
+                7,
+                2,
+                1
+            ],
+            "9": [
+                0,
+                14,
+                5,
+                5,
+                10,
+                13,
+                12,
+                14,
+                11,
+                6,
+                4,
+                13,
+                11
+            ]
+        },
+        {
+            "-5": [
+                10,
+                12,
+                13,
+                7,
+                14,
+                7,
+                5,
+                6,
+                10
+            ],
+            "-6": [
+                13,
+                1
+            ],
+            "11": [
+                14,
+                8,
+                11,
+                14,
+                2,
+                9,
+                4,
+                14,
+                11,
+                4
+            ],
+            "14": [
+                10,
+                8,
+                6,
+                4,
+                8,
+                7,
+                6,
+                3,
+                8,
+                10,
+                6,
+                13,
+                3,
+                12,
+                13,
+                9,
+                4,
+                6,
+                6,
+                6,
+                14,
+                13,
+                1,
+                10,
+                4
+            ],
+            "5": [
+                9,
+                13,
+                6
+            ],
+            "8": [
+                13,
+                14,
+                8,
+                13,
+                13,
+                6,
+                5,
+                11,
+                4,
+                3,
+                10,
+                13,
+                10
+            ]
+        }
+    ],
+    "seed": 124644754
+}
diff --git a/golden/MonoidMap Int (MonoidMap (Key 2) (Sum Int)).json b/golden/MonoidMap Int (MonoidMap (Key 2) (Sum Int)).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int (MonoidMap (Key 2) (Sum Int)).json
@@ -0,0 +1,230 @@
+{
+    "samples": [
+        {},
+        {
+            "-13": {
+                "A": -12,
+                "B": 19,
+                "C": -23,
+                "D": -10
+            },
+            "-4": {
+                "C": -8
+            }
+        },
+        {
+            "-14": {
+                "B": 3,
+                "C": -7,
+                "D": -18
+            },
+            "0": {
+                "A": -10,
+                "C": -8,
+                "D": -7
+            },
+            "2": {
+                "B": -22,
+                "C": -7,
+                "D": 8
+            },
+            "3": {
+                "A": 6,
+                "B": 5,
+                "C": -16
+            }
+        },
+        {
+            "-5": {
+                "A": 31,
+                "B": 5,
+                "C": -1,
+                "D": 2
+            },
+            "1": {
+                "C": -5,
+                "D": 12
+            },
+            "11": {
+                "A": -5,
+                "B": -29,
+                "C": -8,
+                "D": 1
+            },
+            "2": {
+                "A": 31,
+                "B": 39,
+                "C": -21,
+                "D": -40
+            },
+            "3": {
+                "A": -14,
+                "B": 12,
+                "C": 5,
+                "D": -5
+            },
+            "8": {
+                "A": -4,
+                "B": 12,
+                "C": -5,
+                "D": 7
+            },
+            "9": {
+                "A": -24,
+                "B": -5,
+                "D": 6
+            }
+        },
+        {
+            "-2": {
+                "A": 5,
+                "B": -12
+            },
+            "-6": {
+                "A": -12,
+                "B": 2,
+                "C": -4
+            },
+            "2": {
+                "A": 2
+            }
+        },
+        {
+            "-12": {
+                "A": 6,
+                "C": 12,
+                "D": 17
+            },
+            "-13": {
+                "A": -4,
+                "B": -1,
+                "D": -19
+            },
+            "-7": {
+                "A": -4,
+                "B": -3,
+                "C": 17,
+                "D": 17
+            },
+            "12": {
+                "A": -4,
+                "B": 9,
+                "C": -14
+            },
+            "13": {
+                "A": 26,
+                "B": 2,
+                "C": -6,
+                "D": -7
+            },
+            "14": {
+                "A": 5,
+                "B": 8,
+                "C": -10,
+                "D": -1
+            },
+            "2": {
+                "B": 8,
+                "C": -9,
+                "D": -5
+            }
+        },
+        {
+            "-10": {
+                "A": 6
+            },
+            "-12": {
+                "C": 10
+            },
+            "-14": {
+                "A": -21,
+                "B": 37,
+                "C": 21,
+                "D": 10
+            },
+            "10": {
+                "B": 10,
+                "C": -1
+            },
+            "6": {
+                "A": -30,
+                "B": -7,
+                "C": -7,
+                "D": 15
+            }
+        },
+        {
+            "-5": {
+                "A": 11,
+                "C": 20,
+                "D": -9
+            },
+            "-8": {
+                "A": 19,
+                "B": -7
+            },
+            "0": {
+                "A": 8,
+                "B": 11,
+                "D": -3
+            },
+            "10": {
+                "A": 5,
+                "B": -24,
+                "D": -3
+            },
+            "11": {
+                "C": 6,
+                "D": -10
+            },
+            "7": {
+                "C": -8
+            }
+        },
+        {
+            "-3": {
+                "A": 12,
+                "C": 2,
+                "D": 3
+            },
+            "-9": {
+                "B": -10,
+                "C": -5,
+                "D": 6
+            },
+            "12": {
+                "A": -22,
+                "B": 6,
+                "C": -9,
+                "D": 4
+            },
+            "2": {
+                "A": 7
+            }
+        },
+        {
+            "-12": {
+                "A": 9,
+                "C": -9,
+                "D": 19
+            },
+            "-9": {
+                "A": 2,
+                "B": 2,
+                "C": 1,
+                "D": 2
+            },
+            "13": {
+                "A": -22,
+                "C": -24,
+                "D": 20
+            },
+            "5": {
+                "A": 31,
+                "B": -4,
+                "D": -1
+            }
+        }
+    ],
+    "seed": -1302115327
+}
diff --git a/golden/MonoidMap Int (MonoidMap (Key 2) (Sum Natural)).json b/golden/MonoidMap Int (MonoidMap (Key 2) (Sum Natural)).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int (MonoidMap (Key 2) (Sum Natural)).json
@@ -0,0 +1,242 @@
+{
+    "samples": [
+        {
+            "-10": {
+                "A": 1,
+                "B": 4,
+                "C": 8,
+                "D": 30
+            },
+            "-2": {
+                "A": 26,
+                "B": 27,
+                "C": 13,
+                "D": 1
+            },
+            "-7": {
+                "B": 9,
+                "C": 3
+            }
+        },
+        {
+            "-1": {
+                "A": 29,
+                "B": 7
+            },
+            "-6": {
+                "A": 34,
+                "B": 5,
+                "D": 9
+            },
+            "-8": {
+                "B": 12,
+                "C": 18,
+                "D": 12
+            },
+            "0": {
+                "A": 17,
+                "B": 14,
+                "C": 17,
+                "D": 33
+            },
+            "3": {
+                "A": 31,
+                "B": 12,
+                "C": 5
+            }
+        },
+        {
+            "4": {
+                "A": 5,
+                "B": 5,
+                "C": 13,
+                "D": 35
+            },
+            "5": {
+                "A": 1,
+                "B": 13,
+                "C": 17,
+                "D": 12
+            },
+            "6": {
+                "A": 48,
+                "B": 19,
+                "C": 42,
+                "D": 20
+            },
+            "8": {
+                "A": 6,
+                "B": 57,
+                "C": 14,
+                "D": 19
+            }
+        },
+        {
+            "-12": {
+                "A": 13,
+                "B": 3,
+                "C": 28,
+                "D": 39
+            }
+        },
+        {
+            "-13": {
+                "A": 6,
+                "B": 12,
+                "C": 29,
+                "D": 26
+            },
+            "-6": {
+                "A": 11,
+                "C": 3
+            },
+            "13": {
+                "A": 3
+            },
+            "14": {
+                "A": 5,
+                "B": 4
+            }
+        },
+        {
+            "-2": {
+                "A": 41,
+                "B": 22,
+                "C": 33,
+                "D": 39
+            },
+            "-3": {
+                "A": 17,
+                "B": 3,
+                "C": 9,
+                "D": 30
+            },
+            "-4": {
+                "A": 17,
+                "B": 21,
+                "C": 31,
+                "D": 8
+            }
+        },
+        {
+            "-11": {
+                "A": 10,
+                "B": 2,
+                "C": 2,
+                "D": 28
+            },
+            "-3": {
+                "A": 43,
+                "B": 21,
+                "C": 27,
+                "D": 26
+            },
+            "-4": {
+                "A": 22,
+                "B": 15,
+                "C": 6
+            },
+            "-9": {
+                "B": 12
+            },
+            "0": {
+                "C": 13
+            },
+            "11": {
+                "A": 14,
+                "B": 5,
+                "C": 23,
+                "D": 29
+            },
+            "3": {
+                "A": 43
+            },
+            "4": {
+                "A": 17,
+                "C": 21,
+                "D": 8
+            }
+        },
+        {
+            "-11": {
+                "A": 38,
+                "B": 13,
+                "C": 10,
+                "D": 49
+            },
+            "-13": {
+                "A": 3,
+                "C": 19,
+                "D": 17
+            },
+            "-4": {
+                "C": 14
+            },
+            "-7": {
+                "A": 22,
+                "B": 22,
+                "C": 20,
+                "D": 19
+            },
+            "10": {
+                "A": 9,
+                "C": 45,
+                "D": 28
+            },
+            "2": {
+                "A": 7,
+                "B": 48,
+                "C": 29,
+                "D": 14
+            },
+            "3": {
+                "A": 26,
+                "B": 19,
+                "C": 38,
+                "D": 42
+            },
+            "9": {
+                "A": 28,
+                "B": 13,
+                "C": 10,
+                "D": 8
+            }
+        },
+        {
+            "-10": {
+                "A": 8,
+                "C": 4,
+                "D": 7
+            },
+            "10": {
+                "A": 4,
+                "C": 10,
+                "D": 16
+            },
+            "14": {
+                "A": 10,
+                "B": 11,
+                "C": 14,
+                "D": 19
+            }
+        },
+        {
+            "-4": {
+                "A": 20,
+                "B": 19,
+                "C": 40,
+                "D": 14
+            },
+            "6": {
+                "A": 11,
+                "B": 13
+            },
+            "8": {
+                "A": 24,
+                "B": 8,
+                "C": 20
+            }
+        }
+    ],
+    "seed": 51041275
+}
diff --git a/golden/MonoidMap Int (Product Int).json b/golden/MonoidMap Int (Product Int).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int (Product Int).json
@@ -0,0 +1,90 @@
+{
+    "samples": [
+        {
+            "-13": 2,
+            "-14": 12,
+            "-6": 6,
+            "10": 55,
+            "11": -12,
+            "12": 8,
+            "14": -112,
+            "9": -4
+        },
+        {
+            "-11": 10
+        },
+        {
+            "-1": -9,
+            "-11": 4,
+            "-13": -9,
+            "0": 4,
+            "10": -130,
+            "11": 11,
+            "14": 9,
+            "2": -3,
+            "6": -7
+        },
+        {
+            "-1": 5,
+            "-3": -8,
+            "-4": 3,
+            "-5": 9,
+            "-7": -11,
+            "-8": 14,
+            "6": 0,
+            "7": 7,
+            "8": -10,
+            "9": 8
+        },
+        {
+            "-1": -13,
+            "-9": -14,
+            "0": -143,
+            "12": 11,
+            "5": 9
+        },
+        {
+            "-2": -100,
+            "-6": 14,
+            "9": -2
+        },
+        {
+            "-10": -9,
+            "-4": -10,
+            "-5": 3,
+            "-6": 60,
+            "-9": -10,
+            "0": -1,
+            "10": 6,
+            "11": -4,
+            "4": -1
+        },
+        {
+            "-13": -8,
+            "-2": 9,
+            "14": -11
+        },
+        {
+            "-1": -10,
+            "-10": 9,
+            "0": 9,
+            "11": 156,
+            "2": -5,
+            "6": -13,
+            "8": 4,
+            "9": 5
+        },
+        {
+            "-10": 0,
+            "-13": -6,
+            "-3": -12,
+            "-9": 9,
+            "1": -14,
+            "12": -11,
+            "13": -18,
+            "3": -4,
+            "7": -30
+        }
+    ],
+    "seed": -1160880579
+}
diff --git a/golden/MonoidMap Int (Product Natural).json b/golden/MonoidMap Int (Product Natural).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int (Product Natural).json
@@ -0,0 +1,65 @@
+{
+    "samples": [
+        {
+            "-13": 70,
+            "-6": 13,
+            "-7": 13,
+            "-8": 0,
+            "0": 10,
+            "10": 13,
+            "14": 11,
+            "6": 0
+        },
+        {
+            "-11": 4,
+            "3": 5
+        },
+        {
+            "-13": 5,
+            "1": 7,
+            "5": 12
+        },
+        {
+            "-2": 4,
+            "0": 3,
+            "2": 12,
+            "9": 3
+        },
+        {
+            "-4": 2
+        },
+        {
+            "-12": 8,
+            "14": 12,
+            "4": 10,
+            "6": 3
+        },
+        {
+            "-12": 5,
+            "-13": 7,
+            "-14": 0,
+            "-4": 5,
+            "-5": 88,
+            "6": 9
+        },
+        {},
+        {
+            "-11": 3,
+            "-12": 0,
+            "-13": 5,
+            "-9": 3
+        },
+        {
+            "-12": 11,
+            "-2": 6,
+            "-5": 13,
+            "-8": 4,
+            "13": 56,
+            "14": 7,
+            "4": 0,
+            "5": 5,
+            "9": 8
+        }
+    ],
+    "seed": -1543741490
+}
diff --git a/golden/MonoidMap Int (Set Int).json b/golden/MonoidMap Int (Set Int).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int (Set Int).json
@@ -0,0 +1,491 @@
+{
+    "samples": [
+        {
+            "-10": [
+                -8,
+                -4,
+                -3,
+                -2,
+                1,
+                4,
+                5,
+                8
+            ],
+            "-14": [
+                -14,
+                -12,
+                -10,
+                -9,
+                -3,
+                -1,
+                8,
+                9,
+                14
+            ],
+            "-5": [
+                -14,
+                -13,
+                -11,
+                -9,
+                -8,
+                -7,
+                -2,
+                11,
+                13
+            ],
+            "0": [
+                -13,
+                -9,
+                -6,
+                -5,
+                -4,
+                -3,
+                -2,
+                -1,
+                2,
+                4,
+                5,
+                9,
+                12,
+                13
+            ],
+            "13": [
+                -14,
+                -13,
+                -12,
+                -10,
+                -5,
+                3,
+                5,
+                12,
+                13,
+                14
+            ],
+            "2": [
+                -13,
+                -7,
+                -4,
+                -1,
+                2,
+                4,
+                10,
+                11,
+                13,
+                14
+            ]
+        },
+        {
+            "-11": [
+                -14,
+                -13,
+                -11,
+                -8,
+                -2,
+                -1,
+                11,
+                12
+            ],
+            "-13": [
+                -14,
+                -13,
+                -12,
+                -9,
+                -6,
+                3,
+                9,
+                10,
+                11,
+                13,
+                14
+            ],
+            "-6": [
+                -11,
+                -8,
+                -4,
+                0,
+                2,
+                3,
+                6,
+                8,
+                14
+            ],
+            "0": [
+                -6,
+                -5,
+                -2
+            ],
+            "1": [
+                -13,
+                -11,
+                -8,
+                -4,
+                -3,
+                0,
+                3,
+                5,
+                7,
+                10,
+                14
+            ],
+            "2": [
+                -12,
+                -7,
+                -4,
+                -3,
+                -2,
+                1,
+                10,
+                14
+            ],
+            "5": [
+                -12,
+                -9,
+                -4,
+                -1,
+                1,
+                2,
+                3,
+                14
+            ],
+            "6": [
+                -14,
+                4
+            ]
+        },
+        {
+            "-13": [
+                -12,
+                -6,
+                -3,
+                -1,
+                0,
+                2,
+                7,
+                9,
+                11,
+                12
+            ],
+            "-3": [
+                -5,
+                1,
+                4
+            ],
+            "14": [
+                -13,
+                -12,
+                1,
+                6,
+                7,
+                8,
+                13
+            ],
+            "6": [
+                -14,
+                -13,
+                -8,
+                3,
+                4,
+                6,
+                9,
+                14
+            ]
+        },
+        {
+            "-12": [
+                -13,
+                -12,
+                -6,
+                -1,
+                0,
+                5,
+                9,
+                11
+            ],
+            "-13": [
+                -14,
+                -13,
+                -12,
+                -3,
+                1,
+                2,
+                4,
+                6,
+                7,
+                9,
+                10
+            ],
+            "-4": [
+                -12,
+                5,
+                11
+            ],
+            "-6": [
+                9
+            ],
+            "-7": [
+                -9,
+                -7,
+                -6,
+                -4,
+                -2,
+                0,
+                2,
+                5,
+                11
+            ],
+            "14": [
+                -13,
+                -12,
+                -9,
+                -8,
+                -6,
+                -5,
+                0,
+                6,
+                11,
+                13
+            ],
+            "7": [
+                -11,
+                -8,
+                -4,
+                0,
+                5,
+                7,
+                12,
+                14
+            ]
+        },
+        {},
+        {
+            "-1": [
+                -14,
+                -7,
+                -6,
+                -5,
+                -1,
+                6,
+                8,
+                9
+            ],
+            "-2": [
+                -12,
+                -8,
+                -7,
+                -3,
+                2
+            ],
+            "0": [
+                -12,
+                -7,
+                -1,
+                3,
+                9,
+                13
+            ],
+            "1": [
+                -14,
+                -11,
+                -10,
+                -7,
+                -4,
+                2,
+                3,
+                8,
+                11
+            ],
+            "13": [
+                -14,
+                -13,
+                -8,
+                -7,
+                -4,
+                -2,
+                1,
+                2,
+                3,
+                5,
+                7,
+                8,
+                10,
+                12,
+                13,
+                14
+            ],
+            "14": [
+                -11,
+                -8,
+                0,
+                1,
+                2,
+                5,
+                8,
+                10,
+                11,
+                13
+            ],
+            "5": [
+                -6,
+                1,
+                4
+            ],
+            "6": [
+                -14,
+                -6,
+                -2
+            ],
+            "7": [
+                -14,
+                -12,
+                -11,
+                -9,
+                -7,
+                -6,
+                -5,
+                -3,
+                0,
+                2,
+                4,
+                5,
+                8,
+                9,
+                10,
+                11,
+                12,
+                14
+            ]
+        },
+        {
+            "-6": [
+                3,
+                4,
+                6,
+                13
+            ],
+            "7": [
+                -10,
+                -9,
+                -1,
+                0,
+                1,
+                5
+            ],
+            "8": [
+                -14,
+                -13,
+                -12,
+                -3,
+                -2,
+                -1,
+                6,
+                7
+            ]
+        },
+        {
+            "-10": [
+                -14,
+                3,
+                11,
+                12,
+                13
+            ],
+            "-13": [
+                4,
+                6,
+                9,
+                13
+            ],
+            "-6": [
+                -14,
+                -9,
+                -7,
+                -4,
+                2,
+                3,
+                13,
+                14
+            ],
+            "11": [
+                -5,
+                4,
+                6
+            ],
+            "12": [
+                -11,
+                -3,
+                -2,
+                13
+            ],
+            "6": [
+                -7,
+                -3,
+                -2,
+                -1,
+                4,
+                14
+            ]
+        },
+        {
+            "-1": [
+                -8,
+                -4,
+                2,
+                5,
+                7,
+                11,
+                12,
+                13
+            ]
+        },
+        {
+            "10": [
+                -14,
+                -11,
+                -10,
+                -9,
+                -6,
+                -1,
+                0,
+                4,
+                5,
+                9,
+                13
+            ],
+            "12": [
+                -12,
+                8,
+                12
+            ],
+            "13": [
+                -13,
+                -5,
+                -4,
+                -3,
+                0,
+                6,
+                10,
+                11
+            ],
+            "7": [
+                -3,
+                7,
+                8
+            ],
+            "8": [
+                -14,
+                -13,
+                -12,
+                -11,
+                -6
+            ],
+            "9": [
+                -3,
+                4,
+                6,
+                7,
+                12
+            ]
+        }
+    ],
+    "seed": 725583516
+}
diff --git a/golden/MonoidMap Int (Set Natural).json b/golden/MonoidMap Int (Set Natural).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int (Set Natural).json
@@ -0,0 +1,323 @@
+{
+    "samples": [
+        {
+            "-11": [
+                2,
+                7,
+                8,
+                10,
+                12,
+                14
+            ],
+            "-14": [
+                1,
+                2,
+                4,
+                5,
+                6,
+                9,
+                10,
+                11,
+                12,
+                13,
+                14
+            ],
+            "-2": [
+                7,
+                10,
+                11
+            ],
+            "-3": [
+                0,
+                2,
+                3,
+                6,
+                9,
+                12,
+                13
+            ],
+            "-6": [
+                0,
+                1,
+                3,
+                8,
+                9
+            ],
+            "11": [
+                2,
+                6,
+                7,
+                9,
+                10,
+                12,
+                13
+            ],
+            "8": [
+                0,
+                5,
+                7,
+                9,
+                11
+            ]
+        },
+        {
+            "-10": [
+                3,
+                9,
+                11
+            ],
+            "-11": [
+                12
+            ],
+            "6": [
+                2
+            ]
+        },
+        {
+            "-12": [
+                3,
+                4,
+                10,
+                13
+            ],
+            "-8": [
+                0,
+                1,
+                4,
+                6,
+                9,
+                10,
+                11,
+                12,
+                13
+            ],
+            "11": [
+                4
+            ]
+        },
+        {
+            "11": [
+                4,
+                7,
+                12
+            ]
+        },
+        {
+            "-13": [
+                1,
+                8,
+                12,
+                14
+            ],
+            "-3": [
+                4,
+                5,
+                6,
+                7,
+                9,
+                10,
+                12,
+                13
+            ],
+            "-9": [
+                0,
+                1,
+                3,
+                5,
+                6,
+                7,
+                10,
+                11,
+                12,
+                13,
+                14
+            ],
+            "1": [
+                1,
+                2,
+                12
+            ],
+            "10": [
+                0,
+                1,
+                9,
+                11,
+                12,
+                13,
+                14
+            ],
+            "11": [
+                0,
+                1,
+                4,
+                5,
+                7,
+                9,
+                12,
+                13,
+                14
+            ]
+        },
+        {
+            "-1": [
+                1,
+                3,
+                4,
+                7,
+                8,
+                9,
+                10,
+                11,
+                12
+            ],
+            "-12": [
+                0,
+                4,
+                9,
+                10,
+                11,
+                13
+            ],
+            "-14": [
+                1,
+                7,
+                10
+            ],
+            "-4": [
+                0,
+                14
+            ],
+            "2": [
+                2,
+                3,
+                7,
+                10,
+                11,
+                14
+            ],
+            "6": [
+                0,
+                1,
+                6,
+                7,
+                9,
+                10,
+                11,
+                13
+            ]
+        },
+        {
+            "-14": [
+                0,
+                1,
+                2,
+                3,
+                4,
+                5,
+                6,
+                8,
+                9,
+                12,
+                13
+            ],
+            "-3": [
+                2,
+                6,
+                7,
+                10,
+                12
+            ],
+            "-4": [
+                0,
+                1,
+                4,
+                5,
+                14
+            ],
+            "-9": [
+                0,
+                2,
+                3,
+                5,
+                6,
+                7,
+                9,
+                10,
+                12,
+                13,
+                14
+            ],
+            "0": [
+                3,
+                5,
+                6,
+                7,
+                9
+            ],
+            "1": [
+                0,
+                5,
+                9,
+                11,
+                13
+            ],
+            "10": [
+                1,
+                6,
+                10,
+                11,
+                14
+            ],
+            "14": [
+                0,
+                1,
+                3,
+                4,
+                8,
+                9,
+                10,
+                11,
+                13,
+                14
+            ]
+        },
+        {
+            "-2": [
+                0,
+                1,
+                3,
+                4,
+                9,
+                10,
+                12
+            ],
+            "11": [
+                6,
+                13,
+                14
+            ],
+            "4": [
+                1,
+                5
+            ],
+            "7": [
+                0,
+                1,
+                4,
+                6,
+                9,
+                12
+            ]
+        },
+        {},
+        {
+            "-12": [
+                0,
+                4,
+                11,
+                13
+            ]
+        }
+    ],
+    "seed": 83482652
+}
diff --git a/golden/MonoidMap Int (Sum Int).json b/golden/MonoidMap Int (Sum Int).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int (Sum Int).json
@@ -0,0 +1,81 @@
+{
+    "samples": [
+        {
+            "-1": -7,
+            "-14": 18,
+            "-5": -13,
+            "10": 13
+        },
+        {
+            "-11": 10,
+            "-12": 4,
+            "-13": -7,
+            "-3": -5,
+            "-9": -13,
+            "12": 5,
+            "8": 2
+        },
+        {
+            "-1": 9,
+            "-12": 3,
+            "-4": -9,
+            "0": 13,
+            "10": -6,
+            "3": -10,
+            "5": 1,
+            "8": -3
+        },
+        {
+            "-12": -9,
+            "-13": 11,
+            "-14": 14,
+            "-3": 4,
+            "5": -2
+        },
+        {
+            "-12": -14,
+            "12": 3,
+            "8": -7
+        },
+        {
+            "-13": -6,
+            "-14": -6,
+            "-3": 5,
+            "13": -32,
+            "14": -11,
+            "5": -5,
+            "7": -11
+        },
+        {
+            "-14": -12,
+            "-3": 12,
+            "-9": 11,
+            "5": -1
+        },
+        {
+            "-11": -5,
+            "-4": 2,
+            "14": 9,
+            "4": -7,
+            "5": -3,
+            "6": -6
+        },
+        {
+            "-12": -3,
+            "-9": 3
+        },
+        {
+            "-10": 7,
+            "-12": 11,
+            "-2": 3,
+            "-7": 10,
+            "1": 7,
+            "11": -14,
+            "2": 4,
+            "3": -3,
+            "8": -11,
+            "9": 12
+        }
+    ],
+    "seed": 1819141666
+}
diff --git a/golden/MonoidMap Int (Sum Natural).json b/golden/MonoidMap Int (Sum Natural).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int (Sum Natural).json
@@ -0,0 +1,90 @@
+{
+    "samples": [
+        {
+            "-3": 10,
+            "-6": 1,
+            "14": 12
+        },
+        {
+            "-1": 8,
+            "-2": 10,
+            "-6": 4,
+            "-9": 10,
+            "1": 8,
+            "10": 1,
+            "4": 18,
+            "6": 4,
+            "7": 1,
+            "8": 7
+        },
+        {
+            "-1": 7,
+            "-10": 12,
+            "-12": 13,
+            "-13": 4,
+            "-4": 15,
+            "-6": 8,
+            "-8": 9,
+            "0": 12,
+            "11": 11,
+            "6": 1,
+            "8": 2
+        },
+        {
+            "-1": 3,
+            "-12": 10,
+            "-6": 7,
+            "-9": 18,
+            "0": 8,
+            "3": 7
+        },
+        {
+            "-13": 8,
+            "3": 4,
+            "6": 1
+        },
+        {
+            "-10": 9,
+            "-11": 15,
+            "-12": 8,
+            "-14": 10,
+            "-5": 5,
+            "-6": 10,
+            "1": 1,
+            "2": 5,
+            "3": 10,
+            "5": 13,
+            "8": 7,
+            "9": 13
+        },
+        {
+            "-5": 2,
+            "7": 13,
+            "8": 5
+        },
+        {},
+        {
+            "-14": 10,
+            "0": 16,
+            "10": 10,
+            "13": 8,
+            "8": 5,
+            "9": 12
+        },
+        {
+            "-1": 9,
+            "-11": 10,
+            "-2": 3,
+            "-5": 12,
+            "-8": 10,
+            "0": 10,
+            "1": 3,
+            "11": 8,
+            "2": 12,
+            "4": 9,
+            "5": 6,
+            "7": 18
+        }
+    ],
+    "seed": -1247587153
+}
diff --git a/golden/MonoidMap Int Text.json b/golden/MonoidMap Int Text.json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int Text.json
@@ -0,0 +1,88 @@
+{
+    "samples": [
+        {
+            "-1": "aa",
+            "-14": "aaadaaaaaaa",
+            "-4": "bacaaba",
+            "12": "acbaaa",
+            "8": "aaaa"
+        },
+        {
+            "-10": "aaaaabab",
+            "-3": "daaacbaaaabcaaaaa",
+            "-6": "aaa",
+            "-7": "baaaab",
+            "-8": "caaaabaabcaaca",
+            "-9": "bab",
+            "5": "aa",
+            "7": "aba",
+            "9": "abba"
+        },
+        {
+            "-14": "abaa",
+            "-2": "abaaaa",
+            "10": "bababaaba",
+            "6": "aaabaaaaabcaa"
+        },
+        {
+            "-11": "aaadaaaa",
+            "-13": "caaaaaaaba",
+            "-14": "aaabaaaaaba",
+            "1": "aabdabababadaa",
+            "2": "baa",
+            "8": "aaabaaaaabaaaaaabaca",
+            "9": "aa"
+        },
+        {
+            "-10": "aa",
+            "-5": "aaaaaabaa",
+            "-9": "aabaaaababaaadaaaaabaaa",
+            "10": "aa"
+        },
+        {
+            "-1": "bbcaaaaaaaaaa",
+            "-10": "aaaaaaaabbaaaaaaabaaa",
+            "-3": "aabaaabaaaaabaaabcaaa",
+            "-4": "bba",
+            "-5": "aba",
+            "-8": "aaaaaa",
+            "0": "baaaa",
+            "2": "baababaaacb",
+            "6": "aab"
+        },
+        {
+            "-14": "caaaaaabcbaa",
+            "11": "baaaaaa",
+            "8": "aabaaaa",
+            "9": "aaa"
+        },
+        {
+            "-3": "abaaaaaaaaaa",
+            "-4": "aaaaaaaaaaa",
+            "-6": "caaaaaababaaab",
+            "-8": "abaaabaaa",
+            "0": "abaacb",
+            "1": "aa",
+            "11": "abb",
+            "4": "a",
+            "7": "baaaaaacaaabaaabcad",
+            "9": "aaaaaaaabacbaabaabaaaaaa"
+        },
+        {
+            "-7": "babacaaabbaac",
+            "4": "a"
+        },
+        {
+            "-13": "aabaa",
+            "-14": "aba",
+            "-2": "aaabaaaa",
+            "-4": "a",
+            "-5": "ab",
+            "-9": "aaaaaaaaaa",
+            "13": "b",
+            "8": "bcbbaaaaaaaaaa",
+            "9": "abbaaaaab"
+        }
+    ],
+    "seed": 1346316189
+}
diff --git a/golden/MonoidMap Int [Int].json b/golden/MonoidMap Int [Int].json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int [Int].json
@@ -0,0 +1,864 @@
+{
+    "samples": [
+        {
+            "-1": [
+                -10,
+                10,
+                1,
+                14,
+                2,
+                10
+            ],
+            "-13": [
+                -12,
+                -12,
+                -2,
+                5,
+                -10,
+                -7,
+                -12,
+                -2,
+                8,
+                -13,
+                -9,
+                -3,
+                1,
+                -6,
+                -7,
+                -12,
+                1,
+                4,
+                -8,
+                -14
+            ],
+            "-4": [
+                5,
+                -6,
+                1,
+                1,
+                0,
+                10,
+                -12,
+                1
+            ],
+            "-6": [
+                -13,
+                -4,
+                5,
+                -12
+            ],
+            "0": [
+                -9,
+                -12,
+                -4,
+                6,
+                13,
+                5,
+                -6,
+                -3,
+                -7,
+                -11,
+                -1,
+                -9,
+                1
+            ],
+            "11": [
+                -13,
+                13,
+                -6,
+                2,
+                -13,
+                1,
+                5
+            ],
+            "3": [
+                12
+            ],
+            "9": [
+                -1,
+                -11,
+                10,
+                4,
+                13,
+                11,
+                -9,
+                6,
+                6,
+                9,
+                -6,
+                2,
+                -2,
+                -6,
+                -11,
+                -9,
+                -8,
+                3,
+                0,
+                8,
+                -1,
+                0,
+                -3,
+                -8,
+                6,
+                -7,
+                -4,
+                4,
+                2,
+                1,
+                -13,
+                7,
+                -13
+            ]
+        },
+        {},
+        {
+            "-10": [
+                1
+            ],
+            "-4": [
+                -4,
+                -7,
+                -7,
+                14,
+                4,
+                -12,
+                -1,
+                -5,
+                -7,
+                -5,
+                7,
+                -11,
+                12,
+                -6,
+                0,
+                12,
+                0,
+                6,
+                -8,
+                2,
+                -9,
+                1,
+                -3,
+                12,
+                -12,
+                -6,
+                13,
+                0,
+                -1,
+                -12
+            ],
+            "-8": [
+                7,
+                -5,
+                -9,
+                -8,
+                -13
+            ],
+            "0": [
+                -10,
+                -14,
+                4,
+                2,
+                -7,
+                5,
+                8,
+                -8,
+                -12,
+                -1,
+                -7,
+                0,
+                -3,
+                -1,
+                -7,
+                3,
+                -8,
+                7
+            ],
+            "11": [
+                0,
+                2,
+                -5,
+                -6
+            ],
+            "13": [
+                4,
+                14,
+                -1,
+                11,
+                -2,
+                -8,
+                12,
+                -11
+            ],
+            "3": [
+                4,
+                -12,
+                -8,
+                -8,
+                0,
+                2
+            ],
+            "7": [
+                11,
+                2,
+                -4,
+                -10,
+                14,
+                -7,
+                7,
+                5,
+                -7,
+                9,
+                11,
+                10,
+                10
+            ],
+            "8": [
+                5,
+                9,
+                8,
+                -13,
+                1,
+                -14,
+                12
+            ]
+        },
+        {
+            "-10": [
+                7,
+                12,
+                1,
+                -3,
+                -12,
+                -6
+            ],
+            "-12": [
+                -2,
+                8,
+                -5,
+                -14,
+                11,
+                4,
+                -9,
+                12,
+                -14,
+                -12,
+                0,
+                11,
+                -10
+            ],
+            "-13": [
+                0,
+                -6,
+                -10,
+                11,
+                14,
+                -9,
+                13,
+                -11,
+                -14,
+                9,
+                9,
+                1,
+                13
+            ],
+            "-14": [
+                6,
+                -1,
+                -10,
+                13,
+                13,
+                -8,
+                -9,
+                -5,
+                5,
+                4,
+                -2,
+                12,
+                -2
+            ],
+            "-6": [
+                0,
+                6,
+                9,
+                -2,
+                3,
+                -2,
+                -4,
+                -5,
+                -4,
+                -5,
+                -10,
+                -13
+            ],
+            "1": [
+                12,
+                9,
+                13,
+                -9,
+                14,
+                7,
+                6,
+                -13,
+                7,
+                14,
+                -9,
+                -12,
+                -7,
+                -10,
+                14,
+                -13
+            ],
+            "14": [
+                12,
+                11,
+                1,
+                2,
+                3,
+                -7,
+                4,
+                -1,
+                13,
+                -8,
+                -14,
+                -4,
+                -10,
+                -8,
+                -2,
+                6,
+                7,
+                8,
+                14,
+                13
+            ],
+            "2": [
+                -9,
+                -9,
+                14
+            ],
+            "5": [
+                -6,
+                -12,
+                -3,
+                0,
+                -2,
+                -13,
+                -6
+            ],
+            "6": [
+                14,
+                11,
+                -10,
+                -1,
+                8,
+                -9,
+                -11,
+                -14,
+                8,
+                -1
+            ]
+        },
+        {
+            "-1": [
+                10,
+                5,
+                -5,
+                3,
+                -1,
+                -12,
+                13,
+                -4,
+                -14,
+                -12,
+                13,
+                -6
+            ],
+            "-12": [
+                -13,
+                4,
+                6,
+                -14
+            ],
+            "-14": [
+                -8,
+                -6,
+                -2,
+                -6,
+                -12,
+                0,
+                -7,
+                -5,
+                -12,
+                -8,
+                12
+            ],
+            "-5": [
+                -10,
+                9,
+                -9,
+                -8,
+                -1
+            ],
+            "-7": [
+                0,
+                2,
+                -2,
+                -12,
+                4,
+                1,
+                -8,
+                9,
+                -9,
+                7,
+                -1,
+                -10,
+                8,
+                -9,
+                13,
+                -14,
+                -8,
+                -14,
+                -4
+            ],
+            "-8": [
+                -7,
+                -9,
+                -5,
+                -11
+            ],
+            "13": [
+                -2,
+                -14,
+                -3,
+                2
+            ],
+            "14": [
+                4,
+                -11,
+                -8,
+                -1,
+                0,
+                14,
+                3,
+                0
+            ],
+            "4": [
+                1,
+                4
+            ],
+            "5": [
+                1,
+                -1,
+                9,
+                3,
+                5,
+                -11,
+                -12,
+                -1,
+                -7,
+                10,
+                -2
+            ],
+            "7": [
+                -6,
+                -2
+            ],
+            "9": [
+                4,
+                6,
+                -1,
+                -8,
+                -2,
+                8,
+                -2
+            ]
+        },
+        {
+            "-14": [
+                -3,
+                -12,
+                13,
+                -2,
+                -1,
+                -11,
+                0,
+                14,
+                -5,
+                -10,
+                -3,
+                -5
+            ],
+            "-5": [
+                -8,
+                3,
+                14,
+                -11,
+                -3,
+                -8,
+                -9,
+                9,
+                8,
+                -9,
+                -4,
+                4,
+                3
+            ],
+            "-7": [
+                11,
+                -7,
+                10,
+                6,
+                14,
+                -10,
+                1,
+                9,
+                -9,
+                12,
+                6,
+                -8,
+                1
+            ],
+            "1": [
+                14,
+                10,
+                9,
+                -1
+            ],
+            "10": [
+                -8,
+                -5,
+                14,
+                2,
+                6,
+                -7,
+                8,
+                9,
+                -6,
+                -11,
+                -8
+            ],
+            "11": [
+                -12,
+                -11,
+                -14
+            ],
+            "2": [
+                3,
+                5
+            ],
+            "4": [
+                -1,
+                -6,
+                2,
+                4,
+                -9,
+                8,
+                -7,
+                2
+            ],
+            "5": [
+                11,
+                -3,
+                1
+            ],
+            "6": [
+                -9,
+                10,
+                -11,
+                7,
+                -14,
+                5,
+                9,
+                10,
+                9,
+                4,
+                -12,
+                11
+            ]
+        },
+        {
+            "-10": [
+                11,
+                14,
+                -2,
+                4,
+                7,
+                3,
+                -9,
+                -8,
+                -12,
+                -6,
+                10,
+                -11,
+                -14
+            ],
+            "-11": [
+                -10,
+                -5
+            ],
+            "-14": [
+                -9,
+                14,
+                6,
+                14,
+                10,
+                -8,
+                12,
+                11,
+                8,
+                12,
+                -10,
+                -3,
+                -14,
+                10,
+                13
+            ],
+            "-2": [
+                9,
+                -11,
+                -7,
+                -14,
+                7,
+                -3,
+                -11,
+                -9,
+                11,
+                0,
+                5
+            ],
+            "-5": [
+                -7,
+                12,
+                -14,
+                -3,
+                13,
+                12,
+                1,
+                -13,
+                -10,
+                9
+            ],
+            "-9": [
+                -12,
+                -9,
+                -11,
+                3,
+                11,
+                -9
+            ],
+            "1": [
+                0,
+                4,
+                -2,
+                14,
+                9,
+                1,
+                12,
+                13,
+                -8
+            ],
+            "14": [
+                0,
+                11,
+                4,
+                -12,
+                -4
+            ],
+            "5": [
+                2
+            ],
+            "6": [
+                -8,
+                -8,
+                11,
+                10,
+                -14,
+                6,
+                -13,
+                14,
+                -13,
+                -2,
+                2,
+                -10
+            ]
+        },
+        {
+            "-1": [
+                -1,
+                -1,
+                -13,
+                9,
+                3,
+                12,
+                2,
+                6,
+                -6
+            ],
+            "-7": [
+                4
+            ],
+            "-9": [
+                4,
+                -12,
+                14,
+                4,
+                5,
+                -8
+            ],
+            "5": [
+                -4,
+                11
+            ],
+            "7": [
+                10,
+                2,
+                -1,
+                6,
+                -6,
+                -1,
+                -4,
+                2,
+                5,
+                9,
+                4,
+                -3,
+                -3
+            ],
+            "8": [
+                -6,
+                9,
+                7,
+                -11
+            ]
+        },
+        {
+            "-3": [
+                2
+            ],
+            "-4": [
+                -3,
+                5,
+                0
+            ],
+            "-5": [
+                3,
+                8,
+                13,
+                -8,
+                -7,
+                -3,
+                -7,
+                -8,
+                5,
+                10
+            ],
+            "0": [
+                -9,
+                -11,
+                6,
+                13,
+                1,
+                7,
+                -14,
+                -5,
+                -9,
+                -13,
+                -10,
+                13,
+                -14,
+                -11,
+                -14
+            ],
+            "1": [
+                -1,
+                13
+            ],
+            "13": [
+                -3,
+                9,
+                13,
+                -9,
+                14,
+                -2,
+                11,
+                -12,
+                -14,
+                6,
+                7,
+                -6,
+                2,
+                1
+            ],
+            "14": [
+                0
+            ],
+            "5": [
+                1,
+                3,
+                -12,
+                -7,
+                11,
+                12,
+                -6,
+                1
+            ]
+        },
+        {
+            "11": [
+                -12,
+                2,
+                -11,
+                -2,
+                6,
+                13,
+                -3,
+                1,
+                9,
+                -4,
+                12,
+                -12,
+                2,
+                -3,
+                -4,
+                5,
+                -13,
+                -12,
+                -11,
+                10,
+                -5,
+                5,
+                10
+            ],
+            "14": [
+                4,
+                -7,
+                10
+            ],
+            "2": [
+                -7,
+                7,
+                -10,
+                8,
+                -3,
+                6,
+                -3
+            ],
+            "3": [
+                0,
+                -11
+            ],
+            "8": [
+                7,
+                -12,
+                -14,
+                -1,
+                9,
+                12,
+                -6,
+                12,
+                -14
+            ]
+        }
+    ],
+    "seed": -1234791978
+}
diff --git a/golden/MonoidMap Int [Natural].json b/golden/MonoidMap Int [Natural].json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Int [Natural].json
@@ -0,0 +1,597 @@
+{
+    "samples": [
+        {
+            "-1": [
+                12
+            ],
+            "-10": [
+                10,
+                1,
+                7,
+                5,
+                8,
+                14,
+                6
+            ],
+            "-12": [
+                12,
+                8,
+                9,
+                0,
+                0,
+                0,
+                3,
+                8,
+                9,
+                4,
+                6,
+                9,
+                14,
+                3,
+                13,
+                9,
+                9,
+                10,
+                10,
+                6,
+                1
+            ],
+            "-9": [
+                11,
+                4,
+                0,
+                11,
+                3,
+                14,
+                1,
+                11,
+                9
+            ],
+            "0": [
+                1,
+                6,
+                14,
+                10,
+                10,
+                7,
+                5,
+                12,
+                8,
+                5
+            ],
+            "14": [
+                9,
+                1,
+                14,
+                9,
+                11,
+                2,
+                3,
+                0,
+                2
+            ]
+        },
+        {
+            "-12": [
+                11,
+                0,
+                12,
+                12,
+                7,
+                3,
+                0
+            ]
+        },
+        {
+            "1": [
+                5,
+                3,
+                5,
+                5,
+                12,
+                13
+            ],
+            "10": [
+                9,
+                4,
+                12,
+                8,
+                14,
+                2,
+                11,
+                11,
+                12,
+                5,
+                14,
+                0
+            ],
+            "12": [
+                1,
+                5,
+                13,
+                11,
+                8,
+                8,
+                4,
+                13,
+                12,
+                5
+            ],
+            "3": [
+                2,
+                13,
+                4,
+                4,
+                13,
+                4,
+                4,
+                9,
+                11
+            ],
+            "4": [
+                5,
+                2,
+                3,
+                7,
+                4,
+                9
+            ],
+            "8": [
+                5,
+                6
+            ]
+        },
+        {
+            "-14": [
+                6,
+                0,
+                5,
+                13,
+                13,
+                13,
+                7,
+                7
+            ],
+            "-2": [
+                12,
+                1,
+                6,
+                3,
+                1,
+                7,
+                13,
+                0,
+                14,
+                13,
+                10
+            ]
+        },
+        {
+            "-11": [
+                10,
+                13,
+                7,
+                5,
+                8
+            ],
+            "-12": [
+                6,
+                9,
+                0,
+                7,
+                5,
+                1,
+                5,
+                9
+            ],
+            "-2": [
+                6,
+                8,
+                4
+            ],
+            "-3": [
+                5,
+                7,
+                2,
+                5,
+                9,
+                12,
+                0
+            ],
+            "-7": [
+                7,
+                4
+            ],
+            "1": [
+                5,
+                13,
+                11,
+                7,
+                4
+            ]
+        },
+        {
+            "-10": [
+                0,
+                5,
+                1,
+                8,
+                3,
+                2,
+                5,
+                8,
+                6
+            ],
+            "0": [
+                12,
+                13,
+                6,
+                7,
+                14,
+                10
+            ],
+            "11": [
+                11,
+                5,
+                4,
+                10,
+                1,
+                1,
+                13,
+                7,
+                9,
+                14,
+                9,
+                10,
+                12,
+                1
+            ],
+            "12": [
+                14,
+                5,
+                12,
+                12,
+                3,
+                2,
+                11,
+                12,
+                10
+            ],
+            "2": [
+                14,
+                0,
+                4,
+                4,
+                5,
+                10,
+                6,
+                5,
+                10,
+                7
+            ],
+            "5": [
+                6,
+                5,
+                0,
+                2,
+                13,
+                11,
+                10,
+                13,
+                4,
+                2,
+                10
+            ],
+            "7": [
+                1,
+                8,
+                0,
+                6,
+                14,
+                9,
+                14,
+                1,
+                0,
+                0
+            ],
+            "9": [
+                13,
+                12,
+                2,
+                0,
+                11
+            ]
+        },
+        {
+            "-10": [
+                2,
+                1,
+                13,
+                14,
+                6,
+                1,
+                12,
+                0,
+                5,
+                6,
+                1,
+                12,
+                8,
+                3
+            ],
+            "-12": [
+                14,
+                13,
+                10,
+                8
+            ],
+            "0": [
+                11,
+                7,
+                7,
+                12,
+                10,
+                6,
+                4,
+                1,
+                7,
+                13,
+                7,
+                6
+            ],
+            "13": [
+                0,
+                3,
+                0,
+                9,
+                10,
+                7,
+                9,
+                10,
+                1,
+                12,
+                11,
+                0,
+                2,
+                3,
+                10
+            ],
+            "3": [
+                0,
+                13,
+                13,
+                6,
+                11,
+                3,
+                8
+            ],
+            "4": [
+                4,
+                7,
+                12
+            ],
+            "9": [
+                14,
+                7,
+                7,
+                4,
+                4,
+                7,
+                0,
+                10,
+                13,
+                11
+            ]
+        },
+        {
+            "-10": [
+                6,
+                10,
+                9,
+                9,
+                0,
+                14,
+                9,
+                13,
+                13,
+                1,
+                10,
+                1,
+                2,
+                1,
+                4,
+                9,
+                8,
+                3,
+                1,
+                7,
+                13,
+                5
+            ],
+            "-13": [
+                7,
+                6,
+                13
+            ],
+            "-5": [
+                9,
+                6,
+                14,
+                7,
+                2,
+                14,
+                11,
+                9,
+                2,
+                7,
+                12
+            ],
+            "0": [
+                10,
+                1,
+                6,
+                2,
+                11,
+                10,
+                12,
+                3,
+                4,
+                11,
+                12,
+                1,
+                14
+            ],
+            "13": [
+                2,
+                9,
+                2,
+                11,
+                4,
+                8,
+                0,
+                12,
+                2
+            ],
+            "5": [
+                8,
+                14
+            ],
+            "9": [
+                11,
+                10,
+                8,
+                4,
+                2,
+                12,
+                2,
+                0,
+                11,
+                0,
+                13,
+                12,
+                5,
+                4,
+                2,
+                2,
+                13,
+                6,
+                10
+            ]
+        },
+        {
+            "-14": [
+                2,
+                2,
+                5
+            ],
+            "-6": [
+                4,
+                14,
+                0,
+                8,
+                3,
+                8,
+                12,
+                3
+            ],
+            "-8": [
+                1,
+                7,
+                7,
+                13,
+                10,
+                10,
+                7
+            ],
+            "-9": [
+                10,
+                11,
+                12
+            ],
+            "10": [
+                1,
+                0,
+                3,
+                5,
+                10,
+                3,
+                1,
+                6
+            ],
+            "8": [
+                13,
+                13,
+                10,
+                3
+            ],
+            "9": [
+                5,
+                5,
+                6,
+                14,
+                14,
+                14,
+                10,
+                11,
+                9,
+                10,
+                13
+            ]
+        },
+        {
+            "-6": [
+                5,
+                9,
+                6,
+                13,
+                5,
+                5,
+                4,
+                13,
+                13,
+                8,
+                1,
+                8,
+                11
+            ],
+            "-9": [
+                4,
+                0,
+                4,
+                4,
+                0,
+                4,
+                2,
+                4
+            ],
+            "11": [
+                13,
+                14,
+                7,
+                6,
+                3,
+                11
+            ],
+            "12": [
+                11,
+                6,
+                1
+            ],
+            "8": [
+                5,
+                6,
+                14,
+                5,
+                0,
+                6,
+                5,
+                3,
+                11,
+                3,
+                14,
+                13
+            ]
+        }
+    ],
+    "seed": 423049305
+}
diff --git a/golden/MonoidMap Text (Dual Text).json b/golden/MonoidMap Text (Dual Text).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text (Dual Text).json
@@ -0,0 +1,96 @@
+{
+    "samples": [
+        {
+            "": "a",
+            "aaaa": "aaaaaaaaababaa",
+            "aaaaacaa": "aac",
+            "aabaaabdabaab": "aaaaaaaaaa",
+            "abaaacabaabaa": "abbaabaa",
+            "abba": "aacacaaaaaba",
+            "baaa": "aba",
+            "bada": "ab",
+            "bbacaaabba": "baaaaaaaaaaa"
+        },
+        {
+            "aaaaba": "aa",
+            "baaa": "aaabaa"
+        },
+        {
+            "": "adbaabbbaaaa",
+            "aaa": "abaaaaba",
+            "aaaaaa": "aabaaaababaaa",
+            "aaaaaaa": "baaabaaaaaa",
+            "aaabaaaaaaaaaa": "aaabaaaabaca",
+            "abaaaaabbaa": "adb",
+            "acaaaaaabaaa": "abacabab",
+            "b": "aaaaaaaa",
+            "baaaa": "baababa",
+            "bab": "aaaaaacabab",
+            "bb": "baaabaaaaabaaa",
+            "caaa": "abdbaaabbaaa"
+        },
+        {
+            "": "acaaabaaaaabb",
+            "a": "aaab",
+            "aa": "aadbabbabb",
+            "aaaaaaaaaab": "aaaaaaaaa",
+            "aaaabaad": "abacaabaacbac",
+            "abaaabaaa": "aaaabacacbaaaa",
+            "abababaabaaaa": "aacaababbaa"
+        },
+        {
+            "aaaaaaacba": "baaba",
+            "aaaaaabc": "cabcaabaaa",
+            "aaaabbaaababab": "aaaaa",
+            "abbabadaa": "baacababaaaa"
+        },
+        {
+            "": "aaaaaa",
+            "aa": "aaaaaababaaaa",
+            "aaaaaacaab": "abbaa",
+            "aaaaabaabaaab": "aabcabaaaaa",
+            "aaaaacaaaa": "aaa",
+            "aaabacaabaab": "aaabcaaaa",
+            "aaabbaaa": "aababaaaa",
+            "aaabbaaaa": "aacbbaaaaaaab",
+            "aababbbbba": "aabaaaaaaaccbc",
+            "abaaa": "abaabaaaaaabaa",
+            "b": "baaaaaaabaca",
+            "baaacaaaaaaaaa": "baaacaaabbadaa"
+        },
+        {
+            "aaaaaaac": "abaabaa",
+            "aaabaa": "abaaaa",
+            "aaabaaabaaa": "aaaaaaaa",
+            "aadbbbabaaa": "aabab",
+            "abaaaabaa": "bbbaaaaaaa",
+            "abaaaabbab": "aa",
+            "b": "aab",
+            "daaaaaaa": "aabaaaaa"
+        },
+        {
+            "aa": "acbaaaaa",
+            "aaabaaabaaaabb": "aaaaaa",
+            "aabaaabaaaa": "baaaa",
+            "ba": "aacaaaaaba",
+            "bbaaaaabbaa": "abcabaacb"
+        },
+        {
+            "abadaaaaaaa": "aabaaccaa",
+            "baaba": "aaaacbb"
+        },
+        {
+            "aaaaaa": "aaaaabcabaca",
+            "aaaac": "baaaac",
+            "aabaaabccaca": "abaaaaaaaaa",
+            "aabaacbb": "aaab",
+            "aabbbaaaabaa": "aaaaaaa",
+            "abcaaaaa": "aacaaaca",
+            "baa": "aabaaaaabaaaab",
+            "bab": "aaaaaa",
+            "bababaaaaab": "acaaabbcb",
+            "daaaaabb": "abaaaaaaaaaa"
+        }
+    ],
+    "seed": -637739861
+}
diff --git a/golden/MonoidMap Text (Dual [Int]).json b/golden/MonoidMap Text (Dual [Int]).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text (Dual [Int]).json
@@ -0,0 +1,646 @@
+{
+    "samples": [
+        {
+            "aaab": [
+                -4,
+                -5,
+                1,
+                5,
+                -9
+            ]
+        },
+        {
+            "a": [
+                5,
+                2
+            ],
+            "aaab": [
+                -1,
+                -6,
+                -6,
+                2,
+                -14,
+                -14,
+                -11,
+                -7,
+                4
+            ],
+            "aababc": [
+                13,
+                -6,
+                -6,
+                -5,
+                -14,
+                8,
+                7,
+                -13,
+                -8,
+                -12,
+                12
+            ],
+            "aacabaaaaaabaa": [
+                -8,
+                1,
+                -10,
+                -12,
+                3,
+                5,
+                -14,
+                -2
+            ],
+            "ab": [
+                4,
+                6,
+                -2
+            ],
+            "abaaaaa": [
+                -3,
+                -3,
+                -13,
+                -12,
+                4,
+                -4,
+                -8
+            ],
+            "acaaabb": [
+                7,
+                -4,
+                -8,
+                7,
+                0,
+                7,
+                -10,
+                8,
+                4,
+                5
+            ],
+            "b": [
+                -6,
+                -11,
+                9,
+                -2
+            ],
+            "baaabaabaaaaa": [
+                0,
+                -13,
+                11,
+                -9,
+                12,
+                -9,
+                2,
+                9,
+                1,
+                -9,
+                -9
+            ],
+            "cbbba": [
+                -6,
+                7
+            ],
+            "d": [
+                1,
+                0,
+                5,
+                -8,
+                4,
+                -3,
+                10,
+                10,
+                -4,
+                -2,
+                9
+            ]
+        },
+        {
+            "aaabbaaaaaaaaa": [
+                11,
+                14,
+                -9,
+                -13
+            ],
+            "bcaaaaaa": [
+                12
+            ]
+        },
+        {
+            "aaa": [
+                -2,
+                -8,
+                12,
+                -11,
+                4,
+                -10,
+                -6,
+                5,
+                -4,
+                -6,
+                -1,
+                5,
+                -13,
+                -3
+            ],
+            "aaaa": [
+                -5,
+                -7,
+                -9,
+                10,
+                -9,
+                -11,
+                8,
+                4,
+                -10,
+                9,
+                6
+            ],
+            "aaaaa": [
+                5,
+                5,
+                1,
+                -6,
+                -1,
+                -7,
+                10,
+                2,
+                13,
+                -3,
+                11,
+                11
+            ],
+            "aaaabaaa": [
+                6,
+                5,
+                -5,
+                -2,
+                5,
+                -2,
+                2,
+                -5,
+                -11,
+                -10,
+                13
+            ],
+            "aaab": [
+                5,
+                -9,
+                10,
+                12,
+                -8,
+                14,
+                7,
+                5,
+                -6,
+                -13
+            ],
+            "aaabbacabaa": [
+                -13,
+                -3,
+                5,
+                10,
+                -13,
+                -4,
+                -9
+            ],
+            "acaaaabaaaba": [
+                -13,
+                14,
+                5,
+                3,
+                -3,
+                14,
+                4,
+                -8,
+                8
+            ],
+            "acaababaab": [
+                -3,
+                -6,
+                -8
+            ],
+            "baaaa": [
+                -9,
+                10,
+                -4,
+                10,
+                10,
+                -10,
+                -6,
+                -4,
+                -5,
+                0,
+                -4,
+                -13,
+                0,
+                5
+            ],
+            "baaaaacaaa": [
+                13,
+                8,
+                13,
+                -13,
+                7,
+                4,
+                -5,
+                11,
+                13,
+                -13,
+                10,
+                -13
+            ],
+            "baacaabaaaaa": [
+                9,
+                -13,
+                12,
+                -10
+            ]
+        },
+        {
+            "aaaaab": [
+                3,
+                -13,
+                -9,
+                -14,
+                13,
+                -3,
+                -6,
+                -13,
+                7
+            ],
+            "aaab": [
+                5,
+                -5,
+                1,
+                12,
+                -6,
+                1,
+                -9,
+                12,
+                8,
+                -1,
+                0,
+                -3,
+                4
+            ],
+            "aaacaaa": [
+                -7,
+                -8,
+                3,
+                4,
+                5,
+                -6,
+                -6,
+                7,
+                6,
+                1,
+                11
+            ],
+            "baaaabbaaa": [
+                -13,
+                8,
+                -4,
+                12
+            ],
+            "caaa": [
+                3,
+                -2,
+                9
+            ]
+        },
+        {
+            "a": [
+                -12,
+                14,
+                -1,
+                6,
+                -11,
+                -8,
+                0,
+                -11,
+                10,
+                -12,
+                13
+            ],
+            "aa": [
+                4,
+                3,
+                9,
+                12,
+                10,
+                5,
+                12
+            ],
+            "aaaaaaaa": [
+                1,
+                9,
+                -13,
+                -6,
+                14,
+                -10,
+                -7,
+                7,
+                6,
+                -11,
+                10
+            ],
+            "aaaabaaaaaba": [
+                -12,
+                -9,
+                -10,
+                -8,
+                12,
+                8,
+                1,
+                -8
+            ],
+            "abacaaaababa": [
+                10,
+                -1,
+                9,
+                8,
+                -6,
+                0,
+                1,
+                12,
+                3,
+                -10,
+                -4,
+                -13,
+                10,
+                -4,
+                2,
+                -10,
+                -1,
+                -11,
+                -14,
+                7,
+                -4,
+                -9,
+                -13,
+                -3
+            ],
+            "baabaaaaa": [
+                -5,
+                -12,
+                9,
+                -7
+            ],
+            "ca": [
+                -10,
+                -2,
+                9,
+                -14,
+                -7,
+                8,
+                -6,
+                -2
+            ]
+        },
+        {
+            "aaaa": [
+                5,
+                8,
+                -12,
+                -1
+            ],
+            "aaaaa": [
+                7,
+                -11,
+                6,
+                -7,
+                13,
+                12,
+                -4,
+                13,
+                -5,
+                14,
+                14,
+                3,
+                7,
+                -14
+            ],
+            "aaaaaaaaaaaaaa": [
+                -1
+            ],
+            "aaacaaaaaaaca": [
+                -3,
+                -9,
+                6,
+                11,
+                -2,
+                2,
+                -4,
+                13
+            ],
+            "aabdaabacbab": [
+                -4,
+                -7,
+                -3,
+                11,
+                -12,
+                -6,
+                -13
+            ],
+            "baaaaaaa": [
+                8,
+                -8,
+                13,
+                6,
+                7,
+                -3,
+                11,
+                -7,
+                1,
+                7
+            ],
+            "baabaadaa": [
+                5,
+                -4,
+                -6,
+                6,
+                -10,
+                3,
+                -6,
+                -9,
+                2
+            ],
+            "bcaaaaaaababa": [
+                5,
+                12,
+                -8,
+                5
+            ]
+        },
+        {
+            "": [
+                -12
+            ],
+            "aaaaaaaaa": [
+                10,
+                -12,
+                1,
+                -12,
+                9,
+                12,
+                5,
+                11,
+                11,
+                -14
+            ],
+            "aaabaaabab": [
+                11,
+                -11,
+                5,
+                3,
+                11,
+                -1,
+                -14
+            ],
+            "aaaca": [
+                9,
+                5,
+                -8,
+                5,
+                -3,
+                2,
+                12,
+                7,
+                -2,
+                1,
+                8,
+                -7,
+                -8
+            ],
+            "aabaaababb": [
+                1,
+                -9,
+                14,
+                -13,
+                -8,
+                -3,
+                13
+            ],
+            "aaccaadaaa": [
+                6,
+                12,
+                14,
+                -13,
+                -1
+            ],
+            "acaca": [
+                -9,
+                2,
+                13,
+                -1,
+                13
+            ],
+            "baaabcbbbaaaaa": [
+                8,
+                -5,
+                4,
+                -9,
+                7,
+                9,
+                -10
+            ],
+            "bacaaaabbba": [
+                13,
+                14,
+                3,
+                -12,
+                -14,
+                -1,
+                3,
+                -5
+            ],
+            "cbaabccaaa": [
+                10,
+                13,
+                11,
+                -10,
+                -4,
+                2,
+                -8,
+                12,
+                -5,
+                -14,
+                11
+            ]
+        },
+        {
+            "": [
+                -11
+            ],
+            "aaabb": [
+                -13,
+                4
+            ],
+            "aaacaaa": [
+                -13,
+                10,
+                11,
+                9,
+                2,
+                -5,
+                -10,
+                2,
+                -10,
+                -9,
+                4,
+                1,
+                -14
+            ],
+            "aabaacbaaaaaa": [
+                -5,
+                8,
+                6,
+                -3
+            ],
+            "abaabaa": [
+                -2,
+                5
+            ],
+            "baaaaaaaaacbaa": [
+                14,
+                -13,
+                -13,
+                -10,
+                6,
+                7,
+                -2,
+                -10,
+                -5
+            ],
+            "baabaaaaa": [
+                8,
+                -8,
+                3
+            ]
+        },
+        {
+            "aaabaaaaa": [
+                12,
+                -5,
+                -6,
+                -3,
+                5,
+                -5,
+                -11,
+                7,
+                -7,
+                -4,
+                -3
+            ],
+            "abb": [
+                -1,
+                9,
+                -9,
+                9,
+                -8,
+                -5,
+                10,
+                -1,
+                8
+            ]
+        }
+    ],
+    "seed": 2102764967
+}
diff --git a/golden/MonoidMap Text (Dual [Natural]).json b/golden/MonoidMap Text (Dual [Natural]).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text (Dual [Natural]).json
@@ -0,0 +1,677 @@
+{
+    "samples": [
+        {},
+        {
+            "": [
+                2,
+                14,
+                3,
+                6,
+                7
+            ],
+            "aaaa": [
+                4,
+                11,
+                3,
+                0,
+                10,
+                3,
+                4,
+                0,
+                5
+            ],
+            "aaaaaaaaaabaaa": [
+                10,
+                9,
+                12
+            ],
+            "aaaaaaaaaba": [
+                0,
+                13,
+                14,
+                1,
+                9,
+                11,
+                4,
+                14,
+                1,
+                2
+            ],
+            "aaaabaaaabbb": [
+                2,
+                0,
+                8,
+                1,
+                3,
+                1,
+                0,
+                11,
+                9,
+                4,
+                1
+            ],
+            "aaaabaabba": [
+                12,
+                0,
+                2,
+                2,
+                9,
+                9,
+                12,
+                2,
+                4,
+                6,
+                14,
+                11,
+                1
+            ],
+            "aabbaaba": [
+                5,
+                12,
+                0
+            ],
+            "ab": [
+                14,
+                8,
+                7,
+                8,
+                13,
+                9,
+                12
+            ]
+        },
+        {
+            "": [
+                3,
+                8,
+                11,
+                0,
+                2,
+                1,
+                13,
+                7,
+                14,
+                14
+            ],
+            "aa": [
+                2,
+                3,
+                11,
+                14,
+                7,
+                3,
+                0,
+                2,
+                6,
+                0,
+                10
+            ],
+            "aaa": [
+                7,
+                1,
+                2,
+                4,
+                2
+            ],
+            "aaaaa": [
+                4,
+                4,
+                11,
+                8,
+                13,
+                5,
+                8,
+                10,
+                9,
+                11,
+                2,
+                2,
+                5,
+                14
+            ],
+            "aaacaaaaaba": [
+                14,
+                13,
+                11,
+                8,
+                11,
+                6,
+                4,
+                1,
+                2,
+                11,
+                8,
+                8,
+                1
+            ],
+            "aaba": [
+                2,
+                11,
+                5,
+                0,
+                10,
+                3,
+                13,
+                10,
+                4
+            ],
+            "ab": [
+                11
+            ],
+            "abaaa": [
+                5,
+                7,
+                5,
+                7,
+                9,
+                4,
+                1,
+                0,
+                8,
+                7,
+                3,
+                8,
+                7
+            ],
+            "daaaaaa": [
+                12,
+                8,
+                0,
+                9,
+                11,
+                1,
+                11
+            ]
+        },
+        {
+            "aa": [
+                0,
+                0,
+                0,
+                1,
+                2,
+                4,
+                9,
+                13,
+                9,
+                13,
+                12,
+                9,
+                3,
+                2,
+                9,
+                12,
+                9,
+                10,
+                13,
+                11,
+                6
+            ],
+            "aaaa": [
+                8,
+                10,
+                5,
+                2,
+                5,
+                8,
+                14,
+                3,
+                2,
+                4,
+                2,
+                13,
+                0,
+                7,
+                4,
+                8,
+                9,
+                2,
+                12,
+                0,
+                5,
+                6,
+                3,
+                12
+            ],
+            "aaabbaaaaabb": [
+                11,
+                11,
+                4,
+                4,
+                9,
+                6,
+                9,
+                10,
+                0,
+                1,
+                6,
+                3,
+                9,
+                2
+            ],
+            "abaaa": [
+                5,
+                4,
+                0,
+                3,
+                2,
+                1,
+                5,
+                7,
+                2,
+                2,
+                12,
+                14,
+                2
+            ],
+            "abaaba": [
+                8,
+                0,
+                13,
+                0,
+                12,
+                9,
+                12,
+                8,
+                4,
+                11,
+                0,
+                3
+            ]
+        },
+        {
+            "aa": [
+                11,
+                10,
+                3,
+                12,
+                8,
+                14,
+                5,
+                9,
+                14,
+                10,
+                2,
+                14,
+                10
+            ],
+            "baabaaaaaaaaaa": [
+                3,
+                2,
+                12,
+                14
+            ],
+            "babaaaabbaaab": [
+                9,
+                8,
+                7,
+                3
+            ],
+            "bacbaacaabcbba": [
+                10,
+                4
+            ]
+        },
+        {
+            "": [
+                12,
+                1,
+                9,
+                1,
+                3,
+                8,
+                4,
+                13,
+                10,
+                6,
+                8,
+                6,
+                2,
+                7
+            ],
+            "aaa": [
+                13,
+                6,
+                2,
+                9,
+                1,
+                3
+            ],
+            "aaaaa": [
+                5,
+                5,
+                1,
+                6,
+                4,
+                11,
+                0,
+                8,
+                9,
+                14
+            ],
+            "aaaaaaaab": [
+                3,
+                12,
+                5,
+                4,
+                6,
+                8
+            ],
+            "aaaabaaaa": [
+                1,
+                13,
+                14,
+                7,
+                3
+            ],
+            "aaaababa": [
+                4,
+                9,
+                10,
+                13,
+                9,
+                7,
+                8,
+                13
+            ],
+            "aacaabbaaadaaa": [
+                3,
+                6,
+                12,
+                14,
+                12,
+                12,
+                10
+            ],
+            "abaaaaaaaabaaa": [
+                4,
+                6,
+                5,
+                13,
+                6,
+                13,
+                2,
+                12,
+                11,
+                14,
+                14
+            ],
+            "acab": [
+                12,
+                2,
+                2,
+                14,
+                0,
+                3
+            ],
+            "ad": [
+                12,
+                0,
+                6,
+                0,
+                11
+            ],
+            "baa": [
+                0,
+                6,
+                11
+            ],
+            "baaaaadaaaca": [
+                6,
+                7,
+                2,
+                12,
+                2,
+                7,
+                11,
+                0,
+                0,
+                13,
+                3,
+                13,
+                13,
+                12
+            ],
+            "baaaabbaa": [
+                12,
+                11,
+                5,
+                4,
+                14,
+                8,
+                7,
+                4
+            ],
+            "cbaabdaa": [
+                14,
+                10,
+                13
+            ]
+        },
+        {},
+        {
+            "": [
+                12,
+                6,
+                5,
+                8,
+                7,
+                1,
+                2,
+                10,
+                8
+            ],
+            "a": [
+                6
+            ],
+            "aaaabaaaa": [
+                8,
+                8,
+                2,
+                9,
+                6,
+                12,
+                14,
+                12,
+                5,
+                13,
+                8
+            ],
+            "ac": [
+                14,
+                10,
+                10,
+                9,
+                12,
+                2,
+                8,
+                13,
+                6
+            ]
+        },
+        {
+            "a": [
+                9,
+                10,
+                14,
+                10,
+                7,
+                7,
+                3,
+                8,
+                1,
+                9,
+                12,
+                12,
+                4,
+                8,
+                11,
+                12,
+                7,
+                12,
+                0,
+                9,
+                14,
+                2,
+                10,
+                6,
+                14,
+                0
+            ],
+            "aaaaaaa": [
+                13,
+                0,
+                1,
+                3,
+                14,
+                8,
+                14,
+                7,
+                13,
+                8
+            ],
+            "aaaabaaaacaa": [
+                9,
+                10,
+                11,
+                12
+            ],
+            "abaa": [
+                12,
+                6,
+                13,
+                13,
+                7,
+                0,
+                4,
+                12,
+                10,
+                0,
+                4,
+                7,
+                5,
+                4
+            ],
+            "abaaadbabbba": [
+                10,
+                9,
+                13,
+                10,
+                10,
+                5
+            ],
+            "acb": [
+                11,
+                1,
+                2,
+                0,
+                11,
+                1,
+                14
+            ],
+            "bcabbbbaba": [
+                14,
+                10,
+                4
+            ]
+        },
+        {
+            "": [
+                14,
+                8,
+                10,
+                6,
+                0,
+                8,
+                14,
+                2,
+                2,
+                5,
+                4,
+                6,
+                14,
+                9,
+                14,
+                4,
+                14,
+                14,
+                12,
+                13
+            ],
+            "aa": [
+                5,
+                0,
+                8,
+                0
+            ],
+            "aababa": [
+                8,
+                14
+            ],
+            "aabcb": [
+                1,
+                6,
+                6,
+                11,
+                14,
+                12,
+                13,
+                7,
+                9,
+                0,
+                8
+            ],
+            "aacaababaaab": [
+                8,
+                5,
+                10,
+                8,
+                5,
+                5,
+                7,
+                10,
+                6,
+                9,
+                5,
+                13,
+                3,
+                5
+            ],
+            "abaaaaaaaaaa": [
+                14,
+                6,
+                8,
+                14,
+                9
+            ],
+            "baabaabcaaacb": [
+                13,
+                4,
+                8,
+                0,
+                9,
+                10,
+                9,
+                6,
+                6,
+                2,
+                4,
+                2
+            ],
+            "bbaaaaaabba": [
+                0,
+                4,
+                0,
+                11,
+                7,
+                6,
+                8,
+                6,
+                8,
+                13,
+                14
+            ]
+        }
+    ],
+    "seed": -1655231358
+}
diff --git a/golden/MonoidMap Text (MonoidMap (Key 2) (Sum Int)).json b/golden/MonoidMap Text (MonoidMap (Key 2) (Sum Int)).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text (MonoidMap (Key 2) (Sum Int)).json
@@ -0,0 +1,413 @@
+{
+    "samples": [
+        {
+            "aaa": {
+                "A": -15,
+                "B": -9,
+                "C": -8,
+                "D": 13
+            },
+            "aaaaaaaa": {
+                "B": -9
+            },
+            "aaaaaaaacaabaa": {
+                "B": -2,
+                "C": -10,
+                "D": -9
+            },
+            "aaaaaaabaca": {
+                "A": -17,
+                "B": 11,
+                "C": -12
+            },
+            "aaaabaaaaaa": {
+                "B": -19,
+                "C": -17,
+                "D": 10
+            },
+            "aaaabaabdaaaaa": {
+                "A": -16,
+                "B": 17,
+                "C": 6,
+                "D": -11
+            },
+            "aaabaac": {
+                "A": 9,
+                "B": -21,
+                "C": 12
+            },
+            "aaabcbabca": {
+                "A": 14,
+                "B": 7,
+                "C": 7,
+                "D": 5
+            },
+            "aabbab": {
+                "A": -9,
+                "B": 2,
+                "C": 8,
+                "D": -7
+            }
+        },
+        {
+            "": {
+                "A": -7,
+                "B": -12,
+                "C": -32,
+                "D": 6
+            },
+            "aacabbaaaaac": {
+                "A": -6,
+                "B": -9,
+                "C": -13,
+                "D": -4
+            },
+            "aba": {
+                "A": -4,
+                "B": -19,
+                "C": -10,
+                "D": 1
+            },
+            "baaa": {
+                "A": -9,
+                "B": -23,
+                "C": -14,
+                "D": 11
+            },
+            "babaaaaaaabaaa": {
+                "A": 5,
+                "B": -15,
+                "D": 17
+            },
+            "bbbba": {
+                "A": -5,
+                "B": 31,
+                "C": 10,
+                "D": -3
+            }
+        },
+        {
+            "aaaaaaaaabab": {
+                "C": 3,
+                "D": -2
+            },
+            "aaaaaabaabaa": {
+                "A": -10,
+                "B": -16,
+                "C": 8,
+                "D": -21
+            },
+            "aababaabc": {
+                "A": 6
+            },
+            "abaaaabaaaaab": {
+                "B": -7,
+                "C": 15,
+                "D": 8
+            },
+            "accba": {
+                "B": 11,
+                "C": 9,
+                "D": -9
+            },
+            "bbbaaaaabbbaa": {
+                "A": 27,
+                "B": 1,
+                "C": 17
+            },
+            "cdaaaaabaabaaa": {
+                "A": -4,
+                "B": 6,
+                "C": -5,
+                "D": -4
+            }
+        },
+        {
+            "aaaaaaab": {
+                "A": -23,
+                "B": -25,
+                "C": 24,
+                "D": 17
+            },
+            "aaaaaaabaa": {
+                "D": 13
+            },
+            "aaaaaba": {
+                "B": 8,
+                "C": 11
+            },
+            "aaaabaaa": {
+                "A": -8,
+                "B": 7,
+                "C": -30,
+                "D": 5
+            },
+            "aaabaaaaaaba": {
+                "A": 11,
+                "B": 13,
+                "C": -5,
+                "D": -11
+            },
+            "aaabb": {
+                "C": -8,
+                "D": 1
+            },
+            "aabaaaaabaaaaa": {
+                "A": -8,
+                "B": -11,
+                "C": 2
+            },
+            "aabbaaaaaa": {
+                "A": -16,
+                "B": -2,
+                "C": -16,
+                "D": 6
+            },
+            "bbaabbb": {
+                "A": -6,
+                "B": 11,
+                "C": 10,
+                "D": -20
+            },
+            "ca": {
+                "C": 9,
+                "D": -1
+            },
+            "cbaa": {
+                "A": 1,
+                "B": 12,
+                "D": 8
+            }
+        },
+        {
+            "aaaac": {
+                "A": -22,
+                "B": -7,
+                "C": -28,
+                "D": 5
+            },
+            "aacaaaaaa": {
+                "A": 1,
+                "B": 9,
+                "C": -21,
+                "D": -40
+            },
+            "ababa": {
+                "A": 11,
+                "C": -15
+            },
+            "abbb": {
+                "A": -10,
+                "B": -14,
+                "C": -19,
+                "D": 14
+            },
+            "babaaaaaaaaaaa": {
+                "A": 11,
+                "B": -4,
+                "C": 11,
+                "D": -26
+            }
+        },
+        {
+            "a": {
+                "A": 7,
+                "B": -8,
+                "C": 13
+            },
+            "aa": {
+                "A": 8
+            },
+            "aaa": {
+                "A": 14,
+                "B": -15,
+                "C": 14,
+                "D": 36
+            },
+            "aaaaab": {
+                "A": -6,
+                "B": -11,
+                "C": 8,
+                "D": -42
+            },
+            "aaaabaaa": {
+                "A": 30,
+                "B": 24,
+                "D": -4
+            },
+            "aabbaaaaaaaaaa": {
+                "B": -9,
+                "C": 16,
+                "D": 14
+            },
+            "aabbba": {
+                "A": 16,
+                "B": 3,
+                "C": 11,
+                "D": 2
+            },
+            "aba": {
+                "B": 13,
+                "D": -7
+            },
+            "baa": {
+                "A": 1,
+                "B": 17,
+                "C": -6,
+                "D": 11
+            },
+            "bbaba": {
+                "A": 4,
+                "B": 4,
+                "D": 2
+            },
+            "cabaaaabbabaa": {
+                "B": 9,
+                "C": -10,
+                "D": 10
+            }
+        },
+        {
+            "": {
+                "A": 8,
+                "C": 2,
+                "D": 29
+            },
+            "aaaba": {
+                "A": 17,
+                "B": 11,
+                "D": -10
+            },
+            "abbaaaabaaaaba": {
+                "A": -2,
+                "B": 7,
+                "C": -14,
+                "D": -7
+            },
+            "acacaaaaa": {
+                "A": 13,
+                "B": 6,
+                "D": 8
+            },
+            "caa": {
+                "A": -10,
+                "B": 5,
+                "C": -8,
+                "D": 26
+            }
+        },
+        {
+            "a": {
+                "A": -15,
+                "B": -4,
+                "C": -18,
+                "D": -1
+            },
+            "aa": {
+                "A": -16,
+                "B": 18
+            },
+            "aaaaaaaa": {
+                "A": -14,
+                "B": -14
+            },
+            "aaaaaaaaa": {
+                "A": 8,
+                "B": -4,
+                "D": 20
+            },
+            "aaaaabaa": {
+                "B": 15,
+                "D": -1
+            },
+            "aaaaacaaa": {
+                "B": 7,
+                "C": -4
+            },
+            "aababcaa": {
+                "B": 2,
+                "D": 2
+            },
+            "aabbcaad": {
+                "A": 3,
+                "B": -18,
+                "C": 5
+            },
+            "aacaaaaaaa": {
+                "B": -16,
+                "C": 2,
+                "D": -2
+            },
+            "dc": {
+                "D": 12
+            }
+        },
+        {
+            "": {
+                "A": -16,
+                "B": 2,
+                "C": 32,
+                "D": 11
+            },
+            "a": {
+                "A": 13,
+                "B": 7,
+                "C": 19,
+                "D": 2
+            },
+            "aaaaaac": {
+                "B": 6
+            },
+            "aaaaaacaa": {
+                "A": -8,
+                "B": 13,
+                "C": 38,
+                "D": -10
+            },
+            "aaba": {
+                "A": -14
+            },
+            "ab": {
+                "A": -11,
+                "B": 6,
+                "C": 5
+            },
+            "abaaaaaaab": {
+                "A": 3
+            },
+            "abaaaabaabbaab": {
+                "C": -5,
+                "D": 7
+            },
+            "abab": {
+                "A": -4,
+                "B": -8,
+                "C": -12,
+                "D": -7
+            },
+            "b": {
+                "B": -5,
+                "C": -6,
+                "D": -8
+            },
+            "baacdabaaaaa": {
+                "B": -7
+            },
+            "bbaaabcacabaa": {
+                "B": 14
+            }
+        },
+        {
+            "aa": {
+                "B": 9
+            },
+            "aaaaaaaaba": {
+                "A": -20,
+                "B": 10,
+                "C": 4,
+                "D": 7
+            }
+        }
+    ],
+    "seed": -2104289760
+}
diff --git a/golden/MonoidMap Text (MonoidMap (Key 2) (Sum Natural)).json b/golden/MonoidMap Text (MonoidMap (Key 2) (Sum Natural)).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text (MonoidMap (Key 2) (Sum Natural)).json
@@ -0,0 +1,358 @@
+{
+    "samples": [
+        {
+            "aaa": {
+                "A": 28,
+                "B": 18,
+                "C": 8,
+                "D": 19
+            },
+            "aaaaaaaaaaaaa": {
+                "B": 5,
+                "D": 13
+            },
+            "aaaaaaaaab": {
+                "A": 6,
+                "B": 47,
+                "C": 24,
+                "D": 22
+            },
+            "aaaaababbaa": {
+                "A": 25,
+                "B": 12,
+                "C": 31,
+                "D": 4
+            },
+            "aaaba": {
+                "A": 5,
+                "B": 19,
+                "C": 9,
+                "D": 17
+            },
+            "ab": {
+                "A": 1,
+                "B": 4,
+                "C": 26,
+                "D": 36
+            },
+            "acabbaaacaaaa": {
+                "A": 38,
+                "B": 8,
+                "C": 11,
+                "D": 22
+            },
+            "bacaaa": {
+                "A": 13,
+                "C": 22,
+                "D": 13
+            }
+        },
+        {
+            "": {
+                "A": 26,
+                "B": 4,
+                "C": 2,
+                "D": 8
+            },
+            "aaaaaaaaaacaba": {
+                "A": 4,
+                "B": 39,
+                "C": 37,
+                "D": 13
+            },
+            "aaaaaaab": {
+                "B": 9,
+                "C": 20,
+                "D": 13
+            },
+            "aaaabaacaaaa": {
+                "B": 19,
+                "C": 12,
+                "D": 2
+            },
+            "aabaaa": {
+                "A": 20,
+                "B": 44,
+                "C": 39,
+                "D": 8
+            },
+            "aabaabbaaa": {
+                "A": 16,
+                "B": 11,
+                "C": 23
+            },
+            "aacaaab": {
+                "A": 9,
+                "B": 16,
+                "C": 25,
+                "D": 42
+            },
+            "aadaabaaaaaa": {
+                "A": 9,
+                "C": 13,
+                "D": 14
+            },
+            "abb": {
+                "A": 15,
+                "D": 6
+            },
+            "abc": {
+                "B": 1,
+                "C": 20
+            },
+            "baaaaa": {
+                "A": 14,
+                "B": 9,
+                "D": 36
+            },
+            "baaabacb": {
+                "A": 12,
+                "B": 23,
+                "C": 56
+            }
+        },
+        {
+            "aa": {
+                "D": 10
+            },
+            "aaa": {
+                "A": 17,
+                "B": 13,
+                "D": 1
+            },
+            "aaaaaa": {
+                "B": 19,
+                "C": 50,
+                "D": 24
+            },
+            "aaaaacbaaa": {
+                "A": 5,
+                "B": 4,
+                "D": 10
+            },
+            "aabaaaab": {
+                "A": 22,
+                "C": 12,
+                "D": 13
+            },
+            "aabaaacaaabac": {
+                "A": 13,
+                "B": 6
+            },
+            "aacaaaabaaa": {
+                "A": 16,
+                "B": 26,
+                "C": 15,
+                "D": 25
+            },
+            "aba": {
+                "B": 8
+            },
+            "acaabaababaaaa": {
+                "B": 50
+            },
+            "acabaa": {
+                "A": 34,
+                "B": 20,
+                "C": 22,
+                "D": 20
+            }
+        },
+        {
+            "a": {
+                "B": 14
+            },
+            "aaaaaaaaaaaaaa": {
+                "A": 18,
+                "B": 10,
+                "C": 4,
+                "D": 25
+            },
+            "aaabacaaa": {
+                "B": 26
+            },
+            "abacaaabaaad": {
+                "A": 3,
+                "B": 14,
+                "C": 22,
+                "D": 22
+            },
+            "abacbaba": {
+                "A": 19,
+                "B": 35,
+                "C": 17,
+                "D": 26
+            },
+            "abbaaaaaaa": {
+                "A": 35,
+                "B": 5,
+                "C": 33,
+                "D": 25
+            },
+            "baa": {
+                "A": 20,
+                "B": 15,
+                "C": 3,
+                "D": 9
+            }
+        },
+        {
+            "aaaaaa": {
+                "A": 24,
+                "B": 40,
+                "C": 3,
+                "D": 12
+            },
+            "aabaaaaaa": {
+                "B": 18,
+                "D": 14
+            },
+            "baabbbaaa": {
+                "A": 4,
+                "B": 7
+            },
+            "cabaa": {
+                "A": 18,
+                "D": 14
+            }
+        },
+        {
+            "aaaaa": {
+                "A": 16,
+                "B": 11,
+                "D": 33
+            },
+            "aaaaabaaabb": {
+                "A": 13,
+                "B": 28,
+                "C": 22,
+                "D": 17
+            },
+            "aaabaaabaaca": {
+                "B": 6,
+                "D": 8
+            },
+            "aaabaacaa": {
+                "A": 23,
+                "B": 15,
+                "C": 14,
+                "D": 13
+            },
+            "aabaaaa": {
+                "A": 11,
+                "B": 15,
+                "C": 21
+            },
+            "aca": {
+                "B": 19,
+                "C": 10,
+                "D": 12
+            },
+            "acaaaac": {
+                "B": 33,
+                "C": 7,
+                "D": 2
+            },
+            "acb": {
+                "B": 12,
+                "C": 29,
+                "D": 33
+            },
+            "baaaaaaab": {
+                "A": 17,
+                "B": 5,
+                "C": 7,
+                "D": 15
+            },
+            "dababaaa": {
+                "A": 12,
+                "B": 27,
+                "C": 21,
+                "D": 7
+            }
+        },
+        {
+            "aa": {
+                "A": 22,
+                "B": 22,
+                "C": 28,
+                "D": 25
+            },
+            "aaaaab": {
+                "A": 47,
+                "B": 8,
+                "C": 23,
+                "D": 18
+            },
+            "baada": {
+                "A": 8,
+                "B": 16,
+                "C": 16,
+                "D": 14
+            }
+        },
+        {
+            "a": {
+                "A": 15,
+                "B": 34,
+                "C": 24,
+                "D": 13
+            },
+            "aaa": {
+                "B": 4,
+                "D": 12
+            },
+            "aaabaaadaaaaaa": {
+                "B": 1,
+                "C": 10,
+                "D": 25
+            },
+            "aaabaabaaaabaa": {
+                "B": 6
+            },
+            "aabaabaaaaaaa": {
+                "A": 37,
+                "B": 19,
+                "C": 7,
+                "D": 10
+            },
+            "b": {
+                "A": 9,
+                "B": 14,
+                "C": 14,
+                "D": 9
+            },
+            "cabaaaaaaa": {
+                "B": 3,
+                "C": 15,
+                "D": 14
+            }
+        },
+        {
+            "": {
+                "A": 11,
+                "B": 14,
+                "C": 11
+            },
+            "aacaaa": {
+                "A": 24,
+                "B": 17,
+                "C": 5,
+                "D": 13
+            },
+            "bbaaaaac": {
+                "C": 5,
+                "D": 24
+            }
+        },
+        {
+            "": {
+                "A": 31,
+                "B": 17,
+                "C": 11,
+                "D": 2
+            }
+        }
+    ],
+    "seed": 1761786884
+}
diff --git a/golden/MonoidMap Text (Product Int).json b/golden/MonoidMap Text (Product Int).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text (Product Int).json
@@ -0,0 +1,75 @@
+{
+    "samples": [
+        {
+            "": -10,
+            "aaaa": -3
+        },
+        {},
+        {},
+        {
+            "a": 2,
+            "aaaa": 8,
+            "aaaaaaaaaa": 3,
+            "aaaaaaaaba": 11,
+            "aaaaaababaaaab": -8,
+            "aaaaaba": -13,
+            "aaaabaaaacbaa": -11,
+            "aaabaaaaaaaaba": 9,
+            "aaabbaa": 8,
+            "aabaaaaa": 6,
+            "abaaaaa": 7,
+            "abaaaaab": 14,
+            "abbabaaaaaa": 10,
+            "acaaaaba": 14
+        },
+        {
+            "aaa": 11,
+            "baaaaaaa": -3,
+            "babcaca": -1,
+            "bacbaaaabaaaca": -4
+        },
+        {
+            "a": -4,
+            "aa": 0,
+            "aaaaaa": -7,
+            "aadaaa": -11,
+            "abababaaa": -1,
+            "abcdaaa": -1,
+            "baaa": -6,
+            "baacaaaacba": 6,
+            "babaaaacaa": 13
+        },
+        {
+            "a": -7,
+            "aaaaa": -4,
+            "aabaaaaaaaaba": -13,
+            "abaaaaaaaaabba": -7,
+            "acbaaacdaa": -6,
+            "baaab": 2
+        },
+        {
+            "": -1,
+            "aaa": 13,
+            "aabaaaaaabaa": -5,
+            "aabbaacaaaaa": -5,
+            "abaaababaa": 14,
+            "baaaaa": 11
+        },
+        {
+            "a": -8,
+            "aac": 9,
+            "ababacba": 7,
+            "ba": 3,
+            "baadaaaa": 13,
+            "bbaaadacabab": -14,
+            "bcbba": 9
+        },
+        {
+            "aaaaaaa": 8,
+            "aaaaaabaaaaaa": 12,
+            "aaaaababaaa": 5,
+            "cababb": -3
+        }
+    ],
+    "seed": -1213399887
+}
diff --git a/golden/MonoidMap Text (Product Natural).json b/golden/MonoidMap Text (Product Natural).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text (Product Natural).json
@@ -0,0 +1,94 @@
+{
+    "samples": [
+        {
+            "aaa": 7,
+            "aaaabacaaa": 5,
+            "aaab": 9,
+            "abaaacbaaaa": 11,
+            "abaabaa": 12,
+            "abbaaaaaa": 14,
+            "acabaaaaaaaba": 6,
+            "b": 11,
+            "ba": 10,
+            "baaaaaaaabaaaa": 11,
+            "baaabbacba": 4
+        },
+        {
+            "": 9,
+            "a": 11,
+            "aaaaaaa": 2,
+            "aaaaaaaaaaa": 9,
+            "aaabacaaaaacaa": 2,
+            "aaabbbbbaaca": 0,
+            "aabaaaaa": 4,
+            "aabab": 5,
+            "aaccaaaaa": 13,
+            "abbbbaaa": 12,
+            "baaabbaaaaa": 7,
+            "daa": 4
+        },
+        {
+            "": 7,
+            "a": 0,
+            "aa": 11,
+            "aaaabcaaaaab": 2,
+            "aaaba": 14,
+            "aaababa": 12,
+            "acbbaaaabaaaaa": 3,
+            "baaaaaaaa": 2,
+            "dabcaabbdbcabb": 9
+        },
+        {
+            "aaaaa": 12,
+            "aaaaaaaba": 8,
+            "aaaaaba": 0,
+            "aaacbaaaaabaa": 7,
+            "ababaaaaaaab": 7,
+            "acaadbaa": 12,
+            "baababaaaa": 4
+        },
+        {
+            "aa": 4,
+            "aaaaaaabaaaa": 8,
+            "aaaaacabda": 5,
+            "aaaababbaa": 14,
+            "aaacacabaaaaa": 3,
+            "aabaabaaaaaa": 6,
+            "aabababa": 10,
+            "abcaaaababbaa": 10,
+            "baaababaaacaaa": 6
+        },
+        {
+            "aaaaaaaaa": 11,
+            "aaaaaaaaaaaaba": 4,
+            "aaaacdac": 2,
+            "aaca": 9,
+            "acdaabaacaaba": 12
+        },
+        {
+            "aaabaaaa": 5,
+            "aaabaaaaaa": 12
+        },
+        {
+            "": 0,
+            "aaaaaabaa": 2
+        },
+        {
+            "": 10,
+            "aabcaaaaba": 12,
+            "aadaaaaaab": 4
+        },
+        {
+            "": 4,
+            "aaa": 3,
+            "aaabbab": 4,
+            "aacababacaac": 10,
+            "aadbaaaa": 2,
+            "abaa": 2,
+            "abababb": 4,
+            "abbbaaaaaaa": 9,
+            "acc": 13
+        }
+    ],
+    "seed": 2007859132
+}
diff --git a/golden/MonoidMap Text (Set Int).json b/golden/MonoidMap Text (Set Int).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text (Set Int).json
@@ -0,0 +1,556 @@
+{
+    "samples": [
+        {
+            "aaaaaaaaa": [
+                -12,
+                -8,
+                -5,
+                -3,
+                -1,
+                3,
+                4,
+                5,
+                7
+            ],
+            "aaaaaaacaaaa": [
+                -11,
+                -5,
+                9
+            ],
+            "aaaaaabbaaaaca": [
+                -12,
+                -1,
+                0,
+                2
+            ],
+            "aabbacaabaacaa": [
+                -13,
+                -12,
+                -10,
+                -7,
+                0,
+                3,
+                8,
+                11
+            ],
+            "baaaaaaab": [
+                -11,
+                -10,
+                -2,
+                8,
+                11
+            ],
+            "bbaaaaaacaaa": [
+                -13,
+                -1,
+                0,
+                1,
+                12
+            ],
+            "cbaaaaabaaaa": [
+                -11,
+                -1,
+                2,
+                5,
+                6,
+                7,
+                12
+            ]
+        },
+        {
+            "aaaaab": [
+                -5,
+                -4,
+                -3,
+                -2,
+                -1,
+                0,
+                4,
+                5,
+                6,
+                8,
+                9,
+                12
+            ],
+            "aaaaaba": [
+                -11,
+                -8,
+                -7,
+                -2,
+                0,
+                2,
+                3,
+                5,
+                12,
+                13
+            ],
+            "aaabb": [
+                -14,
+                -11,
+                -5,
+                -3,
+                3,
+                12
+            ],
+            "aaadb": [
+                -9,
+                3,
+                4,
+                5,
+                8,
+                11
+            ],
+            "abaaacbaa": [
+                -13,
+                -10,
+                8
+            ],
+            "abaabaaa": [
+                -13,
+                -8,
+                -6,
+                -5,
+                -2,
+                -1,
+                0,
+                1,
+                11
+            ],
+            "abb": [
+                -9,
+                -7,
+                10
+            ],
+            "acaaaaaa": [
+                -13,
+                -7,
+                2,
+                9
+            ],
+            "baaaababbaa": [
+                -14,
+                -7,
+                -5,
+                -4,
+                4,
+                6,
+                9
+            ],
+            "babaaaaaaa": [
+                -12,
+                -7,
+                -2,
+                -1,
+                1,
+                6,
+                8,
+                9,
+                12
+            ],
+            "bbaaaaaaaa": [
+                -4,
+                0,
+                6,
+                10,
+                11
+            ],
+            "bbaaaaaaaaaaaa": [
+                6
+            ],
+            "caaaaaaaaaa": [
+                -13,
+                0
+            ]
+        },
+        {},
+        {
+            "a": [
+                5,
+                6
+            ],
+            "aaaabbaaa": [
+                -14,
+                -11,
+                1,
+                2,
+                3,
+                4,
+                7,
+                11,
+                12
+            ],
+            "aaaacdaaa": [
+                -9,
+                -6,
+                -4,
+                -1,
+                2,
+                3,
+                4,
+                7,
+                8,
+                9,
+                11
+            ]
+        },
+        {
+            "aaa": [
+                -7,
+                -6,
+                -4,
+                -2,
+                -1,
+                2
+            ],
+            "aaaaabacaab": [
+                -10,
+                -9,
+                -3,
+                -2,
+                0,
+                1,
+                2,
+                9
+            ],
+            "aba": [
+                -6,
+                2,
+                9
+            ],
+            "baaabacabaad": [
+                -13,
+                -10,
+                -9,
+                -5,
+                10,
+                14
+            ],
+            "caaaaaaaaab": [
+                10
+            ],
+            "caaaaaac": [
+                -14,
+                -13,
+                -4,
+                3,
+                6,
+                14
+            ]
+        },
+        {
+            "aaabaaaaacaba": [
+                -14,
+                -13,
+                -10,
+                -7,
+                -1,
+                7,
+                9,
+                12
+            ],
+            "cdaaa": [
+                -6,
+                -5,
+                0,
+                6,
+                7,
+                8,
+                14
+            ]
+        },
+        {
+            "": [
+                -12,
+                -10,
+                -9
+            ],
+            "a": [
+                -6,
+                6
+            ],
+            "aa": [
+                -9,
+                -7,
+                -1,
+                1,
+                4,
+                5,
+                7
+            ],
+            "aaa": [
+                -13,
+                -10,
+                -9,
+                -7,
+                2,
+                5,
+                9,
+                13
+            ],
+            "aaaaaabacaa": [
+                -14,
+                -12,
+                -5,
+                3
+            ],
+            "aababaaaaaaa": [
+                -11,
+                -9,
+                -6,
+                -3,
+                -2,
+                -1,
+                1,
+                5,
+                8,
+                14
+            ],
+            "b": [
+                -9,
+                -7,
+                -4,
+                4,
+                10
+            ],
+            "baa": [
+                -13,
+                -9,
+                -6,
+                1,
+                5,
+                6,
+                9,
+                12,
+                13
+            ]
+        },
+        {
+            "aaaa": [
+                -10,
+                -4,
+                -2,
+                9,
+                13
+            ],
+            "aaaab": [
+                -13,
+                -12,
+                -7,
+                -6,
+                3,
+                10
+            ],
+            "aabaacabaaaab": [
+                -9,
+                -7,
+                -5,
+                -3,
+                1,
+                4,
+                9,
+                12,
+                14
+            ],
+            "aacbaabb": [
+                2,
+                3,
+                10
+            ],
+            "aacbcb": [
+                -14,
+                -12,
+                4,
+                5,
+                11,
+                13
+            ],
+            "abaaaa": [
+                -13,
+                -12,
+                -10,
+                -5,
+                -3,
+                -1,
+                3,
+                5,
+                11,
+                12
+            ]
+        },
+        {
+            "a": [
+                -11,
+                -9,
+                -8,
+                -6,
+                -5,
+                -2,
+                1,
+                6,
+                7,
+                8
+            ],
+            "aaaaaaaaaabaa": [
+                12
+            ],
+            "aaaaaaba": [
+                -12,
+                -10,
+                -8,
+                -7,
+                -6,
+                -5,
+                -4,
+                1,
+                3,
+                6,
+                8,
+                12,
+                14
+            ],
+            "aaaaabaababa": [
+                -12,
+                2,
+                9
+            ],
+            "aaaabaacaaaaaa": [
+                -13,
+                -5,
+                -1,
+                3,
+                4,
+                11,
+                12,
+                14
+            ],
+            "aaaad": [
+                -13,
+                -11,
+                -9,
+                -4,
+                6
+            ],
+            "aaba": [
+                -14,
+                6
+            ],
+            "aabaaab": [
+                -13,
+                -9,
+                -7,
+                -1,
+                0,
+                3,
+                9
+            ],
+            "acabaaa": [
+                -13,
+                -10,
+                -7,
+                -3,
+                0,
+                2,
+                3,
+                4,
+                5,
+                11,
+                12,
+                13
+            ],
+            "babaaaa": [
+                -13,
+                -12,
+                -10,
+                -9,
+                0,
+                1,
+                3,
+                11,
+                12,
+                13,
+                14
+            ],
+            "babba": [
+                -7,
+                -6,
+                -5,
+                6
+            ]
+        },
+        {
+            "": [
+                -7,
+                8,
+                14
+            ],
+            "aaa": [
+                -3,
+                -1,
+                0,
+                4,
+                7,
+                10,
+                13,
+                14
+            ],
+            "aaaaaa": [
+                -7,
+                0
+            ],
+            "aaaaaaac": [
+                -6,
+                9
+            ],
+            "aaabbaa": [
+                -14,
+                -13,
+                -10,
+                -8,
+                -3,
+                -2,
+                5,
+                7,
+                11,
+                12
+            ],
+            "abaaaabaa": [
+                -14,
+                -12,
+                -11,
+                -8,
+                -6,
+                -4,
+                -3,
+                0,
+                3,
+                5,
+                8,
+                13
+            ],
+            "baaaaababaa": [
+                -4,
+                6
+            ],
+            "bcbacabaaaa": [
+                -14,
+                -11,
+                -3,
+                -2,
+                -1,
+                2,
+                4,
+                10,
+                11,
+                13
+            ],
+            "cab": [
+                -14,
+                -9,
+                -7,
+                2,
+                12
+            ]
+        }
+    ],
+    "seed": -76144706
+}
diff --git a/golden/MonoidMap Text (Set Natural).json b/golden/MonoidMap Text (Set Natural).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text (Set Natural).json
@@ -0,0 +1,496 @@
+{
+    "samples": [
+        {
+            "aaabaaba": [
+                1,
+                3,
+                5,
+                6,
+                8,
+                10,
+                11,
+                12,
+                13,
+                14
+            ],
+            "aaabaabaaaaab": [
+                1,
+                3,
+                4,
+                6,
+                8,
+                12
+            ],
+            "abbcb": [
+                5
+            ],
+            "b": [
+                9
+            ],
+            "baabaaaaaaaaaa": [
+                7
+            ],
+            "babbaaaaaab": [
+                0,
+                2,
+                5,
+                7,
+                8,
+                10,
+                12,
+                13,
+                14
+            ],
+            "cbbaaaacaaaa": [
+                2,
+                8,
+                10,
+                11,
+                12,
+                14
+            ]
+        },
+        {
+            "aa": [
+                7
+            ],
+            "aaaaa": [
+                4
+            ],
+            "aaaaaaa": [
+                0,
+                1,
+                5,
+                9,
+                10,
+                13,
+                14
+            ],
+            "aaaaaabaa": [
+                0,
+                12
+            ],
+            "aaaaababaa": [
+                1
+            ],
+            "aaaab": [
+                6,
+                11
+            ],
+            "aaaababacc": [
+                2,
+                4,
+                8,
+                10,
+                14
+            ],
+            "aaababa": [
+                0,
+                1,
+                2,
+                3,
+                5,
+                7,
+                8,
+                9
+            ],
+            "aacaaabaaaa": [
+                2,
+                5,
+                6,
+                8,
+                10,
+                11,
+                12,
+                14
+            ],
+            "abaaaaaa": [
+                5
+            ],
+            "abaaababaa": [
+                0,
+                2,
+                4,
+                7,
+                12,
+                13
+            ],
+            "abadaa": [
+                3,
+                4,
+                5
+            ],
+            "baaaaa": [
+                7,
+                10,
+                13,
+                14
+            ]
+        },
+        {
+            "aaaabcaa": [
+                0,
+                1,
+                3,
+                4,
+                5,
+                7,
+                9,
+                10,
+                13,
+                14
+            ],
+            "aabaaabaa": [
+                0,
+                1,
+                2,
+                7,
+                8,
+                14
+            ],
+            "bca": [
+                3,
+                4,
+                9,
+                10,
+                12,
+                13
+            ],
+            "daabaaaaaaa": [
+                0,
+                1,
+                5,
+                6,
+                10,
+                12,
+                13,
+                14
+            ]
+        },
+        {
+            "a": [
+                1,
+                3,
+                12,
+                14
+            ],
+            "aaa": [
+                0,
+                1,
+                2,
+                8,
+                9,
+                10,
+                13,
+                14
+            ],
+            "aaaaabaa": [
+                0,
+                1,
+                2,
+                3,
+                7,
+                9,
+                12,
+                13,
+                14
+            ],
+            "ab": [
+                2,
+                4,
+                5,
+                8,
+                9,
+                10,
+                13,
+                14
+            ],
+            "bcaaaa": [
+                0,
+                3,
+                4,
+                11,
+                13
+            ],
+            "cabaaaaaba": [
+                8
+            ]
+        },
+        {
+            "": [
+                10,
+                12,
+                14
+            ],
+            "aaaaabb": [
+                3,
+                7,
+                8
+            ],
+            "aaaaacbaaba": [
+                0,
+                1,
+                2,
+                3,
+                5,
+                6,
+                7,
+                12,
+                13,
+                14
+            ],
+            "aaaacaaaaccc": [
+                3,
+                7,
+                8,
+                9,
+                14
+            ],
+            "aab": [
+                7,
+                8,
+                14
+            ],
+            "baa": [
+                2,
+                3,
+                10,
+                11
+            ]
+        },
+        {
+            "a": [
+                1,
+                3,
+                4,
+                6,
+                10,
+                12
+            ],
+            "aaaaaaabaaa": [
+                13,
+                14
+            ],
+            "acababbaaaaa": [
+                1,
+                3,
+                5,
+                7,
+                8,
+                11
+            ],
+            "bbbcb": [
+                6,
+                9,
+                11,
+                14
+            ]
+        },
+        {
+            "aaaaabaaaaa": [
+                0,
+                4,
+                5,
+                7,
+                9,
+                11,
+                14
+            ],
+            "aaaaba": [
+                6,
+                7,
+                9,
+                11,
+                12
+            ],
+            "aaaacaaaaabaaa": [
+                0,
+                1,
+                5,
+                6,
+                13,
+                14
+            ],
+            "aaabaaab": [
+                0,
+                2,
+                3,
+                4,
+                6,
+                7,
+                9,
+                13
+            ],
+            "aaababbabaa": [
+                1,
+                3,
+                9
+            ],
+            "baa": [
+                0,
+                2,
+                3,
+                5,
+                7,
+                8,
+                12
+            ],
+            "bbaa": [
+                0,
+                3,
+                4,
+                5,
+                10,
+                11,
+                12
+            ]
+        },
+        {
+            "": [
+                0,
+                2,
+                4,
+                5,
+                8,
+                9,
+                10,
+                11,
+                12,
+                14
+            ],
+            "aaa": [
+                0,
+                4,
+                6,
+                7,
+                11
+            ],
+            "aaaa": [
+                0,
+                8,
+                9,
+                11,
+                14
+            ],
+            "aaaabbadaaaaba": [
+                2,
+                5,
+                6,
+                9,
+                12,
+                13,
+                14
+            ],
+            "aaaba": [
+                1,
+                2,
+                4,
+                8,
+                9,
+                10,
+                11,
+                13,
+                14
+            ],
+            "b": [
+                8
+            ],
+            "ba": [
+                0,
+                1,
+                9,
+                14
+            ]
+        },
+        {
+            "": [
+                2,
+                3,
+                4,
+                5,
+                7,
+                8,
+                9,
+                10,
+                11,
+                12,
+                14
+            ],
+            "aa": [
+                0,
+                1,
+                2,
+                3,
+                9,
+                11
+            ],
+            "aaaa": [
+                9
+            ],
+            "aababaaab": [
+                2,
+                8,
+                9,
+                11,
+                13,
+                14
+            ],
+            "aca": [
+                11,
+                12,
+                13
+            ],
+            "caaabca": [
+                0,
+                3,
+                5,
+                9,
+                10,
+                13,
+                14
+            ]
+        },
+        {
+            "": [
+                1,
+                3,
+                4,
+                5,
+                7,
+                8,
+                10,
+                11,
+                12
+            ],
+            "aabaaa": [
+                3,
+                11
+            ],
+            "abaaa": [
+                2,
+                3,
+                4,
+                6,
+                8,
+                10,
+                11,
+                12
+            ],
+            "bbbd": [
+                2,
+                6,
+                12
+            ],
+            "bc": [
+                6,
+                7
+            ],
+            "caabaaa": [
+                0,
+                6,
+                8
+            ]
+        }
+    ],
+    "seed": 1476904113
+}
diff --git a/golden/MonoidMap Text (Sum Int).json b/golden/MonoidMap Text (Sum Int).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text (Sum Int).json
@@ -0,0 +1,98 @@
+{
+    "samples": [
+        {
+            "": -2,
+            "aaa": -2,
+            "aaaaa": 11,
+            "aaaabaaaaaaa": 11,
+            "aaacaabaaaaaa": 12,
+            "aabaaaaacaaaaa": -11,
+            "aabaaaab": -10,
+            "aabaabaaab": -7,
+            "ac": 11,
+            "b": 7,
+            "babaacaabaab": -6,
+            "caabaabac": -14
+        },
+        {
+            "a": -16,
+            "aa": 13,
+            "aaaaaaaaaaaa": 9,
+            "aaaaaaacaab": 7,
+            "aaaaaab": -11,
+            "aaabaaaa": -1,
+            "aaacaa": -14,
+            "aabaabbaaa": 10,
+            "abbaaacaaaaa": -4,
+            "caaaabaacabada": -3
+        },
+        {
+            "": -9,
+            "aaaaaaaaaaaaac": -6,
+            "aaaaaaaaabaab": 12,
+            "aaaaabbaaaa": 10,
+            "aaaabaababab": -10,
+            "aaaababaaa": 4,
+            "aabaa": -7,
+            "abaaa": 14,
+            "abaabaaaaaaac": -3
+        },
+        {
+            "aa": -9,
+            "aaaaaabaa": -14,
+            "aaaaaacaaaaab": 4,
+            "aaabaaaababab": 1,
+            "ababaabaaa": -8,
+            "baab": 3
+        },
+        {
+            "aaaaaabaaaaaa": 3,
+            "aaaaacaa": 11,
+            "aabbaaaaaaaa": -5,
+            "ababaaaadbaaa": 7,
+            "bacaaaaaacaaaa": 4
+        },
+        {
+            "": -14,
+            "aaa": 9,
+            "aaaa": -8,
+            "aaaaaaaaa": -8,
+            "aaaaaaaaaaaaca": -4,
+            "aaaaaaabbaaaaa": 12,
+            "aaaaaab": -7,
+            "aaabaaa": -6,
+            "aaababa": 12,
+            "abaaaaaacbaa": -1,
+            "baaaa": 1,
+            "baaac": -2,
+            "bbaaa": -2
+        },
+        {
+            "aaaaaaaaaaba": 6
+        },
+        {
+            "aa": -12,
+            "aaaaaabaaaa": 8,
+            "aaaabaa": -7,
+            "aadaaaaaaa": 9,
+            "abaac": -14,
+            "ba": 4,
+            "baaa": -5,
+            "baaaadcacaaaa": 9,
+            "babadbbaabaaaa": 10
+        },
+        {
+            "aa": 1,
+            "abaaabbb": 14
+        },
+        {
+            "": -4,
+            "aaa": 2,
+            "aaaaaaaaaabca": -9,
+            "aab": 12,
+            "baaa": 7,
+            "bbaabcbaa": -10
+        }
+    ],
+    "seed": -646378343
+}
diff --git a/golden/MonoidMap Text (Sum Natural).json b/golden/MonoidMap Text (Sum Natural).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text (Sum Natural).json
@@ -0,0 +1,76 @@
+{
+    "samples": [
+        {
+            "aaba": 7,
+            "babaacabba": 3,
+            "caaaaabbbb": 12
+        },
+        {
+            "": 6,
+            "a": 2,
+            "aaaa": 9,
+            "aaaaaa": 11,
+            "aaaabbaaabaa": 6,
+            "aab": 5,
+            "abbbaaaa": 3,
+            "aca": 5,
+            "baaabaaa": 8,
+            "babbaa": 1,
+            "bbabcaaa": 5
+        },
+        {
+            "": 12,
+            "aa": 10,
+            "aaaaaaaa": 1,
+            "aabba": 11,
+            "abaacaaaabab": 13,
+            "ababaaaabbaaa": 14,
+            "b": 13,
+            "ba": 9,
+            "babab": 5,
+            "babbaaaaab": 1
+        },
+        {},
+        {
+            "a": 3,
+            "aaaaaaaaa": 7,
+            "aaacaaabaaa": 9,
+            "abaaaaaaa": 2,
+            "abab": 4,
+            "ababaaaaaaaaab": 10,
+            "abb": 11,
+            "abcabcaaa": 2,
+            "bbaaababbabaaa": 8
+        },
+        {
+            "": 6,
+            "a": 8,
+            "aaaaa": 8,
+            "aaacaca": 11,
+            "aaacacacaa": 9,
+            "acacaaabaaaa": 10,
+            "baabaaabaa": 7
+        },
+        {
+            "aaa": 6,
+            "aaaaabaab": 4,
+            "aaaabaa": 10,
+            "aaaba": 6,
+            "aabaaaabbbaab": 10,
+            "abaaaaaaaaa": 6,
+            "ada": 7,
+            "b": 4
+        },
+        {
+            "aaaabaaaadaab": 1,
+            "aaaababbba": 10,
+            "aaabcaaaa": 9,
+            "baabaaabaabada": 2
+        },
+        {},
+        {
+            "aaabbcaaabba": 4
+        }
+    ],
+    "seed": 411464378
+}
diff --git a/golden/MonoidMap Text Text.json b/golden/MonoidMap Text Text.json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text Text.json
@@ -0,0 +1,88 @@
+{
+    "samples": [
+        {
+            "a": "bdaabacabaada",
+            "aaaaa": "abababaaaa",
+            "aaaaaaaabaca": "bbaabaaaaaaa",
+            "aaaabaaaabaaab": "a",
+            "aaba": "aaaaba",
+            "aabaaa": "aacab",
+            "abaaaa": "babaaabbbaaa",
+            "abaaaaaa": "aaaaabaaaabaaa",
+            "abaaaaca": "aaaaaaaaaaabaa",
+            "acabaacaa": "aaabcaaaaab",
+            "baab": "baaaaa"
+        },
+        {
+            "aaaaaaaacaaaaa": "babbaaaa"
+        },
+        {},
+        {
+            "": "abaaaaaaaaa",
+            "a": "acbaab",
+            "aaabaa": "baaaaaaaa",
+            "aaba": "baabaaaaa",
+            "abaaaaababaa": "aaaaaa",
+            "abbaabaaaa": "aaaabb",
+            "ba": "aab",
+            "baaaaaa": "abaaaaaa",
+            "baaaaabba": "aba"
+        },
+        {
+            "aab": "aac",
+            "aabbaabaa": "aaaa",
+            "acacaaaab": "ab"
+        },
+        {
+            "": "aaacaacbbabaaa",
+            "aaaaaa": "bb",
+            "aaabbaa": "a",
+            "aabbaaaaaabba": "aaabaaab",
+            "ca": "aaaaaaaaaaaaa"
+        },
+        {
+            "aa": "aaaaaaaabaaaaaab",
+            "aaababbaabaaa": "baaaaaabbacab",
+            "aabacaaaaa": "aabaaaaaaaaaba",
+            "aadbaaaaaaa": "a",
+            "abb": "b"
+        },
+        {
+            "aa": "aaaadaaaaaaaab",
+            "aaba": "aaaa",
+            "aacaaaabaaaba": "b",
+            "aba": "baaabaaaa",
+            "aca": "aaaaa"
+        },
+        {
+            "aa": "ba",
+            "aaa": "baaaa",
+            "aab": "aaabaaaaaaaab",
+            "abaaaba": "aaaab",
+            "acaabaaba": "baa",
+            "acbaaaa": "a",
+            "b": "baaabaa",
+            "baaacb": "aa",
+            "babaa": "aababaaa",
+            "bba": "baabcabb",
+            "bbaaabaab": "aaabba",
+            "bbaacaabbaabba": "aaaabaaaaa",
+            "caabbaaaaab": "aa"
+        },
+        {
+            "": "aaaaaaaaaabbaaabaaaacbaaaaacaaaabb",
+            "a": "aaaaaaaabaaaaa",
+            "aaaa": "adaaaca",
+            "aaaaaaaaaa": "caabaaa",
+            "aaaab": "ab",
+            "aaabaaaaaaa": "aaaaaa",
+            "aaabcabaaa": "aaacaca",
+            "aaacabaaa": "aaaabaa",
+            "aacbaaaad": "aaaaaaaaacbbaa",
+            "abaaa": "baaa",
+            "baaaabaabaaba": "abaaaaa",
+            "baaabaaaa": "aaaaaaa"
+        }
+    ],
+    "seed": -2122979164
+}
diff --git a/golden/MonoidMap Text [Int].json b/golden/MonoidMap Text [Int].json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text [Int].json
@@ -0,0 +1,692 @@
+{
+    "samples": [
+        {
+            "": [
+                -3
+            ],
+            "aaaaa": [
+                5,
+                -13,
+                -11,
+                5,
+                -2,
+                1,
+                -14,
+                -10,
+                -4
+            ],
+            "aaaaaa": [
+                4,
+                8,
+                7,
+                -5,
+                0,
+                10,
+                -8,
+                -7,
+                6,
+                12,
+                11,
+                3
+            ],
+            "aaacaabaa": [
+                9,
+                -1,
+                6
+            ],
+            "aabaaaac": [
+                13,
+                6,
+                -8,
+                -6,
+                -7,
+                7,
+                -12,
+                -1,
+                -7,
+                -1,
+                -6,
+                -3
+            ],
+            "aabaacaaabba": [
+                7,
+                7,
+                -7,
+                -13,
+                12,
+                3,
+                -2,
+                -10,
+                -4,
+                3,
+                2,
+                -9,
+                11
+            ],
+            "ab": [
+                -8,
+                11,
+                6,
+                0,
+                13,
+                7,
+                2,
+                3,
+                5,
+                3
+            ],
+            "baaaaaaaaabaca": [
+                -13,
+                -4
+            ],
+            "bbaaaaaaac": [
+                2,
+                2,
+                14,
+                0,
+                9,
+                10
+            ],
+            "caaaaa": [
+                -1,
+                -11,
+                -4
+            ],
+            "cbbaaa": [
+                -10,
+                8,
+                -7,
+                -7,
+                10,
+                1,
+                -12,
+                -14,
+                -4,
+                3,
+                -13
+            ]
+        },
+        {
+            "aacaaaa": [
+                3,
+                -1
+            ]
+        },
+        {
+            "a": [
+                1,
+                -1,
+                -6,
+                -10,
+                -11,
+                6,
+                -7,
+                -5,
+                -8,
+                5,
+                -3,
+                10,
+                -8,
+                11,
+                -13,
+                3,
+                -4,
+                -12,
+                1,
+                -14
+            ],
+            "aaaa": [
+                -7,
+                -3,
+                9,
+                -10,
+                7,
+                6
+            ],
+            "aaaaaaabba": [
+                1,
+                8,
+                7
+            ],
+            "aaaabaaaaaaa": [
+                -10,
+                -1,
+                -12
+            ],
+            "aaaba": [
+                -7
+            ],
+            "aaabaabbaa": [
+                3,
+                -14,
+                -12,
+                0,
+                -4,
+                1,
+                -2,
+                5,
+                -5,
+                -8,
+                -14,
+                11,
+                7
+            ],
+            "baaaabab": [
+                5,
+                2,
+                -5,
+                3,
+                13,
+                -13,
+                14,
+                7,
+                -8,
+                14,
+                -4
+            ],
+            "babaaba": [
+                11,
+                -2,
+                2,
+                -3,
+                6,
+                -10,
+                10,
+                -11,
+                -1,
+                -10,
+                9,
+                14,
+                6
+            ],
+            "cacaaaaaaaabba": [
+                13,
+                -7,
+                5,
+                8,
+                0,
+                -3
+            ]
+        },
+        {
+            "aaabaaaaadaaaa": [
+                3,
+                2,
+                -3
+            ],
+            "aaacb": [
+                12,
+                -8,
+                0,
+                9,
+                -4,
+                -6
+            ],
+            "abaaab": [
+                12,
+                12,
+                -2,
+                1,
+                9,
+                6,
+                -5,
+                -11,
+                -7,
+                4,
+                -7,
+                0,
+                11
+            ],
+            "baaaaaaaaaaaa": [
+                -1,
+                -7,
+                12,
+                -9,
+                -14,
+                -8,
+                0
+            ],
+            "caaabaaaaaabb": [
+                12,
+                -6,
+                2,
+                14,
+                -8,
+                -6,
+                0,
+                7
+            ]
+        },
+        {
+            "abaabbaaaaaabb": [
+                -1,
+                -11,
+                -1,
+                3,
+                -8
+            ]
+        },
+        {
+            "aaababab": [
+                1,
+                6,
+                0,
+                7,
+                -14,
+                -2,
+                12,
+                2,
+                -13,
+                7,
+                -13,
+                -4,
+                -1
+            ],
+            "ababb": [
+                -8,
+                9
+            ],
+            "bababaaaaaabaa": [
+                2,
+                -12,
+                -5,
+                11,
+                -4,
+                -12,
+                -11,
+                6,
+                -4,
+                -14,
+                -1
+            ]
+        },
+        {
+            "aa": [
+                10,
+                -7,
+                5,
+                11,
+                10,
+                7,
+                3,
+                -2,
+                -12,
+                5,
+                -13
+            ],
+            "aaaaa": [
+                7,
+                3,
+                8,
+                -3,
+                -13
+            ],
+            "aaaaaa": [
+                9,
+                12,
+                14,
+                2,
+                8,
+                -11,
+                5,
+                8,
+                6,
+                -7,
+                3,
+                -5
+            ],
+            "aaaaaaa": [
+                1,
+                -3,
+                9,
+                -8,
+                -10,
+                -6,
+                0,
+                13,
+                -9,
+                6,
+                3,
+                1
+            ],
+            "aaaaaaaa": [
+                -13,
+                -11,
+                -11,
+                -9,
+                -13,
+                0,
+                -7,
+                7,
+                -1,
+                -4,
+                -6,
+                -11,
+                7
+            ],
+            "aaaaabaaaaa": [
+                10,
+                -5,
+                11,
+                4,
+                4,
+                -4,
+                -3,
+                -8,
+                5
+            ],
+            "aaaacaaaadcaa": [
+                -3,
+                -13,
+                -4,
+                -13,
+                -7,
+                8,
+                6,
+                2,
+                -3,
+                11,
+                -8,
+                9,
+                9
+            ],
+            "aabaaaaaa": [
+                -11,
+                14,
+                0,
+                0,
+                -12,
+                -9
+            ],
+            "aabaabbaaaaaab": [
+                -14,
+                -8,
+                -2,
+                -13,
+                9,
+                -12,
+                3,
+                11,
+                13,
+                13
+            ],
+            "daaaaaaba": [
+                11,
+                1,
+                -8
+            ]
+        },
+        {
+            "a": [
+                -12,
+                10,
+                -12,
+                -13,
+                -3,
+                -10,
+                2,
+                4,
+                -9,
+                1,
+                3,
+                7,
+                0,
+                0,
+                7,
+                4,
+                -7,
+                -9
+            ],
+            "aa": [
+                9,
+                7,
+                -6,
+                5,
+                -2,
+                11,
+                10,
+                1,
+                -6
+            ],
+            "aaaa": [
+                4,
+                11,
+                -6,
+                8,
+                -13,
+                -7
+            ],
+            "aaaaa": [
+                11,
+                -8,
+                -2,
+                -6,
+                9,
+                8,
+                13
+            ],
+            "aaaabbaa": [
+                -8,
+                -5,
+                -9,
+                -5
+            ],
+            "abaaaaba": [
+                8,
+                13,
+                -3
+            ],
+            "aca": [
+                -12,
+                -7,
+                -6
+            ],
+            "b": [
+                -5
+            ],
+            "baabbaaaaaaaaa": [
+                1,
+                -9,
+                -12,
+                4,
+                -10,
+                -6,
+                10,
+                -8,
+                -9,
+                -11,
+                -13,
+                -2
+            ]
+        },
+        {
+            "a": [
+                -5
+            ],
+            "aa": [
+                -10,
+                11,
+                -10,
+                2,
+                -4,
+                3,
+                2,
+                -10,
+                -12,
+                -5,
+                11,
+                -9,
+                11
+            ],
+            "aaa": [
+                10,
+                8,
+                10,
+                3,
+                1,
+                8,
+                4,
+                11,
+                -7,
+                -12,
+                -3,
+                11,
+                -2
+            ],
+            "aaaaacabbbbba": [
+                -9,
+                11,
+                0,
+                -13,
+                -7,
+                1,
+                5,
+                -9,
+                -6,
+                3,
+                -13,
+                -11,
+                6
+            ],
+            "aaab": [
+                14,
+                11,
+                -3,
+                0,
+                -7,
+                9
+            ],
+            "aaabbaaaaba": [
+                -6,
+                -2,
+                12,
+                -4,
+                -11
+            ],
+            "aababaaa": [
+                -14,
+                -12,
+                -7,
+                -1,
+                -2,
+                8,
+                -2,
+                12,
+                -6
+            ],
+            "aabababbaaaa": [
+                10,
+                -2,
+                -3,
+                8,
+                8,
+                11
+            ],
+            "abaaaaaacaba": [
+                -3,
+                10,
+                -7,
+                -5,
+                -2,
+                -10,
+                3,
+                0
+            ],
+            "ababaababa": [
+                2,
+                -4,
+                2,
+                -10,
+                4,
+                -12,
+                12,
+                -4,
+                5,
+                -8,
+                -10
+            ],
+            "acaabbbaaa": [
+                -7,
+                12,
+                10,
+                -9,
+                3,
+                0,
+                2,
+                -5,
+                8,
+                10,
+                5,
+                -2
+            ],
+            "acbbabaaab": [
+                7,
+                -6,
+                4,
+                -2,
+                -1,
+                0
+            ],
+            "baaaaaaaa": [
+                -1,
+                8,
+                -6,
+                -1,
+                -14,
+                10,
+                5,
+                9,
+                -12,
+                3,
+                7,
+                9
+            ],
+            "cbba": [
+                0,
+                0,
+                12,
+                -3,
+                14,
+                -2,
+                3,
+                13,
+                -3
+            ]
+        },
+        {
+            "": [
+                -14,
+                -9,
+                -1,
+                -10,
+                -1
+            ],
+            "aaaaaaaababbaa": [
+                -12,
+                6,
+                -10,
+                6
+            ],
+            "aabbabaaab": [
+                9,
+                8,
+                -6,
+                -12,
+                -14,
+                9,
+                4,
+                -1,
+                -9,
+                0,
+                6,
+                -10,
+                -9,
+                -5
+            ],
+            "ba": [
+                0
+            ]
+        }
+    ],
+    "seed": -1407975722
+}
diff --git a/golden/MonoidMap Text [Natural].json b/golden/MonoidMap Text [Natural].json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap Text [Natural].json
@@ -0,0 +1,563 @@
+{
+    "samples": [
+        {
+            "aaaabaabaa": [
+                2,
+                12,
+                3
+            ],
+            "aaaac": [
+                13,
+                11,
+                8,
+                10,
+                11,
+                3,
+                10,
+                10,
+                1,
+                9,
+                1,
+                3,
+                2
+            ],
+            "aabaabaaaaba": [
+                14,
+                11,
+                1,
+                5,
+                2,
+                0
+            ],
+            "abaaaa": [
+                0,
+                6,
+                13,
+                4,
+                2,
+                4,
+                1
+            ],
+            "baabaabbaaa": [
+                8,
+                7,
+                6,
+                5,
+                14,
+                8,
+                2,
+                1,
+                6,
+                6
+            ],
+            "cabaaaaaaaaaa": [
+                9,
+                11
+            ]
+        },
+        {
+            "aaaaaa": [
+                6,
+                12,
+                7,
+                2,
+                9,
+                12,
+                1
+            ],
+            "aaaabbbbbaba": [
+                6,
+                1,
+                13,
+                1,
+                3,
+                0,
+                9,
+                10,
+                12,
+                1,
+                1,
+                6,
+                6
+            ],
+            "aaaaca": [
+                10,
+                7,
+                5,
+                1,
+                12,
+                1,
+                13,
+                2,
+                3,
+                5,
+                2
+            ],
+            "acaaa": [
+                2,
+                12,
+                1,
+                6,
+                9,
+                5,
+                5,
+                14
+            ],
+            "baacacbcb": [
+                12,
+                12,
+                11,
+                14,
+                3
+            ]
+        },
+        {
+            "cbaadaaaaaba": [
+                10,
+                7
+            ]
+        },
+        {
+            "": [
+                9,
+                9,
+                7,
+                13,
+                6,
+                9,
+                2,
+                12,
+                11,
+                10,
+                3,
+                14
+            ],
+            "baaaaaaa": [
+                2,
+                10,
+                8
+            ],
+            "bbab": [
+                12,
+                9,
+                8,
+                12,
+                5,
+                13,
+                14,
+                11
+            ]
+        },
+        {
+            "": [
+                1,
+                10,
+                1
+            ],
+            "aaababaa": [
+                13
+            ],
+            "aacabb": [
+                7,
+                4,
+                4,
+                6,
+                2,
+                10,
+                1,
+                1
+            ],
+            "aba": [
+                6,
+                8,
+                4,
+                10,
+                7,
+                11,
+                8,
+                4,
+                12,
+                3,
+                4,
+                1
+            ],
+            "bbaaaaab": [
+                2,
+                6,
+                5,
+                2,
+                5,
+                0,
+                5,
+                7
+            ]
+        },
+        {
+            "a": [
+                2,
+                12,
+                0,
+                13,
+                1,
+                1,
+                9
+            ],
+            "aaaa": [
+                7,
+                14,
+                8,
+                10,
+                8,
+                11,
+                11,
+                5,
+                10,
+                13,
+                12,
+                2,
+                12
+            ],
+            "aaaaaaaaaaaaa": [
+                14,
+                0,
+                1,
+                3,
+                2,
+                0,
+                13,
+                14,
+                7,
+                9
+            ],
+            "aababbda": [
+                12,
+                1,
+                12,
+                12
+            ],
+            "aabcacaaaabbac": [
+                1,
+                13,
+                5,
+                1,
+                6,
+                7,
+                4,
+                2,
+                3,
+                7,
+                6,
+                5,
+                2
+            ],
+            "ab": [
+                10,
+                0,
+                14,
+                13,
+                9
+            ],
+            "abaaa": [
+                7,
+                4,
+                5,
+                5
+            ],
+            "b": [
+                0,
+                6,
+                14,
+                10,
+                7,
+                6
+            ]
+        },
+        {
+            "": [
+                0,
+                13,
+                7,
+                12,
+                0,
+                0,
+                14,
+                7,
+                1,
+                6,
+                7,
+                8,
+                3,
+                1,
+                12
+            ],
+            "aaacaaaabbaaa": [
+                8,
+                2,
+                5,
+                10,
+                0,
+                8,
+                13,
+                13,
+                12
+            ],
+            "aaacbaabaaaaaa": [
+                13,
+                4,
+                13,
+                9,
+                12,
+                11,
+                9
+            ],
+            "aaacbabd": [
+                7,
+                10,
+                7,
+                0,
+                11,
+                9,
+                6,
+                8,
+                8,
+                7,
+                8,
+                13,
+                13,
+                5
+            ]
+        },
+        {
+            "aaaa": [
+                2,
+                10,
+                5,
+                10,
+                13,
+                4,
+                12,
+                3,
+                4,
+                12,
+                9,
+                6,
+                0
+            ],
+            "aaaaaaaaaaaaab": [
+                5
+            ],
+            "aaaac": [
+                8,
+                11,
+                10,
+                6,
+                5,
+                7,
+                8,
+                5,
+                4,
+                13,
+                11,
+                9
+            ],
+            "aaabbbaaaa": [
+                7,
+                9,
+                13,
+                8,
+                11,
+                12,
+                10,
+                5
+            ],
+            "ac": [
+                9,
+                3,
+                14
+            ],
+            "b": [
+                0,
+                0,
+                2,
+                2,
+                4,
+                1
+            ],
+            "baabaabcaaaaba": [
+                10,
+                1,
+                10,
+                2,
+                12,
+                4
+            ],
+            "bacaa": [
+                14,
+                13,
+                9,
+                4,
+                5,
+                2,
+                6,
+                13,
+                12,
+                14,
+                9,
+                10,
+                13,
+                5
+            ],
+            "bbaa": [
+                7,
+                5
+            ],
+            "bcaaaab": [
+                6,
+                14,
+                0,
+                4,
+                13,
+                3
+            ]
+        },
+        {
+            "": [
+                1,
+                13,
+                9,
+                10,
+                9,
+                10,
+                7
+            ],
+            "abacbaaaaaabb": [
+                9,
+                12,
+                8,
+                9,
+                6,
+                9,
+                14
+            ]
+        },
+        {
+            "": [
+                0,
+                7,
+                12,
+                0,
+                7,
+                10,
+                2,
+                13,
+                2,
+                1
+            ],
+            "a": [
+                9,
+                11,
+                12,
+                11,
+                10,
+                14,
+                6,
+                12,
+                10,
+                14,
+                2,
+                4,
+                11
+            ],
+            "aaaa": [
+                1,
+                2,
+                12,
+                0,
+                0,
+                9
+            ],
+            "aaaaa": [
+                3,
+                9,
+                4,
+                10,
+                2,
+                8,
+                14,
+                6,
+                14,
+                10,
+                7
+            ],
+            "aaaaaaaaaaab": [
+                14,
+                0,
+                13
+            ],
+            "aaaabaab": [
+                6,
+                12,
+                7,
+                14,
+                1,
+                8,
+                13,
+                13,
+                12,
+                5,
+                13
+            ],
+            "aaaabaabaaa": [
+                1,
+                14,
+                7,
+                8,
+                11,
+                12,
+                7,
+                0,
+                13,
+                8,
+                14,
+                9,
+                6
+            ],
+            "aaababaabaaaba": [
+                4,
+                0
+            ],
+            "aabaaaaaaaaba": [
+                7,
+                6,
+                12,
+                12,
+                10,
+                12,
+                3,
+                10,
+                10,
+                12,
+                0,
+                2,
+                14
+            ],
+            "acaaaaababbaa": [
+                11,
+                0,
+                4
+            ],
+            "dbaaaa": [
+                13,
+                5,
+                14,
+                0,
+                14,
+                7,
+                14,
+                6,
+                1
+            ]
+        }
+    ],
+    "seed": 1208460125
+}
diff --git a/golden/MonoidMap [Int] (Dual Text).json b/golden/MonoidMap [Int] (Dual Text).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] (Dual Text).json
@@ -0,0 +1,552 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -13,
+                    3,
+                    4,
+                    1,
+                    -10,
+                    1,
+                    12,
+                    2,
+                    1,
+                    -3,
+                    -1,
+                    -5
+                ],
+                "aabaaaaa"
+            ],
+            [
+                [
+                    10,
+                    -1
+                ],
+                "ababaaaaaa"
+            ],
+            [
+                [
+                    11,
+                    7,
+                    11,
+                    11,
+                    -11,
+                    -14,
+                    14,
+                    0,
+                    -7,
+                    4,
+                    8,
+                    10
+                ],
+                "abaaaaa"
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    11,
+                    -1,
+                    6,
+                    -3,
+                    4,
+                    11,
+                    -4,
+                    -10,
+                    13,
+                    -8,
+                    5,
+                    8,
+                    -11
+                ],
+                "caacabaaaaaaaa"
+            ],
+            [
+                [
+                    -10,
+                    -3,
+                    10,
+                    14,
+                    13,
+                    -11,
+                    -9,
+                    -14,
+                    3,
+                    -10,
+                    10,
+                    -3,
+                    -5,
+                    -10
+                ],
+                "aaaaaabaabaab"
+            ],
+            [
+                [
+                    -3,
+                    7,
+                    -14,
+                    -12,
+                    -6,
+                    -13,
+                    -6,
+                    3,
+                    11
+                ],
+                "babbaabacaaba"
+            ],
+            [
+                [
+                    -1,
+                    0,
+                    3,
+                    9,
+                    6,
+                    -8,
+                    -4,
+                    14,
+                    -8,
+                    -4,
+                    4,
+                    4,
+                    -1,
+                    2
+                ],
+                "aaacaabaaabaa"
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -12,
+                    -6
+                ],
+                "aaabbaaabaaaa"
+            ],
+            [
+                [
+                    -7,
+                    6,
+                    -10,
+                    -7,
+                    -8,
+                    2
+                ],
+                "aaababba"
+            ],
+            [
+                [
+                    -2,
+                    14,
+                    -8,
+                    -9
+                ],
+                "baaabaabaaaaa"
+            ],
+            [
+                [
+                    7,
+                    1,
+                    6,
+                    -5,
+                    13,
+                    1,
+                    7,
+                    -3,
+                    -12
+                ],
+                "caaaabaab"
+            ],
+            [
+                [
+                    9
+                ],
+                "aa"
+            ]
+        ],
+        [
+            [
+                [],
+                "aacaaaaabaaabaa"
+            ],
+            [
+                [
+                    -8,
+                    -8,
+                    -6,
+                    14,
+                    2,
+                    10,
+                    -6,
+                    5
+                ],
+                "baaabaaaaaa"
+            ],
+            [
+                [
+                    -5,
+                    -5
+                ],
+                "cbaaabaaca"
+            ],
+            [
+                [
+                    -5,
+                    -3,
+                    3,
+                    -1,
+                    -6,
+                    4,
+                    -2,
+                    -9,
+                    7,
+                    -4,
+                    11,
+                    8,
+                    -2
+                ],
+                "acaaaaca"
+            ],
+            [
+                [
+                    -2,
+                    -7,
+                    9
+                ],
+                "ab"
+            ],
+            [
+                [
+                    3
+                ],
+                "aabaaadc"
+            ],
+            [
+                [
+                    7,
+                    -14,
+                    -4
+                ],
+                "aaaaababaabaa"
+            ]
+        ],
+        [
+            [
+                [],
+                "aaaabbaabb"
+            ],
+            [
+                [
+                    -10,
+                    12,
+                    -6,
+                    -9,
+                    -4,
+                    -8,
+                    0,
+                    -6,
+                    -5,
+                    -14,
+                    -9
+                ],
+                "babaaaabaabaa"
+            ],
+            [
+                [
+                    -5,
+                    0,
+                    -14,
+                    7,
+                    3,
+                    0,
+                    7,
+                    -10,
+                    14,
+                    -10
+                ],
+                "aa"
+            ],
+            [
+                [
+                    0,
+                    14,
+                    11,
+                    4,
+                    6,
+                    -10,
+                    -14
+                ],
+                "aaaaaaaaab"
+            ],
+            [
+                [
+                    10,
+                    -5,
+                    13,
+                    3,
+                    12,
+                    2,
+                    -14,
+                    -3,
+                    -3
+                ],
+                "ba"
+            ]
+        ],
+        [
+            [
+                [
+                    -7,
+                    -11,
+                    1,
+                    3,
+                    -1,
+                    10,
+                    11,
+                    11,
+                    -5,
+                    -3,
+                    2,
+                    7,
+                    10
+                ],
+                "aaab"
+            ],
+            [
+                [
+                    -7,
+                    -9,
+                    -8,
+                    -7,
+                    -2,
+                    2,
+                    5,
+                    3,
+                    -10,
+                    -14
+                ],
+                "abcaaaaa"
+            ],
+            [
+                [
+                    4,
+                    11,
+                    7,
+                    -14,
+                    8,
+                    -8,
+                    0,
+                    -14,
+                    2,
+                    -13,
+                    4
+                ],
+                "baa"
+            ]
+        ],
+        [
+            [
+                [
+                    -8,
+                    3,
+                    11,
+                    5,
+                    -6,
+                    -10,
+                    13,
+                    -8,
+                    12,
+                    8
+                ],
+                "aaaabaca"
+            ]
+        ],
+        [
+            [
+                [
+                    13,
+                    0,
+                    -11,
+                    0,
+                    5,
+                    -8,
+                    -1,
+                    12,
+                    -11,
+                    -14,
+                    -11
+                ],
+                "babadaababaaba"
+            ]
+        ],
+        [
+            [
+                [],
+                "a"
+            ],
+            [
+                [
+                    -11,
+                    -2,
+                    -4,
+                    -1,
+                    -4
+                ],
+                "baaaaaaaaca"
+            ],
+            [
+                [
+                    -10
+                ],
+                "aabb"
+            ],
+            [
+                [
+                    -8,
+                    -12,
+                    2,
+                    9,
+                    -7,
+                    14,
+                    12,
+                    3,
+                    1,
+                    7,
+                    3,
+                    -12,
+                    3,
+                    -5
+                ],
+                "aaa"
+            ],
+            [
+                [
+                    -7,
+                    6,
+                    12,
+                    -2,
+                    -5
+                ],
+                "aaabaaacb"
+            ],
+            [
+                [
+                    -6,
+                    -9,
+                    3,
+                    -14,
+                    10,
+                    13,
+                    8
+                ],
+                "abbaaaaadab"
+            ],
+            [
+                [
+                    -3,
+                    -5,
+                    6,
+                    -4,
+                    -6
+                ],
+                "aaaaaaaaad"
+            ],
+            [
+                [
+                    6,
+                    8,
+                    14,
+                    6
+                ],
+                "aaaaaaabac"
+            ],
+            [
+                [
+                    9,
+                    8,
+                    -1,
+                    -6,
+                    -13,
+                    4,
+                    -5,
+                    -6,
+                    -14,
+                    4,
+                    -12,
+                    -8
+                ],
+                "baba"
+            ],
+            [
+                [
+                    10,
+                    5
+                ],
+                "a"
+            ],
+            [
+                [
+                    14,
+                    4,
+                    -13,
+                    1,
+                    6,
+                    -8,
+                    11,
+                    8,
+                    10,
+                    5
+                ],
+                "aaaababbdaaa"
+            ]
+        ],
+        [
+            [
+                [
+                    -1,
+                    13,
+                    11,
+                    13,
+                    5
+                ],
+                "a"
+            ],
+            [
+                [
+                    1,
+                    12,
+                    -3,
+                    -14,
+                    7,
+                    -6,
+                    -4,
+                    -9,
+                    13,
+                    -3,
+                    -8
+                ],
+                "baaaaabaaa"
+            ],
+            [
+                [
+                    12,
+                    2,
+                    10,
+                    4,
+                    10,
+                    13,
+                    14,
+                    9,
+                    14,
+                    11,
+                    -13,
+                    -5
+                ],
+                "aaaaaaaaaaaca"
+            ]
+        ]
+    ],
+    "seed": 1701770352
+}
diff --git a/golden/MonoidMap [Int] (Dual [Int]).json b/golden/MonoidMap [Int] (Dual [Int]).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] (Dual [Int]).json
@@ -0,0 +1,1327 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -3,
+                    8,
+                    -12,
+                    9,
+                    0,
+                    10,
+                    -3,
+                    -10,
+                    -11,
+                    -6,
+                    5,
+                    -7
+                ],
+                [
+                    2,
+                    2,
+                    -8,
+                    0,
+                    5
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -6,
+                    -7,
+                    4,
+                    -12
+                ],
+                [
+                    -14,
+                    3,
+                    10,
+                    2,
+                    -1,
+                    6,
+                    -10,
+                    -11,
+                    -5,
+                    11,
+                    0,
+                    3,
+                    -4
+                ]
+            ],
+            [
+                [
+                    2,
+                    -14,
+                    -8,
+                    -8,
+                    3,
+                    -7
+                ],
+                [
+                    14,
+                    12,
+                    -3,
+                    -1,
+                    7,
+                    -4,
+                    -9,
+                    10,
+                    -4,
+                    9,
+                    1,
+                    9,
+                    -1
+                ]
+            ],
+            [
+                [
+                    2,
+                    10,
+                    -2,
+                    0,
+                    10,
+                    9,
+                    6,
+                    -14,
+                    -8,
+                    -10,
+                    -14,
+                    -7
+                ],
+                [
+                    9,
+                    0,
+                    -14
+                ]
+            ],
+            [
+                [
+                    10,
+                    -7,
+                    -7
+                ],
+                [
+                    -5,
+                    -12,
+                    -13,
+                    -7,
+                    2,
+                    4,
+                    -5,
+                    -12,
+                    -12,
+                    0,
+                    13
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    0,
+                    13,
+                    10,
+                    -9,
+                    -10,
+                    4
+                ],
+                [
+                    1,
+                    -6,
+                    1,
+                    4,
+                    -10,
+                    8,
+                    -1,
+                    1,
+                    -12
+                ]
+            ],
+            [
+                [
+                    2,
+                    6
+                ],
+                [
+                    2,
+                    -1,
+                    2,
+                    8,
+                    -2,
+                    8,
+                    11,
+                    -3,
+                    -8,
+                    12,
+                    0,
+                    -7,
+                    -10
+                ]
+            ],
+            [
+                [
+                    4,
+                    -9,
+                    7
+                ],
+                [
+                    1,
+                    -11,
+                    7,
+                    -1,
+                    13,
+                    5,
+                    -12,
+                    1,
+                    2,
+                    4,
+                    -2
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -10
+                ],
+                [
+                    10,
+                    -3
+                ]
+            ],
+            [
+                [
+                    -6
+                ],
+                [
+                    7,
+                    -2,
+                    3,
+                    5,
+                    -3,
+                    5,
+                    -7,
+                    13,
+                    11,
+                    -11,
+                    9,
+                    -2
+                ]
+            ],
+            [
+                [
+                    -4,
+                    -5,
+                    -6,
+                    8,
+                    -8,
+                    -8,
+                    -5,
+                    6,
+                    9,
+                    12,
+                    -7,
+                    -13,
+                    12
+                ],
+                [
+                    14,
+                    -7,
+                    -1
+                ]
+            ],
+            [
+                [
+                    8,
+                    13,
+                    6,
+                    10,
+                    9,
+                    -2,
+                    3
+                ],
+                [
+                    -8,
+                    -7,
+                    2,
+                    9
+                ]
+            ],
+            [
+                [
+                    14,
+                    5,
+                    -10,
+                    -9
+                ],
+                [
+                    3,
+                    10,
+                    2,
+                    -13,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    -12,
+                    -4,
+                    -8
+                ],
+                [
+                    6,
+                    -4,
+                    -13,
+                    14,
+                    2,
+                    6,
+                    -3,
+                    -8,
+                    -12,
+                    -9,
+                    -10,
+                    -3,
+                    5,
+                    -9
+                ]
+            ],
+            [
+                [
+                    -10,
+                    -9,
+                    8
+                ],
+                [
+                    13,
+                    -2,
+                    -8,
+                    6,
+                    -4,
+                    0,
+                    -10,
+                    0,
+                    6
+                ]
+            ],
+            [
+                [
+                    -10,
+                    -3,
+                    5,
+                    8
+                ],
+                [
+                    10,
+                    -7,
+                    -8
+                ]
+            ],
+            [
+                [
+                    -9,
+                    -6,
+                    6,
+                    11
+                ],
+                [
+                    4,
+                    5,
+                    13,
+                    4,
+                    7,
+                    -8,
+                    7,
+                    7,
+                    6
+                ]
+            ],
+            [
+                [
+                    -6,
+                    13,
+                    1,
+                    -7,
+                    2,
+                    13,
+                    0,
+                    14,
+                    12,
+                    -4,
+                    2,
+                    -14,
+                    -12,
+                    2
+                ],
+                [
+                    4,
+                    8,
+                    4
+                ]
+            ],
+            [
+                [
+                    -5,
+                    1,
+                    -3,
+                    14
+                ],
+                [
+                    8,
+                    5,
+                    4,
+                    -12
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -2,
+                    9,
+                    2,
+                    -14,
+                    11
+                ],
+                [
+                    -9,
+                    -8,
+                    1
+                ]
+            ],
+            [
+                [
+                    -1,
+                    0,
+                    9,
+                    -12
+                ],
+                [
+                    -11,
+                    14
+                ]
+            ],
+            [
+                [
+                    4,
+                    -6,
+                    1,
+                    -7,
+                    -2,
+                    4,
+                    -12,
+                    9,
+                    1,
+                    6
+                ],
+                [
+                    11,
+                    9,
+                    7,
+                    6,
+                    -10,
+                    -2,
+                    4
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    6,
+                    -6,
+                    -14,
+                    3,
+                    7,
+                    1,
+                    -1,
+                    8,
+                    8,
+                    -12,
+                    1,
+                    -12,
+                    9,
+                    -9,
+                    8,
+                    -8,
+                    4,
+                    -11,
+                    -10,
+                    -3,
+                    -13,
+                    0,
+                    -14,
+                    14
+                ]
+            ],
+            [
+                [
+                    -12,
+                    -9,
+                    -12,
+                    3,
+                    -5,
+                    2,
+                    8,
+                    13,
+                    12,
+                    -9
+                ],
+                [
+                    -4,
+                    13,
+                    -6,
+                    -3,
+                    12,
+                    -8,
+                    -6,
+                    9,
+                    3
+                ]
+            ],
+            [
+                [
+                    -12,
+                    5,
+                    -5,
+                    13,
+                    1,
+                    -5,
+                    -11,
+                    10,
+                    13,
+                    5,
+                    -5,
+                    -5
+                ],
+                [
+                    5,
+                    4,
+                    -12,
+                    -12,
+                    -11,
+                    5,
+                    -4,
+                    0
+                ]
+            ],
+            [
+                [
+                    -5,
+                    -3,
+                    -6,
+                    10,
+                    -6,
+                    -8,
+                    13,
+                    6,
+                    -7,
+                    -2,
+                    6,
+                    -1
+                ],
+                [
+                    -1,
+                    -4,
+                    -11,
+                    5,
+                    0,
+                    -7,
+                    -3,
+                    7,
+                    7,
+                    -5,
+                    -2
+                ]
+            ],
+            [
+                [
+                    -3,
+                    14,
+                    4,
+                    -2,
+                    -2,
+                    -13,
+                    -2,
+                    4,
+                    6,
+                    10
+                ],
+                [
+                    0,
+                    12,
+                    -14,
+                    -14,
+                    -10,
+                    7,
+                    10
+                ]
+            ],
+            [
+                [
+                    -2,
+                    10,
+                    -14,
+                    2,
+                    -8,
+                    -7,
+                    -1,
+                    -11,
+                    8,
+                    -1,
+                    -9
+                ],
+                [
+                    5,
+                    11,
+                    1,
+                    -3
+                ]
+            ],
+            [
+                [
+                    3,
+                    8,
+                    6,
+                    7
+                ],
+                [
+                    -9,
+                    -1,
+                    -10,
+                    -14,
+                    -9,
+                    12,
+                    -3
+                ]
+            ],
+            [
+                [
+                    4,
+                    -12,
+                    -14,
+                    -9,
+                    9,
+                    3,
+                    -2,
+                    6,
+                    -9,
+                    9
+                ],
+                [
+                    0,
+                    -9,
+                    -9,
+                    -8
+                ]
+            ],
+            [
+                [
+                    5,
+                    5,
+                    -6,
+                    11,
+                    -11,
+                    -12,
+                    0,
+                    13,
+                    10,
+                    -12,
+                    6,
+                    -7,
+                    -4,
+                    11
+                ],
+                [
+                    -10,
+                    12,
+                    -11,
+                    11,
+                    -14,
+                    -3,
+                    -12
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    -10,
+                    -13,
+                    -10,
+                    -3,
+                    0,
+                    -14,
+                    -9,
+                    6,
+                    12,
+                    -4,
+                    7,
+                    14,
+                    -9
+                ],
+                [
+                    -7,
+                    2,
+                    8,
+                    -3,
+                    -12,
+                    7,
+                    13,
+                    7,
+                    2,
+                    11,
+                    0
+                ]
+            ],
+            [
+                [
+                    -8,
+                    -2,
+                    3,
+                    -7,
+                    11
+                ],
+                [
+                    -9,
+                    4,
+                    12,
+                    10,
+                    -4,
+                    5,
+                    -5,
+                    2,
+                    -14
+                ]
+            ],
+            [
+                [
+                    -7,
+                    -4,
+                    -7,
+                    2,
+                    -1,
+                    -1
+                ],
+                [
+                    5,
+                    -5,
+                    -8,
+                    -1,
+                    10,
+                    5,
+                    10,
+                    -6,
+                    -1,
+                    -1,
+                    8,
+                    -10
+                ]
+            ],
+            [
+                [
+                    -7,
+                    10,
+                    5,
+                    8,
+                    -4,
+                    -3,
+                    5,
+                    5,
+                    13,
+                    12
+                ],
+                [
+                    -8,
+                    -14,
+                    -14,
+                    1,
+                    -10,
+                    -13,
+                    7,
+                    -8
+                ]
+            ],
+            [
+                [
+                    -1,
+                    8,
+                    -11,
+                    1,
+                    -4,
+                    4,
+                    -1,
+                    -3,
+                    -9,
+                    -7,
+                    0,
+                    -4,
+                    -9
+                ],
+                [
+                    12,
+                    6,
+                    10,
+                    -4,
+                    -5,
+                    -9,
+                    11,
+                    -1,
+                    -13
+                ]
+            ],
+            [
+                [
+                    0,
+                    7,
+                    -1,
+                    -11,
+                    -3,
+                    1,
+                    -2,
+                    -13
+                ],
+                [
+                    3,
+                    6,
+                    -10,
+                    11,
+                    11,
+                    7,
+                    3,
+                    -2,
+                    4,
+                    2,
+                    -5,
+                    -9,
+                    11,
+                    -14
+                ]
+            ],
+            [
+                [
+                    0,
+                    10,
+                    -14,
+                    -8,
+                    -9,
+                    10,
+                    14,
+                    9,
+                    2,
+                    6,
+                    5,
+                    14,
+                    11,
+                    3
+                ],
+                [
+                    -9,
+                    -4,
+                    -11,
+                    3,
+                    0,
+                    8,
+                    8,
+                    -6,
+                    -3,
+                    -8,
+                    -5,
+                    9,
+                    -5
+                ]
+            ],
+            [
+                [
+                    4,
+                    -7,
+                    -9,
+                    10,
+                    6,
+                    -3,
+                    1,
+                    9,
+                    3,
+                    -2,
+                    6
+                ],
+                [
+                    -13,
+                    2,
+                    9,
+                    -5,
+                    -12,
+                    -1
+                ]
+            ],
+            [
+                [
+                    7
+                ],
+                [
+                    2,
+                    0,
+                    2,
+                    -8,
+                    -11,
+                    0,
+                    5,
+                    -14,
+                    1,
+                    7
+                ]
+            ],
+            [
+                [
+                    10,
+                    13,
+                    -3,
+                    -6,
+                    -7,
+                    10,
+                    2,
+                    13,
+                    10
+                ],
+                [
+                    -8,
+                    1,
+                    -1,
+                    5,
+                    -9,
+                    5,
+                    7,
+                    -9,
+                    -10,
+                    0,
+                    2,
+                    9,
+                    -5,
+                    13
+                ]
+            ],
+            [
+                [
+                    12
+                ],
+                [
+                    -4,
+                    10,
+                    4
+                ]
+            ],
+            [
+                [
+                    13,
+                    3
+                ],
+                [
+                    3,
+                    10,
+                    -11,
+                    -3,
+                    3,
+                    -13,
+                    -6,
+                    -12,
+                    10,
+                    5,
+                    -14,
+                    -1,
+                    6,
+                    10
+                ]
+            ],
+            [
+                [
+                    14,
+                    -10
+                ],
+                [
+                    -3,
+                    4,
+                    -8,
+                    5,
+                    10,
+                    7,
+                    -10,
+                    1,
+                    -5
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    9,
+                    -14,
+                    -8,
+                    -14,
+                    14,
+                    10,
+                    -10,
+                    8,
+                    -4,
+                    7,
+                    14,
+                    -10,
+                    -9,
+                    10,
+                    -7,
+                    11,
+                    -2,
+                    -12,
+                    0,
+                    -8,
+                    -4,
+                    -6,
+                    3,
+                    10,
+                    14
+                ]
+            ],
+            [
+                [
+                    -7,
+                    -13,
+                    6,
+                    -9,
+                    -3
+                ],
+                [
+                    -12
+                ]
+            ],
+            [
+                [
+                    -5,
+                    -1,
+                    11,
+                    11,
+                    -5,
+                    -7,
+                    -11,
+                    4,
+                    -3,
+                    -8,
+                    13
+                ],
+                [
+                    -1,
+                    0,
+                    -14
+                ]
+            ],
+            [
+                [
+                    -5,
+                    9,
+                    -14,
+                    12,
+                    -6,
+                    11,
+                    -5,
+                    -9,
+                    3,
+                    -13,
+                    0,
+                    1,
+                    -4
+                ],
+                [
+                    -5,
+                    -6,
+                    7,
+                    -3,
+                    9,
+                    -13,
+                    12,
+                    -4,
+                    -6,
+                    10,
+                    -1,
+                    14,
+                    -8,
+                    1
+                ]
+            ],
+            [
+                [
+                    -2,
+                    11,
+                    5,
+                    -10,
+                    -8,
+                    12,
+                    -2
+                ],
+                [
+                    -8,
+                    12,
+                    12,
+                    12,
+                    -10,
+                    -8,
+                    6,
+                    4,
+                    14
+                ]
+            ],
+            [
+                [
+                    4,
+                    -3
+                ],
+                [
+                    -11,
+                    6,
+                    -6,
+                    -4,
+                    -5,
+                    14,
+                    -12,
+                    11,
+                    -11,
+                    0,
+                    -7,
+                    5
+                ]
+            ],
+            [
+                [
+                    4,
+                    2,
+                    8,
+                    5,
+                    7,
+                    11,
+                    -2,
+                    -8,
+                    9,
+                    -13,
+                    -8
+                ],
+                [
+                    -13,
+                    -8,
+                    -9,
+                    6,
+                    3,
+                    -9,
+                    -5,
+                    12
+                ]
+            ],
+            [
+                [
+                    5,
+                    -4,
+                    -2,
+                    5
+                ],
+                [
+                    6,
+                    3,
+                    -4,
+                    12,
+                    -11,
+                    -14,
+                    4,
+                    11,
+                    -6,
+                    -4
+                ]
+            ],
+            [
+                [
+                    6,
+                    7,
+                    -14,
+                    6,
+                    6,
+                    13,
+                    -14,
+                    -2,
+                    11,
+                    5,
+                    0,
+                    -2,
+                    0,
+                    6
+                ],
+                [
+                    4,
+                    -4,
+                    -1,
+                    3,
+                    -5,
+                    4,
+                    -14,
+                    9,
+                    0,
+                    -3,
+                    1,
+                    -3
+                ]
+            ],
+            [
+                [
+                    13,
+                    0,
+                    11,
+                    -4,
+                    4,
+                    4,
+                    2,
+                    -5,
+                    -3,
+                    2,
+                    -3,
+                    -8,
+                    -11,
+                    -13
+                ],
+                [
+                    12,
+                    8,
+                    12,
+                    7,
+                    -1,
+                    6,
+                    3,
+                    6
+                ]
+            ],
+            [
+                [
+                    14,
+                    7,
+                    -7,
+                    -4,
+                    -14,
+                    2,
+                    13,
+                    -14,
+                    -14,
+                    -8
+                ],
+                [
+                    12,
+                    13,
+                    -13,
+                    0,
+                    0,
+                    4,
+                    -7,
+                    10,
+                    -14,
+                    0,
+                    -7
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    2,
+                    -14,
+                    11,
+                    6,
+                    -10,
+                    -5,
+                    4,
+                    -9,
+                    6,
+                    -13
+                ],
+                [
+                    -1,
+                    -5,
+                    -6,
+                    2,
+                    -4,
+                    11,
+                    14,
+                    -3,
+                    3,
+                    10,
+                    8
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -2,
+                    14,
+                    -5,
+                    -7
+                ],
+                [
+                    -14,
+                    8,
+                    -9,
+                    -6,
+                    -11
+                ]
+            ],
+            [
+                [
+                    -8,
+                    6,
+                    13,
+                    3
+                ],
+                [
+                    -5,
+                    -7,
+                    12
+                ]
+            ],
+            [
+                [
+                    5,
+                    12
+                ],
+                [
+                    -8,
+                    11,
+                    -3,
+                    -6,
+                    1
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    4,
+                    -11,
+                    11,
+                    9,
+                    6,
+                    2,
+                    -13
+                ],
+                [
+                    1,
+                    -11,
+                    12,
+                    14,
+                    14,
+                    10,
+                    14,
+                    -13,
+                    -11
+                ]
+            ]
+        ]
+    ],
+    "seed": 1190531489
+}
diff --git a/golden/MonoidMap [Int] (Dual [Natural]).json b/golden/MonoidMap [Int] (Dual [Natural]).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] (Dual [Natural]).json
@@ -0,0 +1,1244 @@
+{
+    "samples": [
+        [
+            [
+                [],
+                [
+                    11,
+                    11
+                ]
+            ],
+            [
+                [
+                    -7,
+                    -11,
+                    -4
+                ],
+                [
+                    4,
+                    3,
+                    7,
+                    6,
+                    0,
+                    3,
+                    4,
+                    14,
+                    13,
+                    10,
+                    13,
+                    3,
+                    9,
+                    13
+                ]
+            ],
+            [
+                [
+                    -4,
+                    7,
+                    11,
+                    10,
+                    -5,
+                    3
+                ],
+                [
+                    12,
+                    2,
+                    9,
+                    7,
+                    9,
+                    0,
+                    9
+                ]
+            ],
+            [
+                [
+                    6,
+                    -14,
+                    14,
+                    6,
+                    12,
+                    2,
+                    4,
+                    4,
+                    -11
+                ],
+                [
+                    5,
+                    0,
+                    5,
+                    13,
+                    0,
+                    2,
+                    4,
+                    12,
+                    9,
+                    12,
+                    14,
+                    10,
+                    11,
+                    4
+                ]
+            ],
+            [
+                [
+                    8
+                ],
+                [
+                    1,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    12,
+                    8,
+                    14,
+                    -11,
+                    8,
+                    9,
+                    0
+                ],
+                [
+                    1,
+                    10,
+                    10,
+                    6,
+                    2,
+                    4,
+                    5,
+                    3,
+                    3,
+                    9,
+                    7
+                ]
+            ],
+            [
+                [
+                    -8,
+                    7,
+                    -10,
+                    -10,
+                    -11,
+                    2,
+                    -3,
+                    -10,
+                    -8,
+                    0
+                ],
+                [
+                    1
+                ]
+            ],
+            [
+                [
+                    -3
+                ],
+                [
+                    8,
+                    12,
+                    12,
+                    4,
+                    9,
+                    0,
+                    3,
+                    10,
+                    10,
+                    4,
+                    2,
+                    13,
+                    4,
+                    9
+                ]
+            ],
+            [
+                [
+                    11,
+                    -11,
+                    -14,
+                    -5,
+                    -12,
+                    -14
+                ],
+                [
+                    12,
+                    0,
+                    8,
+                    8,
+                    0,
+                    4,
+                    14,
+                    12,
+                    4,
+                    3,
+                    11,
+                    4
+                ]
+            ],
+            [
+                [
+                    13,
+                    5,
+                    6,
+                    13,
+                    7,
+                    7,
+                    -12,
+                    -10,
+                    14,
+                    10,
+                    14,
+                    -6,
+                    -6,
+                    -1
+                ],
+                [
+                    6,
+                    0
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    5,
+                    5,
+                    5,
+                    12
+                ]
+            ],
+            [
+                [
+                    -2,
+                    1,
+                    3,
+                    -8,
+                    0,
+                    -11
+                ],
+                [
+                    14,
+                    3,
+                    12
+                ]
+            ],
+            [
+                [
+                    5
+                ],
+                [
+                    13,
+                    12,
+                    9,
+                    12,
+                    9,
+                    12,
+                    3,
+                    3,
+                    2
+                ]
+            ]
+        ],
+        [],
+        [
+            [
+                [
+                    -9,
+                    6,
+                    -14,
+                    14,
+                    8,
+                    -4
+                ],
+                [
+                    5,
+                    0,
+                    3,
+                    9,
+                    10,
+                    1,
+                    3,
+                    3,
+                    9,
+                    2
+                ]
+            ],
+            [
+                [
+                    -6,
+                    -5,
+                    14,
+                    13,
+                    1
+                ],
+                [
+                    3,
+                    5,
+                    11,
+                    14,
+                    2,
+                    1,
+                    3,
+                    11
+                ]
+            ],
+            [
+                [
+                    0,
+                    7,
+                    -6,
+                    -12,
+                    -13,
+                    14,
+                    -6,
+                    -5,
+                    -4,
+                    8
+                ],
+                [
+                    3,
+                    7,
+                    10,
+                    11,
+                    0,
+                    1,
+                    13,
+                    5,
+                    9,
+                    11,
+                    9,
+                    1,
+                    0,
+                    12
+                ]
+            ],
+            [
+                [
+                    3,
+                    -10,
+                    10,
+                    14,
+                    9,
+                    -11,
+                    3,
+                    9,
+                    11,
+                    1,
+                    9,
+                    13,
+                    -3,
+                    13
+                ],
+                [
+                    10,
+                    13,
+                    5,
+                    11
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    5,
+                    13,
+                    4,
+                    1,
+                    13,
+                    5,
+                    11,
+                    11,
+                    1,
+                    13,
+                    12,
+                    12,
+                    1,
+                    0,
+                    0,
+                    0,
+                    4,
+                    6,
+                    9,
+                    10,
+                    5,
+                    13,
+                    14,
+                    13,
+                    8,
+                    8,
+                    9,
+                    1,
+                    9,
+                    1
+                ]
+            ],
+            [
+                [
+                    -14,
+                    3,
+                    11,
+                    10,
+                    -14,
+                    1,
+                    1,
+                    13,
+                    8
+                ],
+                [
+                    9,
+                    9,
+                    4,
+                    4,
+                    2,
+                    1
+                ]
+            ],
+            [
+                [
+                    -7,
+                    10,
+                    -2,
+                    1,
+                    -12,
+                    10,
+                    -13,
+                    4,
+                    8,
+                    2,
+                    -10,
+                    -3,
+                    -10,
+                    5
+                ],
+                [
+                    6,
+                    12,
+                    7,
+                    5,
+                    11,
+                    7,
+                    11,
+                    12
+                ]
+            ],
+            [
+                [
+                    -5,
+                    9,
+                    5,
+                    8,
+                    5
+                ],
+                [
+                    6,
+                    5,
+                    4,
+                    0,
+                    4,
+                    5,
+                    2,
+                    6,
+                    7,
+                    8,
+                    9,
+                    8,
+                    10,
+                    7
+                ]
+            ],
+            [
+                [
+                    3,
+                    -8,
+                    -5
+                ],
+                [
+                    14,
+                    10,
+                    0,
+                    6,
+                    9,
+                    10,
+                    9,
+                    4,
+                    3,
+                    14,
+                    13
+                ]
+            ],
+            [
+                [
+                    4,
+                    -1,
+                    -9,
+                    -11,
+                    5,
+                    -1,
+                    9,
+                    -11,
+                    -6,
+                    11
+                ],
+                [
+                    2,
+                    3,
+                    7,
+                    10,
+                    0,
+                    10,
+                    8,
+                    0,
+                    7,
+                    13,
+                    6,
+                    12,
+                    0,
+                    5
+                ]
+            ],
+            [
+                [
+                    5,
+                    -8
+                ],
+                [
+                    12,
+                    14,
+                    12,
+                    11,
+                    8,
+                    11,
+                    4,
+                    11,
+                    14,
+                    3,
+                    5,
+                    2,
+                    10
+                ]
+            ],
+            [
+                [
+                    10,
+                    11,
+                    5,
+                    -7,
+                    -4,
+                    12,
+                    1,
+                    -2,
+                    7,
+                    -5,
+                    10,
+                    14,
+                    9
+                ],
+                [
+                    0,
+                    14,
+                    13,
+                    9,
+                    11,
+                    7,
+                    5,
+                    9
+                ]
+            ],
+            [
+                [
+                    13,
+                    6,
+                    0,
+                    8,
+                    -12,
+                    -3,
+                    11,
+                    -14,
+                    -14,
+                    8,
+                    3,
+                    -13,
+                    -8
+                ],
+                [
+                    6,
+                    3,
+                    0,
+                    8,
+                    8,
+                    9,
+                    4,
+                    6,
+                    9,
+                    4,
+                    6,
+                    13,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    -4,
+                    2,
+                    14,
+                    -14,
+                    -5
+                ],
+                [
+                    4,
+                    2,
+                    14,
+                    13,
+                    2,
+                    0,
+                    11,
+                    12,
+                    14,
+                    13
+                ]
+            ],
+            [
+                [
+                    -10,
+                    -6,
+                    -8
+                ],
+                [
+                    3,
+                    14,
+                    13,
+                    11,
+                    1
+                ]
+            ],
+            [
+                [
+                    -7,
+                    -13
+                ],
+                [
+                    10,
+                    4
+                ]
+            ],
+            [
+                [
+                    -7,
+                    -10,
+                    -11,
+                    -11,
+                    0,
+                    -9,
+                    9,
+                    -2,
+                    -4,
+                    6
+                ],
+                [
+                    10,
+                    4,
+                    3,
+                    2
+                ]
+            ],
+            [
+                [
+                    -7,
+                    6
+                ],
+                [
+                    7,
+                    5,
+                    2,
+                    12,
+                    4,
+                    13
+                ]
+            ],
+            [
+                [
+                    -6,
+                    -3,
+                    -9,
+                    -7,
+                    -7,
+                    6,
+                    8,
+                    -5,
+                    -9,
+                    2,
+                    -1,
+                    11
+                ],
+                [
+                    0,
+                    5,
+                    8,
+                    5,
+                    5,
+                    7,
+                    5,
+                    10,
+                    7,
+                    8,
+                    7,
+                    13,
+                    8
+                ]
+            ],
+            [
+                [
+                    -1,
+                    -4,
+                    8,
+                    -2,
+                    -14,
+                    2
+                ],
+                [
+                    5,
+                    10,
+                    14,
+                    9,
+                    2,
+                    5,
+                    10,
+                    13
+                ]
+            ],
+            [
+                [
+                    1,
+                    4
+                ],
+                [
+                    2,
+                    11,
+                    2,
+                    14
+                ]
+            ],
+            [
+                [
+                    4,
+                    12,
+                    12,
+                    -12
+                ],
+                [
+                    1,
+                    13,
+                    13,
+                    5,
+                    14,
+                    1,
+                    2,
+                    8,
+                    6,
+                    6,
+                    3,
+                    11,
+                    7
+                ]
+            ],
+            [
+                [
+                    11,
+                    -9,
+                    6,
+                    3,
+                    6,
+                    10,
+                    9,
+                    -10,
+                    -12,
+                    -8,
+                    11
+                ],
+                [
+                    7,
+                    2,
+                    0,
+                    1,
+                    3,
+                    8,
+                    6,
+                    2
+                ]
+            ],
+            [
+                [
+                    11,
+                    -2,
+                    -6,
+                    -6,
+                    5,
+                    -9,
+                    3
+                ],
+                [
+                    1,
+                    14,
+                    11,
+                    12,
+                    12,
+                    13,
+                    8
+                ]
+            ],
+            [
+                [
+                    14,
+                    -13,
+                    5,
+                    12,
+                    4,
+                    -8
+                ],
+                [
+                    10,
+                    13,
+                    1
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -9,
+                    -6,
+                    8,
+                    2,
+                    8,
+                    -12,
+                    -14,
+                    6,
+                    9,
+                    13,
+                    13,
+                    -13
+                ],
+                [
+                    8,
+                    3,
+                    14,
+                    1,
+                    14,
+                    7,
+                    13,
+                    10,
+                    9,
+                    2
+                ]
+            ],
+            [
+                [
+                    -7,
+                    2,
+                    4,
+                    8,
+                    -8,
+                    10
+                ],
+                [
+                    13,
+                    13,
+                    2,
+                    5,
+                    2,
+                    14,
+                    10,
+                    7
+                ]
+            ],
+            [
+                [
+                    -4,
+                    4,
+                    9,
+                    6,
+                    4,
+                    -10,
+                    8,
+                    -12,
+                    2,
+                    5,
+                    4,
+                    13
+                ],
+                [
+                    4,
+                    7
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -6,
+                    -6,
+                    10,
+                    -13,
+                    4,
+                    -3
+                ],
+                [
+                    6,
+                    0,
+                    5,
+                    6
+                ]
+            ],
+            [
+                [
+                    -10
+                ],
+                [
+                    6,
+                    13,
+                    13,
+                    2,
+                    9
+                ]
+            ],
+            [
+                [
+                    -8,
+                    -1,
+                    8,
+                    -11,
+                    5,
+                    1,
+                    4,
+                    -1,
+                    4
+                ],
+                [
+                    8,
+                    10,
+                    12,
+                    6,
+                    0,
+                    4,
+                    14,
+                    14
+                ]
+            ],
+            [
+                [
+                    -6,
+                    2,
+                    9,
+                    14,
+                    -14,
+                    -4,
+                    13
+                ],
+                [
+                    3,
+                    7,
+                    14,
+                    5,
+                    10,
+                    13,
+                    9,
+                    5
+                ]
+            ],
+            [
+                [
+                    -5,
+                    -2,
+                    14,
+                    -8,
+                    -11
+                ],
+                [
+                    7,
+                    13,
+                    8,
+                    13
+                ]
+            ],
+            [
+                [
+                    -4,
+                    -6,
+                    1,
+                    1,
+                    -7,
+                    5,
+                    5
+                ],
+                [
+                    9,
+                    10,
+                    1,
+                    10,
+                    2,
+                    9,
+                    7
+                ]
+            ],
+            [
+                [
+                    -3,
+                    10,
+                    -1,
+                    -11,
+                    -10,
+                    -13,
+                    -3,
+                    -7,
+                    -11,
+                    -14,
+                    -6,
+                    -7,
+                    -11
+                ],
+                [
+                    0,
+                    12,
+                    2,
+                    13,
+                    5,
+                    11,
+                    1,
+                    11
+                ]
+            ],
+            [
+                [
+                    -1,
+                    -11,
+                    -5,
+                    1,
+                    -1,
+                    -2,
+                    -8
+                ],
+                [
+                    3,
+                    4,
+                    0
+                ]
+            ],
+            [
+                [
+                    0,
+                    1,
+                    12,
+                    9,
+                    -5,
+                    9,
+                    -8
+                ],
+                [
+                    9,
+                    0,
+                    7,
+                    6,
+                    5,
+                    7
+                ]
+            ],
+            [
+                [
+                    6,
+                    -6,
+                    8
+                ],
+                [
+                    8,
+                    1,
+                    6,
+                    0,
+                    7,
+                    13,
+                    10,
+                    8,
+                    3,
+                    1
+                ]
+            ],
+            [
+                [
+                    9,
+                    -14,
+                    5,
+                    12,
+                    -3,
+                    -7,
+                    -6,
+                    8,
+                    -14,
+                    7,
+                    12,
+                    0,
+                    7,
+                    -12
+                ],
+                [
+                    9,
+                    0,
+                    0,
+                    12,
+                    0,
+                    1,
+                    13
+                ]
+            ],
+            [
+                [
+                    9,
+                    -13,
+                    0,
+                    -4,
+                    13,
+                    -4
+                ],
+                [
+                    0,
+                    6,
+                    12,
+                    9,
+                    7,
+                    5,
+                    7,
+                    4,
+                    4,
+                    5,
+                    2,
+                    6
+                ]
+            ],
+            [
+                [
+                    9,
+                    14,
+                    4,
+                    4,
+                    -14,
+                    -7,
+                    13,
+                    -5,
+                    -13
+                ],
+                [
+                    7,
+                    3
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    1,
+                    3,
+                    -6,
+                    -7,
+                    -5,
+                    -3,
+                    9,
+                    7
+                ],
+                [
+                    1,
+                    3,
+                    7,
+                    2,
+                    5
+                ]
+            ],
+            [
+                [
+                    -7,
+                    7
+                ],
+                [
+                    12,
+                    0,
+                    10,
+                    12,
+                    13,
+                    10,
+                    1,
+                    6,
+                    14,
+                    8
+                ]
+            ],
+            [
+                [
+                    0,
+                    3,
+                    11,
+                    10,
+                    8
+                ],
+                [
+                    14,
+                    1,
+                    0,
+                    0
+                ]
+            ],
+            [
+                [
+                    0,
+                    6,
+                    -1,
+                    -7,
+                    -7,
+                    1,
+                    -7,
+                    -14,
+                    10
+                ],
+                [
+                    3,
+                    2,
+                    14,
+                    0,
+                    14,
+                    1,
+                    8,
+                    2,
+                    0,
+                    4,
+                    12,
+                    0
+                ]
+            ],
+            [
+                [
+                    5,
+                    9,
+                    10,
+                    3,
+                    -8,
+                    -9
+                ],
+                [
+                    10,
+                    7,
+                    8,
+                    13,
+                    3,
+                    13,
+                    1
+                ]
+            ]
+        ]
+    ],
+    "seed": -1959069370
+}
diff --git a/golden/MonoidMap [Int] (MonoidMap (Key 2) (Sum Int)).json b/golden/MonoidMap [Int] (MonoidMap (Key 2) (Sum Int)).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] (MonoidMap (Key 2) (Sum Int)).json
@@ -0,0 +1,1239 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -13,
+                    -12,
+                    0,
+                    1,
+                    4,
+                    -10,
+                    13
+                ],
+                {
+                    "A": 14,
+                    "B": 1,
+                    "C": -3,
+                    "D": -14
+                }
+            ],
+            [
+                [
+                    -8,
+                    13,
+                    8
+                ],
+                {
+                    "A": 6,
+                    "B": -11,
+                    "D": 11
+                }
+            ],
+            [
+                [
+                    -1,
+                    -8,
+                    -11
+                ],
+                {
+                    "A": -7,
+                    "B": -20,
+                    "C": 17,
+                    "D": 10
+                }
+            ],
+            [
+                [
+                    -1,
+                    12,
+                    -5
+                ],
+                {
+                    "A": 24,
+                    "B": -7,
+                    "C": 3,
+                    "D": -17
+                }
+            ],
+            [
+                [
+                    0,
+                    2,
+                    14,
+                    -7,
+                    2,
+                    -5,
+                    -3,
+                    1,
+                    1,
+                    0
+                ],
+                {
+                    "A": 14,
+                    "B": 14,
+                    "C": 1
+                }
+            ],
+            [
+                [
+                    3,
+                    5,
+                    2,
+                    5,
+                    -13,
+                    7,
+                    10,
+                    -14,
+                    11,
+                    -9,
+                    7,
+                    -9
+                ],
+                {
+                    "A": 5,
+                    "B": -6,
+                    "C": -4,
+                    "D": -1
+                }
+            ],
+            [
+                [
+                    5,
+                    -6,
+                    -13,
+                    -14,
+                    -12,
+                    4,
+                    -13
+                ],
+                {
+                    "A": 25,
+                    "B": 13,
+                    "C": -1,
+                    "D": -8
+                }
+            ],
+            [
+                [
+                    6,
+                    2,
+                    -12,
+                    14,
+                    11,
+                    13,
+                    3,
+                    -7,
+                    -6,
+                    11,
+                    -1,
+                    -7
+                ],
+                {
+                    "A": -12,
+                    "C": 3,
+                    "D": 6
+                }
+            ],
+            [
+                [
+                    9,
+                    -13,
+                    -13,
+                    -12,
+                    14,
+                    1,
+                    7
+                ],
+                {
+                    "B": -9,
+                    "C": 8,
+                    "D": -2
+                }
+            ],
+            [
+                [
+                    10
+                ],
+                {
+                    "A": -17,
+                    "C": 12
+                }
+            ],
+            [
+                [
+                    10,
+                    -8,
+                    11,
+                    14,
+                    -7,
+                    11,
+                    1
+                ],
+                {
+                    "B": 11,
+                    "D": -6
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    2,
+                    11
+                ],
+                {
+                    "A": 7,
+                    "B": -19,
+                    "C": 9,
+                    "D": -6
+                }
+            ],
+            [
+                [
+                    -12,
+                    5,
+                    -13,
+                    -2,
+                    -7,
+                    -6,
+                    -1,
+                    0,
+                    -1,
+                    -13,
+                    1,
+                    1
+                ],
+                {
+                    "A": 7,
+                    "C": -14,
+                    "D": -8
+                }
+            ],
+            [
+                [
+                    -12,
+                    13,
+                    -2,
+                    -1,
+                    -7,
+                    4,
+                    6,
+                    -12,
+                    11,
+                    1,
+                    11
+                ],
+                {
+                    "A": 13,
+                    "B": -20,
+                    "C": 9,
+                    "D": 23
+                }
+            ],
+            [
+                [
+                    -7,
+                    -14,
+                    7,
+                    -4,
+                    13,
+                    -6,
+                    -4
+                ],
+                {
+                    "A": -1,
+                    "B": 11,
+                    "C": 5
+                }
+            ],
+            [
+                [
+                    -2,
+                    -10,
+                    2,
+                    -6,
+                    -13,
+                    -8,
+                    -5
+                ],
+                {
+                    "A": 2,
+                    "B": 6,
+                    "C": -10
+                }
+            ],
+            [
+                [
+                    9,
+                    2,
+                    8,
+                    9,
+                    -3,
+                    -4,
+                    -4,
+                    -6,
+                    -13,
+                    -11
+                ],
+                {
+                    "A": -14,
+                    "B": 22,
+                    "C": -5,
+                    "D": 41
+                }
+            ],
+            [
+                [
+                    14,
+                    14,
+                    -3,
+                    1
+                ],
+                {
+                    "A": 1,
+                    "C": 13
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -13
+                ],
+                {
+                    "A": 18,
+                    "B": -6,
+                    "C": -4,
+                    "D": 18
+                }
+            ],
+            [
+                [
+                    -14,
+                    10,
+                    -6,
+                    4
+                ],
+                {
+                    "A": -14,
+                    "B": -4,
+                    "C": -20
+                }
+            ],
+            [
+                [
+                    -10
+                ],
+                {
+                    "A": 14,
+                    "C": 9,
+                    "D": 20
+                }
+            ],
+            [
+                [
+                    -9,
+                    8,
+                    8,
+                    -8,
+                    0,
+                    0,
+                    8,
+                    1,
+                    -1,
+                    -8,
+                    4,
+                    4
+                ],
+                {
+                    "A": 21,
+                    "B": 14,
+                    "D": 11
+                }
+            ],
+            [
+                [
+                    -8,
+                    -4,
+                    11,
+                    10,
+                    -6,
+                    -7,
+                    11,
+                    -9,
+                    0
+                ],
+                {
+                    "B": -7,
+                    "D": 9
+                }
+            ],
+            [
+                [
+                    -4,
+                    5
+                ],
+                {
+                    "A": 1,
+                    "B": 4,
+                    "D": -7
+                }
+            ],
+            [
+                [
+                    -4,
+                    5,
+                    7,
+                    -7,
+                    -10,
+                    -2,
+                    4,
+                    14,
+                    5,
+                    4,
+                    8,
+                    -3,
+                    6,
+                    10
+                ],
+                {
+                    "A": -14,
+                    "B": -9,
+                    "C": 19,
+                    "D": -4
+                }
+            ],
+            [
+                [
+                    8,
+                    -13,
+                    -1,
+                    -7,
+                    2,
+                    1
+                ],
+                {
+                    "A": -3,
+                    "B": -3,
+                    "C": 5,
+                    "D": -16
+                }
+            ],
+            [
+                [
+                    8,
+                    9,
+                    8,
+                    13,
+                    6
+                ],
+                {
+                    "A": -2,
+                    "B": 4,
+                    "D": -9
+                }
+            ],
+            [
+                [
+                    12
+                ],
+                {
+                    "A": -9,
+                    "B": 16,
+                    "C": 7,
+                    "D": -10
+                }
+            ],
+            [
+                [
+                    12,
+                    5,
+                    5,
+                    2,
+                    2
+                ],
+                {
+                    "B": 13,
+                    "D": -36
+                }
+            ],
+            [
+                [
+                    13,
+                    -7,
+                    -1,
+                    12,
+                    -2,
+                    4
+                ],
+                {
+                    "A": 1,
+                    "B": 3
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    1,
+                    3,
+                    -4,
+                    3,
+                    -2,
+                    3
+                ],
+                {
+                    "A": -6,
+                    "B": 12,
+                    "C": 6
+                }
+            ],
+            [
+                [
+                    -12,
+                    -13,
+                    -7,
+                    -12,
+                    13,
+                    -11,
+                    -5,
+                    -4,
+                    2
+                ],
+                {
+                    "B": 1,
+                    "C": -5,
+                    "D": 8
+                }
+            ],
+            [
+                [
+                    -12,
+                    -3,
+                    5,
+                    4,
+                    3,
+                    1,
+                    -2,
+                    -6,
+                    -3,
+                    9,
+                    -12,
+                    6
+                ],
+                {
+                    "B": -4,
+                    "D": -13
+                }
+            ],
+            [
+                [
+                    -10,
+                    -7,
+                    8
+                ],
+                {
+                    "A": -3,
+                    "B": -6,
+                    "C": -6,
+                    "D": 14
+                }
+            ],
+            [
+                [
+                    -9,
+                    9,
+                    6,
+                    6,
+                    -14,
+                    13,
+                    12
+                ],
+                {
+                    "A": -6,
+                    "B": 4,
+                    "C": -25,
+                    "D": -12
+                }
+            ],
+            [
+                [
+                    -4,
+                    9,
+                    -12,
+                    7,
+                    -10,
+                    1,
+                    3,
+                    6,
+                    -3
+                ],
+                {
+                    "A": 13,
+                    "B": -7,
+                    "C": -14,
+                    "D": -3
+                }
+            ],
+            [
+                [
+                    -3,
+                    -1,
+                    -14,
+                    12,
+                    5,
+                    12,
+                    -1,
+                    -3,
+                    -1,
+                    6,
+                    5
+                ],
+                {
+                    "A": -14,
+                    "B": -1,
+                    "C": -14,
+                    "D": 3
+                }
+            ],
+            [
+                [
+                    -2,
+                    3,
+                    2,
+                    -4,
+                    14,
+                    -11,
+                    -7,
+                    -5,
+                    -8,
+                    -13,
+                    9
+                ],
+                {
+                    "B": 17,
+                    "C": -7
+                }
+            ],
+            [
+                [
+                    0,
+                    -3,
+                    1,
+                    -8,
+                    -10,
+                    9,
+                    -11
+                ],
+                {
+                    "A": 8,
+                    "B": 1,
+                    "C": -6,
+                    "D": 7
+                }
+            ],
+            [
+                [
+                    4,
+                    11,
+                    9,
+                    4,
+                    4,
+                    -9,
+                    5,
+                    0,
+                    -1,
+                    3,
+                    -3,
+                    12,
+                    -4
+                ],
+                {
+                    "A": 9,
+                    "B": 4,
+                    "C": 41,
+                    "D": -4
+                }
+            ],
+            [
+                [
+                    6,
+                    4,
+                    13,
+                    -5,
+                    -5,
+                    3,
+                    10,
+                    6,
+                    11
+                ],
+                {
+                    "A": -3,
+                    "C": 9,
+                    "D": 7
+                }
+            ],
+            [
+                [
+                    6,
+                    5,
+                    0,
+                    7,
+                    0,
+                    13,
+                    7,
+                    7,
+                    2,
+                    -13
+                ],
+                {
+                    "A": -7,
+                    "B": -25,
+                    "D": -29
+                }
+            ],
+            [
+                [
+                    11,
+                    14
+                ],
+                {
+                    "A": 21,
+                    "B": 7,
+                    "C": -10,
+                    "D": -21
+                }
+            ]
+        ],
+        [],
+        [],
+        [
+            [
+                [
+                    6,
+                    -2,
+                    -13
+                ],
+                {
+                    "A": -9,
+                    "B": 3,
+                    "C": 2
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -9,
+                    -5,
+                    11,
+                    -10,
+                    6,
+                    4,
+                    7,
+                    -8,
+                    -14,
+                    0,
+                    -11
+                ],
+                {
+                    "A": -2,
+                    "B": -5,
+                    "C": 1
+                }
+            ],
+            [
+                [
+                    -7,
+                    3,
+                    -10,
+                    -7,
+                    -13,
+                    -13,
+                    4,
+                    0
+                ],
+                {
+                    "A": -6,
+                    "B": -11,
+                    "C": 11,
+                    "D": -14
+                }
+            ],
+            [
+                [
+                    -7,
+                    12,
+                    11
+                ],
+                {
+                    "A": -2,
+                    "B": 5,
+                    "C": -3
+                }
+            ],
+            [
+                [
+                    -5,
+                    -3,
+                    1,
+                    -1,
+                    -2,
+                    -9,
+                    -13,
+                    0,
+                    6
+                ],
+                {
+                    "B": 13,
+                    "D": 11
+                }
+            ],
+            [
+                [
+                    -5,
+                    6,
+                    -8,
+                    0,
+                    14,
+                    2,
+                    -2,
+                    -3,
+                    -6,
+                    12,
+                    12,
+                    1,
+                    14
+                ],
+                {
+                    "A": -27,
+                    "B": -23,
+                    "C": -3,
+                    "D": -6
+                }
+            ],
+            [
+                [
+                    -4,
+                    14,
+                    9,
+                    -13,
+                    -14,
+                    13,
+                    7,
+                    13,
+                    -5,
+                    -12,
+                    6,
+                    2
+                ],
+                {
+                    "A": -2,
+                    "B": -7,
+                    "C": -7,
+                    "D": -4
+                }
+            ],
+            [
+                [
+                    3,
+                    11,
+                    -10,
+                    -11
+                ],
+                {
+                    "A": 18
+                }
+            ],
+            [
+                [
+                    10,
+                    -12,
+                    -10,
+                    9,
+                    -2,
+                    -1,
+                    6,
+                    14
+                ],
+                {
+                    "A": 2,
+                    "B": 17,
+                    "C": 16,
+                    "D": 35
+                }
+            ],
+            [
+                [
+                    13,
+                    4,
+                    10,
+                    0
+                ],
+                {
+                    "A": 12,
+                    "C": 20,
+                    "D": -20
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -12
+                ],
+                {
+                    "A": -9,
+                    "B": 28,
+                    "C": 13,
+                    "D": 10
+                }
+            ],
+            [
+                [
+                    -6,
+                    2,
+                    2,
+                    -11,
+                    13,
+                    1,
+                    -7,
+                    6
+                ],
+                {
+                    "A": -23,
+                    "C": 10,
+                    "D": 20
+                }
+            ],
+            [
+                [
+                    -5,
+                    -13,
+                    11,
+                    -12,
+                    13,
+                    10,
+                    4,
+                    -6,
+                    2,
+                    -5,
+                    -2,
+                    6,
+                    5,
+                    -13
+                ],
+                {
+                    "A": -1,
+                    "D": 13
+                }
+            ],
+            [
+                [
+                    2,
+                    -9,
+                    -14,
+                    6,
+                    3,
+                    -5,
+                    6,
+                    -3
+                ],
+                {
+                    "A": -10,
+                    "B": -26,
+                    "C": -12,
+                    "D": -9
+                }
+            ],
+            [
+                [
+                    6,
+                    7,
+                    8
+                ],
+                {
+                    "A": -10,
+                    "B": -9,
+                    "C": -18,
+                    "D": 5
+                }
+            ],
+            [
+                [
+                    9,
+                    -13,
+                    9,
+                    -14,
+                    14,
+                    -14,
+                    13,
+                    -13,
+                    6,
+                    -11,
+                    13,
+                    13,
+                    5
+                ],
+                {
+                    "A": 14,
+                    "B": 14,
+                    "C": -23,
+                    "D": 7
+                }
+            ],
+            [
+                [
+                    11,
+                    4,
+                    -14,
+                    12,
+                    -10,
+                    1,
+                    14,
+                    -7
+                ],
+                {
+                    "A": 17,
+                    "B": -21,
+                    "C": 21,
+                    "D": -21
+                }
+            ],
+            [
+                [
+                    14,
+                    -8,
+                    4,
+                    -4,
+                    -2,
+                    5,
+                    4,
+                    9,
+                    -11,
+                    -12,
+                    6,
+                    1,
+                    -2,
+                    4
+                ],
+                {
+                    "A": 17,
+                    "B": -13,
+                    "C": 12,
+                    "D": -25
+                }
+            ]
+        ],
+        [
+            [
+                [],
+                {
+                    "A": -7,
+                    "B": 4,
+                    "C": 39,
+                    "D": -1
+                }
+            ],
+            [
+                [
+                    -14,
+                    1,
+                    13,
+                    -7,
+                    11,
+                    10,
+                    -13,
+                    -8,
+                    6,
+                    11,
+                    -12,
+                    -8
+                ],
+                {
+                    "B": -16
+                }
+            ],
+            [
+                [
+                    -10,
+                    5,
+                    -4,
+                    -8,
+                    -14,
+                    1,
+                    -6,
+                    9,
+                    -9,
+                    4,
+                    -2,
+                    3,
+                    -5,
+                    14
+                ],
+                {
+                    "A": 1,
+                    "B": -10,
+                    "C": 3,
+                    "D": 3
+                }
+            ],
+            [
+                [
+                    -7,
+                    4,
+                    -9,
+                    -7,
+                    9,
+                    -14,
+                    11,
+                    14,
+                    3,
+                    1,
+                    -8,
+                    1,
+                    14
+                ],
+                {
+                    "A": 2,
+                    "C": -5,
+                    "D": 8
+                }
+            ],
+            [
+                [
+                    -6,
+                    1,
+                    -1,
+                    10,
+                    12,
+                    8,
+                    -3,
+                    1,
+                    12
+                ],
+                {
+                    "A": -4,
+                    "C": -11
+                }
+            ],
+            [
+                [
+                    -4,
+                    1
+                ],
+                {
+                    "A": 2,
+                    "B": 9
+                }
+            ],
+            [
+                [
+                    4,
+                    -1,
+                    -7,
+                    6,
+                    7,
+                    -14,
+                    12
+                ],
+                {
+                    "C": 13
+                }
+            ],
+            [
+                [
+                    8,
+                    -5,
+                    -14,
+                    -11,
+                    3,
+                    -9,
+                    12,
+                    -14,
+                    -12,
+                    -7,
+                    4,
+                    7,
+                    -12
+                ],
+                {
+                    "A": -4,
+                    "B": 8,
+                    "C": -11,
+                    "D": -10
+                }
+            ],
+            [
+                [
+                    8,
+                    5,
+                    -7,
+                    10
+                ],
+                {
+                    "A": 1,
+                    "B": 29,
+                    "C": -8,
+                    "D": -9
+                }
+            ],
+            [
+                [
+                    10,
+                    3,
+                    -12,
+                    3,
+                    -2,
+                    10,
+                    -2,
+                    10,
+                    -2
+                ],
+                {
+                    "A": 2,
+                    "B": -3,
+                    "C": -7,
+                    "D": -11
+                }
+            ],
+            [
+                [
+                    12,
+                    -14,
+                    7,
+                    11,
+                    11,
+                    12,
+                    2,
+                    11,
+                    -2,
+                    4
+                ],
+                {
+                    "B": -13,
+                    "D": 14
+                }
+            ],
+            [
+                [
+                    14,
+                    -5,
+                    -6,
+                    -2
+                ],
+                {
+                    "A": -6,
+                    "B": 22,
+                    "C": -3,
+                    "D": -14
+                }
+            ]
+        ]
+    ],
+    "seed": -1747382821
+}
diff --git a/golden/MonoidMap [Int] (MonoidMap (Key 2) (Sum Natural)).json b/golden/MonoidMap [Int] (MonoidMap (Key 2) (Sum Natural)).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] (MonoidMap (Key 2) (Sum Natural)).json
@@ -0,0 +1,1295 @@
+{
+    "samples": [
+        [
+            [
+                [],
+                {
+                    "A": 28,
+                    "B": 27,
+                    "D": 43
+                }
+            ],
+            [
+                [
+                    0,
+                    13,
+                    -4,
+                    2,
+                    0,
+                    4,
+                    3
+                ],
+                {
+                    "A": 22,
+                    "B": 21,
+                    "D": 2
+                }
+            ],
+            [
+                [
+                    4,
+                    -8,
+                    -8,
+                    11
+                ],
+                {
+                    "A": 29,
+                    "B": 23,
+                    "C": 18
+                }
+            ],
+            [
+                [
+                    9,
+                    9,
+                    1,
+                    -11,
+                    10,
+                    3
+                ],
+                {
+                    "A": 3,
+                    "B": 27,
+                    "C": 13,
+                    "D": 15
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    -14,
+                    6,
+                    13,
+                    4,
+                    12,
+                    1,
+                    -7,
+                    0
+                ],
+                {
+                    "A": 16,
+                    "B": 29,
+                    "C": 24,
+                    "D": 50
+                }
+            ],
+            [
+                [
+                    -11,
+                    1,
+                    12,
+                    14,
+                    -12,
+                    -10,
+                    -9,
+                    9,
+                    -13
+                ],
+                {
+                    "A": 22,
+                    "B": 30,
+                    "C": 24,
+                    "D": 7
+                }
+            ],
+            [
+                [
+                    -11,
+                    5,
+                    13,
+                    9,
+                    0,
+                    12,
+                    -1,
+                    -2,
+                    -1
+                ],
+                {
+                    "A": 28,
+                    "B": 19,
+                    "C": 11,
+                    "D": 19
+                }
+            ],
+            [
+                [
+                    -8
+                ],
+                {
+                    "A": 8,
+                    "B": 7,
+                    "C": 47,
+                    "D": 12
+                }
+            ],
+            [
+                [
+                    0,
+                    1,
+                    4,
+                    -5,
+                    -6,
+                    8,
+                    -5,
+                    14
+                ],
+                {
+                    "A": 31,
+                    "B": 21,
+                    "C": 23
+                }
+            ],
+            [
+                [
+                    1,
+                    8,
+                    2,
+                    -3,
+                    3,
+                    -14,
+                    -4,
+                    -5,
+                    14,
+                    12,
+                    3,
+                    -5,
+                    -5
+                ],
+                {
+                    "A": 24,
+                    "B": 11,
+                    "C": 38,
+                    "D": 37
+                }
+            ],
+            [
+                [
+                    4,
+                    0,
+                    1,
+                    -11,
+                    14,
+                    -1
+                ],
+                {
+                    "B": 21,
+                    "C": 38,
+                    "D": 16
+                }
+            ],
+            [
+                [
+                    6,
+                    13,
+                    4,
+                    6,
+                    10,
+                    3,
+                    7,
+                    -2,
+                    3,
+                    -8,
+                    -8
+                ],
+                {
+                    "A": 13,
+                    "B": 6,
+                    "C": 34
+                }
+            ],
+            [
+                [
+                    7,
+                    10,
+                    -10,
+                    -7,
+                    -6,
+                    8,
+                    -14
+                ],
+                {
+                    "A": 16,
+                    "B": 23,
+                    "D": 18
+                }
+            ],
+            [
+                [
+                    14,
+                    14,
+                    -13,
+                    11,
+                    11,
+                    -14,
+                    -6,
+                    -12,
+                    -14,
+                    1,
+                    7
+                ],
+                {
+                    "A": 10,
+                    "B": 45,
+                    "C": 13
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -8,
+                    -3,
+                    8,
+                    -7,
+                    -5,
+                    0,
+                    5,
+                    -3
+                ],
+                {
+                    "A": 13,
+                    "B": 24,
+                    "C": 13,
+                    "D": 16
+                }
+            ],
+            [
+                [
+                    -13,
+                    14,
+                    -9,
+                    -2,
+                    13,
+                    4,
+                    -13,
+                    -11,
+                    9,
+                    -7,
+                    -1,
+                    2
+                ],
+                {
+                    "A": 31,
+                    "B": 20,
+                    "D": 8
+                }
+            ],
+            [
+                [
+                    -9,
+                    -12,
+                    4,
+                    -7,
+                    -14,
+                    3,
+                    0,
+                    12
+                ],
+                {
+                    "A": 39,
+                    "B": 16,
+                    "C": 8,
+                    "D": 23
+                }
+            ],
+            [
+                [
+                    -9,
+                    8,
+                    10,
+                    -3,
+                    10,
+                    6,
+                    -4,
+                    1
+                ],
+                {
+                    "A": 15,
+                    "B": 7,
+                    "C": 21,
+                    "D": 3
+                }
+            ],
+            [
+                [
+                    -5,
+                    12,
+                    -4,
+                    -5,
+                    3,
+                    5,
+                    -12,
+                    14,
+                    -9,
+                    -11,
+                    8,
+                    -5,
+                    9
+                ],
+                {
+                    "B": 13,
+                    "C": 1
+                }
+            ],
+            [
+                [
+                    -4,
+                    2,
+                    -14,
+                    11,
+                    13,
+                    -13,
+                    14,
+                    -5,
+                    -3
+                ],
+                {
+                    "A": 8,
+                    "B": 2,
+                    "C": 15,
+                    "D": 28
+                }
+            ],
+            [
+                [
+                    -1,
+                    14,
+                    9,
+                    1,
+                    2,
+                    -8,
+                    6,
+                    14,
+                    -5,
+                    -10
+                ],
+                {
+                    "A": 27,
+                    "B": 10,
+                    "C": 7,
+                    "D": 28
+                }
+            ],
+            [
+                [
+                    0,
+                    11,
+                    -9
+                ],
+                {
+                    "A": 47,
+                    "C": 20
+                }
+            ],
+            [
+                [
+                    3,
+                    -7,
+                    3,
+                    -9,
+                    11,
+                    -5
+                ],
+                {
+                    "A": 14,
+                    "B": 33,
+                    "C": 57,
+                    "D": 7
+                }
+            ],
+            [
+                [
+                    4,
+                    -11,
+                    -5,
+                    2,
+                    -1,
+                    -8,
+                    -12,
+                    4,
+                    -7,
+                    -13,
+                    -4,
+                    7
+                ],
+                {
+                    "A": 8,
+                    "B": 7,
+                    "C": 5,
+                    "D": 16
+                }
+            ],
+            [
+                [
+                    5,
+                    9,
+                    14,
+                    8,
+                    -10,
+                    -12,
+                    -5,
+                    10
+                ],
+                {
+                    "A": 31,
+                    "B": 10,
+                    "C": 1,
+                    "D": 16
+                }
+            ]
+        ],
+        [
+            [
+                [],
+                {
+                    "A": 29,
+                    "B": 46,
+                    "C": 14,
+                    "D": 11
+                }
+            ],
+            [
+                [
+                    -13,
+                    -3
+                ],
+                {
+                    "B": 27,
+                    "C": 1,
+                    "D": 6
+                }
+            ],
+            [
+                [
+                    -9,
+                    -11,
+                    9,
+                    8,
+                    13,
+                    8
+                ],
+                {
+                    "A": 55,
+                    "B": 3,
+                    "C": 17,
+                    "D": 23
+                }
+            ],
+            [
+                [
+                    -9,
+                    5,
+                    7,
+                    -12,
+                    0,
+                    3,
+                    -12,
+                    10,
+                    7,
+                    1,
+                    -2,
+                    9,
+                    12
+                ],
+                {
+                    "A": 11,
+                    "B": 15,
+                    "C": 24,
+                    "D": 4
+                }
+            ],
+            [
+                [
+                    -6,
+                    4,
+                    10,
+                    6,
+                    -10,
+                    -8,
+                    -1,
+                    -3,
+                    9,
+                    -12,
+                    -6,
+                    -2,
+                    6,
+                    0
+                ],
+                {
+                    "A": 1,
+                    "B": 9,
+                    "C": 23
+                }
+            ],
+            [
+                [
+                    -4,
+                    13,
+                    0,
+                    -2,
+                    4
+                ],
+                {
+                    "A": 18,
+                    "D": 16
+                }
+            ],
+            [
+                [
+                    0,
+                    -9,
+                    -4,
+                    1,
+                    5,
+                    1,
+                    -11,
+                    13,
+                    11,
+                    4,
+                    7,
+                    -6,
+                    -3,
+                    -6
+                ],
+                {
+                    "B": 6,
+                    "C": 4
+                }
+            ],
+            [
+                [
+                    3,
+                    -2,
+                    -13,
+                    -14,
+                    0,
+                    -5,
+                    9,
+                    10,
+                    8,
+                    -7,
+                    3
+                ],
+                {
+                    "A": 7,
+                    "B": 30,
+                    "C": 30,
+                    "D": 39
+                }
+            ],
+            [
+                [
+                    4,
+                    -10,
+                    5,
+                    -2,
+                    6,
+                    -2,
+                    -12
+                ],
+                {
+                    "A": 30,
+                    "B": 10,
+                    "D": 32
+                }
+            ],
+            [
+                [
+                    14,
+                    3,
+                    14,
+                    -13,
+                    12,
+                    7,
+                    3,
+                    3,
+                    -8,
+                    2,
+                    -2,
+                    11
+                ],
+                {
+                    "A": 2,
+                    "B": 14,
+                    "C": 35,
+                    "D": 58
+                }
+            ]
+        ],
+        [
+            [
+                [],
+                {
+                    "C": 14
+                }
+            ],
+            [
+                [
+                    -5,
+                    0,
+                    0,
+                    13,
+                    -2,
+                    -3,
+                    8,
+                    12
+                ],
+                {
+                    "B": 14,
+                    "C": 12,
+                    "D": 26
+                }
+            ],
+            [
+                [
+                    10,
+                    12,
+                    9,
+                    13,
+                    11,
+                    0,
+                    -2,
+                    6,
+                    3,
+                    -9,
+                    7
+                ],
+                {
+                    "A": 16,
+                    "B": 36,
+                    "C": 31,
+                    "D": 22
+                }
+            ]
+        ],
+        [
+            [
+                [],
+                {
+                    "A": 48,
+                    "B": 27,
+                    "C": 43,
+                    "D": 9
+                }
+            ],
+            [
+                [
+                    -8,
+                    14,
+                    8,
+                    11,
+                    -12,
+                    2,
+                    -2,
+                    13
+                ],
+                {
+                    "A": 26,
+                    "B": 16,
+                    "C": 34,
+                    "D": 23
+                }
+            ],
+            [
+                [
+                    -7,
+                    8,
+                    -6,
+                    -2,
+                    12,
+                    -3,
+                    -4,
+                    -13,
+                    14,
+                    -5,
+                    -7,
+                    -13
+                ],
+                {
+                    "A": 21,
+                    "B": 23,
+                    "C": 7,
+                    "D": 46
+                }
+            ],
+            [
+                [
+                    -3,
+                    -3,
+                    -13,
+                    -11,
+                    -4,
+                    -14,
+                    -12,
+                    -2,
+                    -5,
+                    13,
+                    -6,
+                    -10
+                ],
+                {
+                    "A": 29,
+                    "B": 8,
+                    "C": 9,
+                    "D": 25
+                }
+            ],
+            [
+                [
+                    -1,
+                    7,
+                    -14,
+                    -2,
+                    -2,
+                    -3,
+                    -13,
+                    -13
+                ],
+                {
+                    "A": 8,
+                    "B": 41,
+                    "C": 2,
+                    "D": 41
+                }
+            ],
+            [
+                [
+                    4,
+                    -12
+                ],
+                {
+                    "C": 14
+                }
+            ],
+            [
+                [
+                    8,
+                    -13,
+                    5,
+                    8,
+                    -2,
+                    -6,
+                    14,
+                    -5,
+                    -9,
+                    4
+                ],
+                {
+                    "A": 33,
+                    "B": 11,
+                    "D": 12
+                }
+            ],
+            [
+                [
+                    8,
+                    -12,
+                    4,
+                    -8,
+                    -9,
+                    -5,
+                    -5,
+                    8
+                ],
+                {
+                    "A": 29,
+                    "C": 29,
+                    "D": 40
+                }
+            ],
+            [
+                [
+                    11,
+                    9,
+                    -4,
+                    3
+                ],
+                {
+                    "B": 11
+                }
+            ],
+            [
+                [
+                    12,
+                    -1,
+                    10,
+                    -2,
+                    -6
+                ],
+                {
+                    "B": 7,
+                    "C": 9,
+                    "D": 26
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -9,
+                    8,
+                    -10,
+                    -3,
+                    0,
+                    -3,
+                    -5,
+                    3,
+                    9,
+                    -3,
+                    -7
+                ],
+                {
+                    "A": 18,
+                    "B": 25,
+                    "C": 23,
+                    "D": 57
+                }
+            ],
+            [
+                [
+                    -8,
+                    -14,
+                    7,
+                    -2,
+                    -13,
+                    1,
+                    -13,
+                    -3,
+                    2,
+                    -5,
+                    -12,
+                    -12,
+                    13,
+                    -2
+                ],
+                {
+                    "A": 20,
+                    "B": 8,
+                    "C": 19,
+                    "D": 41
+                }
+            ],
+            [
+                [
+                    -2,
+                    -4,
+                    -5,
+                    -11,
+                    -13,
+                    12,
+                    14,
+                    -4,
+                    7
+                ],
+                {
+                    "A": 34,
+                    "B": 17,
+                    "C": 19,
+                    "D": 31
+                }
+            ],
+            [
+                [
+                    3,
+                    1,
+                    3,
+                    9,
+                    -12,
+                    9,
+                    8,
+                    -4,
+                    1,
+                    6,
+                    -5,
+                    -7,
+                    13,
+                    14
+                ],
+                {
+                    "A": 31,
+                    "B": 22,
+                    "C": 18,
+                    "D": 22
+                }
+            ],
+            [
+                [
+                    4
+                ],
+                {
+                    "A": 25,
+                    "C": 4,
+                    "D": 11
+                }
+            ],
+            [
+                [
+                    5,
+                    -7,
+                    -8,
+                    12,
+                    5,
+                    -14,
+                    5
+                ],
+                {
+                    "B": 11
+                }
+            ],
+            [
+                [
+                    6
+                ],
+                {
+                    "A": 9,
+                    "B": 41
+                }
+            ],
+            [
+                [
+                    12,
+                    -5
+                ],
+                {
+                    "A": 8,
+                    "B": 24,
+                    "C": 23,
+                    "D": 13
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    7,
+                    -3,
+                    5,
+                    -11,
+                    13
+                ],
+                {
+                    "A": 17,
+                    "B": 23,
+                    "C": 22,
+                    "D": 12
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    7,
+                    11,
+                    9,
+                    12,
+                    -1,
+                    0,
+                    2,
+                    4,
+                    1
+                ],
+                {
+                    "A": 3,
+                    "B": 7
+                }
+            ],
+            [
+                [
+                    -8,
+                    12,
+                    11,
+                    13,
+                    13
+                ],
+                {
+                    "B": 9,
+                    "D": 9
+                }
+            ],
+            [
+                [
+                    -7,
+                    -11,
+                    4,
+                    2,
+                    10
+                ],
+                {
+                    "B": 7,
+                    "C": 10,
+                    "D": 1
+                }
+            ],
+            [
+                [
+                    -6,
+                    6,
+                    1,
+                    5,
+                    -7,
+                    4,
+                    1,
+                    9,
+                    -5,
+                    -8,
+                    9,
+                    -2,
+                    5
+                ],
+                {
+                    "B": 4,
+                    "D": 2
+                }
+            ],
+            [
+                [
+                    -4,
+                    9,
+                    9,
+                    12,
+                    9
+                ],
+                {
+                    "A": 10,
+                    "B": 56
+                }
+            ],
+            [
+                [
+                    -1,
+                    -4,
+                    -10,
+                    2,
+                    5,
+                    -10,
+                    0,
+                    -5
+                ],
+                {
+                    "A": 14,
+                    "B": 27,
+                    "C": 25,
+                    "D": 5
+                }
+            ],
+            [
+                [
+                    5,
+                    -13,
+                    11,
+                    14,
+                    -5,
+                    0,
+                    6
+                ],
+                {
+                    "B": 8,
+                    "C": 9
+                }
+            ],
+            [
+                [
+                    5,
+                    4,
+                    13,
+                    7,
+                    -14,
+                    8,
+                    1,
+                    -4,
+                    -2,
+                    12,
+                    12,
+                    11,
+                    -5,
+                    7
+                ],
+                {
+                    "A": 22,
+                    "B": 36,
+                    "C": 6,
+                    "D": 8
+                }
+            ],
+            [
+                [
+                    9,
+                    14,
+                    -1,
+                    4,
+                    -12,
+                    2,
+                    -12
+                ],
+                {
+                    "A": 24,
+                    "B": 12,
+                    "D": 14
+                }
+            ],
+            [
+                [
+                    10,
+                    -2,
+                    -14,
+                    -14,
+                    -10,
+                    -8,
+                    -7
+                ],
+                {
+                    "A": 14,
+                    "B": 1,
+                    "C": 32,
+                    "D": 12
+                }
+            ],
+            [
+                [
+                    13,
+                    -3,
+                    1,
+                    -1,
+                    -11,
+                    7,
+                    8,
+                    -14,
+                    5,
+                    -11
+                ],
+                {
+                    "A": 16,
+                    "B": 12,
+                    "C": 12,
+                    "D": 8
+                }
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    10,
+                    0,
+                    11,
+                    6,
+                    -8,
+                    -3,
+                    -7,
+                    3,
+                    10
+                ],
+                {
+                    "A": 21,
+                    "B": 10,
+                    "C": 5,
+                    "D": 43
+                }
+            ],
+            [
+                [
+                    -12,
+                    -4,
+                    8,
+                    -5,
+                    -12,
+                    -11
+                ],
+                {
+                    "A": 13,
+                    "B": 9
+                }
+            ],
+            [
+                [
+                    -12,
+                    10,
+                    14,
+                    13,
+                    -6,
+                    -12,
+                    12,
+                    3
+                ],
+                {
+                    "C": 15
+                }
+            ],
+            [
+                [
+                    -11,
+                    11
+                ],
+                {
+                    "A": 25,
+                    "B": 18,
+                    "C": 12,
+                    "D": 23
+                }
+            ],
+            [
+                [
+                    -7,
+                    -6,
+                    -5,
+                    -3,
+                    -5,
+                    -8,
+                    -14,
+                    -9
+                ],
+                {
+                    "B": 5,
+                    "D": 9
+                }
+            ],
+            [
+                [
+                    0,
+                    4,
+                    -2,
+                    9,
+                    -3,
+                    14,
+                    -5,
+                    -10
+                ],
+                {
+                    "A": 8,
+                    "B": 19,
+                    "C": 5,
+                    "D": 19
+                }
+            ],
+            [
+                [
+                    2
+                ],
+                {
+                    "A": 48,
+                    "B": 15,
+                    "C": 33,
+                    "D": 2
+                }
+            ],
+            [
+                [
+                    8,
+                    -7,
+                    -2,
+                    3
+                ],
+                {
+                    "A": 3,
+                    "B": 10,
+                    "C": 9
+                }
+            ]
+        ]
+    ],
+    "seed": 1247437780
+}
diff --git a/golden/MonoidMap [Int] (Product Int).json b/golden/MonoidMap [Int] (Product Int).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] (Product Int).json
@@ -0,0 +1,1060 @@
+{
+    "samples": [
+        [
+            [
+                [],
+                -96
+            ],
+            [
+                [
+                    -14,
+                    -12,
+                    10,
+                    -14,
+                    3,
+                    5,
+                    -10,
+                    -2,
+                    -3,
+                    -6,
+                    4,
+                    -11,
+                    9,
+                    0
+                ],
+                14
+            ],
+            [
+                [
+                    -13,
+                    10,
+                    1
+                ],
+                -3
+            ],
+            [
+                [
+                    -10,
+                    5,
+                    -10,
+                    11,
+                    -3,
+                    9,
+                    -10,
+                    1
+                ],
+                5
+            ],
+            [
+                [
+                    -7,
+                    14,
+                    11,
+                    4,
+                    12,
+                    -10
+                ],
+                -1
+            ],
+            [
+                [
+                    -5,
+                    -10,
+                    -12,
+                    5,
+                    -4,
+                    0,
+                    11,
+                    -13
+                ],
+                -8
+            ],
+            [
+                [
+                    -3,
+                    6,
+                    13,
+                    -12,
+                    -7,
+                    -8
+                ],
+                14
+            ],
+            [
+                [
+                    -2,
+                    -2,
+                    -2,
+                    12,
+                    12,
+                    2
+                ],
+                -8
+            ],
+            [
+                [
+                    5,
+                    2,
+                    -4
+                ],
+                9
+            ],
+            [
+                [
+                    14,
+                    0,
+                    12,
+                    -8,
+                    7
+                ],
+                -1
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -11,
+                    13
+                ],
+                -13
+            ],
+            [
+                [
+                    -13,
+                    -7,
+                    12,
+                    12,
+                    8,
+                    -11
+                ],
+                -6
+            ],
+            [
+                [
+                    -12,
+                    -2,
+                    14,
+                    7,
+                    6,
+                    3,
+                    11
+                ],
+                5
+            ],
+            [
+                [
+                    -11,
+                    5,
+                    6,
+                    -2
+                ],
+                -9
+            ],
+            [
+                [
+                    -9,
+                    -5
+                ],
+                14
+            ],
+            [
+                [
+                    -4,
+                    -13,
+                    -3,
+                    -14,
+                    -13,
+                    -1,
+                    -10,
+                    -13,
+                    -14,
+                    -7,
+                    6,
+                    -5,
+                    -8
+                ],
+                -6
+            ],
+            [
+                [
+                    -4,
+                    -6
+                ],
+                -4
+            ],
+            [
+                [
+                    -3,
+                    13,
+                    3,
+                    -2
+                ],
+                -8
+            ],
+            [
+                [
+                    2
+                ],
+                -1
+            ],
+            [
+                [
+                    9,
+                    -4,
+                    -8,
+                    -13,
+                    -13,
+                    -6,
+                    -1
+                ],
+                -4
+            ],
+            [
+                [
+                    11,
+                    -2,
+                    6,
+                    -4,
+                    1,
+                    -14,
+                    -13,
+                    -5,
+                    -3,
+                    -6,
+                    14,
+                    3,
+                    1,
+                    14
+                ],
+                0
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -6,
+                    -5,
+                    8,
+                    2,
+                    9,
+                    -7,
+                    -5,
+                    12,
+                    6,
+                    4,
+                    -3,
+                    -7
+                ],
+                -3
+            ],
+            [
+                [
+                    -1,
+                    0,
+                    -1,
+                    -7,
+                    10,
+                    12,
+                    10,
+                    -14
+                ],
+                -8
+            ],
+            [
+                [
+                    0,
+                    14,
+                    -4,
+                    -14,
+                    11
+                ],
+                6
+            ],
+            [
+                [
+                    1,
+                    -13,
+                    -11,
+                    12,
+                    5,
+                    -6,
+                    -5,
+                    -7,
+                    -2,
+                    6,
+                    -6,
+                    -7,
+                    11
+                ],
+                0
+            ],
+            [
+                [
+                    1,
+                    -8,
+                    -2,
+                    7,
+                    1,
+                    -3,
+                    -5,
+                    4
+                ],
+                3
+            ],
+            [
+                [
+                    8,
+                    10,
+                    -9,
+                    11,
+                    -7,
+                    -10,
+                    3,
+                    6,
+                    4,
+                    10,
+                    0,
+                    -14
+                ],
+                -1
+            ],
+            [
+                [
+                    11,
+                    5,
+                    -1,
+                    -14,
+                    9,
+                    -1
+                ],
+                14
+            ],
+            [
+                [
+                    11,
+                    12,
+                    -5,
+                    11,
+                    9,
+                    4,
+                    -12,
+                    7
+                ],
+                -6
+            ]
+        ],
+        [
+            [
+                [],
+                -9
+            ],
+            [
+                [
+                    -10,
+                    4,
+                    6,
+                    -9
+                ],
+                -4
+            ],
+            [
+                [
+                    -7,
+                    12,
+                    8,
+                    8,
+                    -6,
+                    -12
+                ],
+                -13
+            ],
+            [
+                [
+                    -2,
+                    1,
+                    -4,
+                    -8,
+                    0,
+                    -5,
+                    7,
+                    3,
+                    -1,
+                    5
+                ],
+                6
+            ],
+            [
+                [
+                    1,
+                    2,
+                    12,
+                    7,
+                    -12,
+                    -13,
+                    12,
+                    7,
+                    -13,
+                    -11,
+                    5
+                ],
+                -1
+            ],
+            [
+                [
+                    3,
+                    12,
+                    2,
+                    8,
+                    -6,
+                    1,
+                    9
+                ],
+                -3
+            ],
+            [
+                [
+                    5,
+                    -13,
+                    -12,
+                    -7,
+                    -8,
+                    12
+                ],
+                11
+            ],
+            [
+                [
+                    6,
+                    1,
+                    -14,
+                    -12,
+                    14,
+                    -14
+                ],
+                3
+            ],
+            [
+                [
+                    9,
+                    -11,
+                    6,
+                    5,
+                    -10,
+                    8
+                ],
+                5
+            ],
+            [
+                [
+                    13,
+                    -13,
+                    6,
+                    6,
+                    -10,
+                    13,
+                    8,
+                    -6,
+                    -2,
+                    -14,
+                    7
+                ],
+                -14
+            ]
+        ],
+        [
+            [
+                [
+                    -3,
+                    -1,
+                    -7,
+                    -1,
+                    14,
+                    7,
+                    -12
+                ],
+                -13
+            ],
+            [
+                [
+                    -3,
+                    10,
+                    14,
+                    12,
+                    14,
+                    -9,
+                    0
+                ],
+                9
+            ]
+        ],
+        [
+            [
+                [
+                    -14
+                ],
+                -13
+            ],
+            [
+                [
+                    -14,
+                    -11
+                ],
+                -7
+            ],
+            [
+                [
+                    -14,
+                    -4,
+                    -9,
+                    -12
+                ],
+                -1
+            ],
+            [
+                [
+                    -14,
+                    -3,
+                    -12,
+                    10,
+                    -11
+                ],
+                12
+            ],
+            [
+                [
+                    -13,
+                    3,
+                    -5,
+                    -13,
+                    -10,
+                    -3,
+                    10,
+                    -14
+                ],
+                4
+            ],
+            [
+                [
+                    -9,
+                    -7,
+                    12,
+                    10,
+                    0,
+                    10,
+                    9,
+                    -11,
+                    3
+                ],
+                -7
+            ],
+            [
+                [
+                    -8,
+                    13,
+                    -10,
+                    -8,
+                    7,
+                    -4,
+                    12
+                ],
+                -7
+            ],
+            [
+                [
+                    -6,
+                    -11,
+                    7,
+                    -6,
+                    9,
+                    8
+                ],
+                -9
+            ],
+            [
+                [
+                    -6,
+                    14,
+                    -13,
+                    -11,
+                    6,
+                    -8,
+                    0,
+                    -12,
+                    0,
+                    12
+                ],
+                11
+            ],
+            [
+                [
+                    -3,
+                    -9,
+                    11,
+                    2
+                ],
+                -5
+            ],
+            [
+                [
+                    0,
+                    -4,
+                    7,
+                    -14,
+                    13,
+                    -13,
+                    12,
+                    10,
+                    -11,
+                    5,
+                    11
+                ],
+                0
+            ],
+            [
+                [
+                    2,
+                    -10,
+                    4,
+                    -13
+                ],
+                -9
+            ],
+            [
+                [
+                    9,
+                    4,
+                    4,
+                    3,
+                    -7,
+                    -9
+                ],
+                6
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    -9,
+                    -9,
+                    10,
+                    -4,
+                    -4,
+                    -14
+                ],
+                8
+            ],
+            [
+                [
+                    -12,
+                    -13,
+                    -1,
+                    -6,
+                    -13
+                ],
+                6
+            ],
+            [
+                [
+                    -10,
+                    1
+                ],
+                2
+            ],
+            [
+                [
+                    -9,
+                    9,
+                    8,
+                    11,
+                    10,
+                    7,
+                    1,
+                    -9
+                ],
+                -9
+            ],
+            [
+                [
+                    -1,
+                    -2,
+                    10,
+                    -7,
+                    12,
+                    -7,
+                    -8
+                ],
+                -3
+            ],
+            [
+                [
+                    2,
+                    1,
+                    6,
+                    -6,
+                    -2,
+                    1,
+                    10,
+                    2,
+                    8
+                ],
+                -2
+            ],
+            [
+                [
+                    3,
+                    2,
+                    -7,
+                    -3,
+                    5,
+                    7,
+                    10,
+                    -5,
+                    -7,
+                    -9,
+                    -1
+                ],
+                14
+            ],
+            [
+                [
+                    7,
+                    -7,
+                    1,
+                    -5,
+                    -8
+                ],
+                -9
+            ],
+            [
+                [
+                    7,
+                    12,
+                    -9
+                ],
+                -5
+            ],
+            [
+                [
+                    9
+                ],
+                -1
+            ],
+            [
+                [
+                    9,
+                    -6,
+                    -14
+                ],
+                7
+            ],
+            [
+                [
+                    9,
+                    8,
+                    -12,
+                    7,
+                    -11,
+                    2,
+                    11,
+                    3,
+                    14,
+                    -3,
+                    9,
+                    -14,
+                    3,
+                    5
+                ],
+                7
+            ],
+            [
+                [
+                    13,
+                    9,
+                    -4,
+                    -7,
+                    6,
+                    -3,
+                    12,
+                    6,
+                    13,
+                    13,
+                    -5,
+                    -9
+                ],
+                6
+            ],
+            [
+                [
+                    13,
+                    9,
+                    7
+                ],
+                4
+            ]
+        ],
+        [
+            [
+                [],
+                -14
+            ],
+            [
+                [
+                    -13,
+                    14,
+                    11,
+                    13,
+                    -1,
+                    1,
+                    -7,
+                    -13
+                ],
+                10
+            ],
+            [
+                [
+                    -1,
+                    -4,
+                    -9,
+                    -11,
+                    11,
+                    1,
+                    2,
+                    -12,
+                    -1,
+                    -8,
+                    -11,
+                    13
+                ],
+                4
+            ],
+            [
+                [
+                    -1,
+                    6,
+                    6,
+                    0,
+                    -13,
+                    14,
+                    -13,
+                    -9,
+                    9,
+                    -7,
+                    -4,
+                    -4
+                ],
+                -1
+            ],
+            [
+                [
+                    -1,
+                    9,
+                    -12,
+                    -6,
+                    -6
+                ],
+                10
+            ],
+            [
+                [
+                    3
+                ],
+                -14
+            ],
+            [
+                [
+                    5,
+                    1,
+                    -11,
+                    -10,
+                    -13
+                ],
+                5
+            ],
+            [
+                [
+                    7,
+                    -14,
+                    -4,
+                    6
+                ],
+                3
+            ],
+            [
+                [
+                    10,
+                    -2,
+                    -1,
+                    14,
+                    -6,
+                    -9,
+                    9,
+                    1,
+                    11,
+                    0,
+                    -7,
+                    -13
+                ],
+                -11
+            ],
+            [
+                [
+                    10,
+                    7,
+                    -3,
+                    -3,
+                    -6,
+                    13,
+                    11
+                ],
+                2
+            ]
+        ],
+        [
+            [
+                [],
+                13
+            ],
+            [
+                [
+                    -14,
+                    -3,
+                    9,
+                    2,
+                    3,
+                    0,
+                    -13,
+                    4,
+                    -7
+                ],
+                -9
+            ],
+            [
+                [
+                    -12
+                ],
+                -1
+            ],
+            [
+                [
+                    -11,
+                    12,
+                    13,
+                    8,
+                    -6,
+                    -11,
+                    5,
+                    -9,
+                    2,
+                    7,
+                    -12,
+                    -6,
+                    -9,
+                    4
+                ],
+                9
+            ],
+            [
+                [
+                    -8,
+                    0,
+                    4,
+                    -9,
+                    1,
+                    6,
+                    -13,
+                    -6
+                ],
+                -14
+            ],
+            [
+                [
+                    -3
+                ],
+                -3
+            ],
+            [
+                [
+                    0,
+                    -11,
+                    -7,
+                    0,
+                    10,
+                    2,
+                    -12,
+                    14
+                ],
+                10
+            ],
+            [
+                [
+                    0,
+                    -8,
+                    14,
+                    -4,
+                    -8,
+                    -12,
+                    4,
+                    -10,
+                    -3,
+                    7,
+                    -2,
+                    6
+                ],
+                14
+            ],
+            [
+                [
+                    0,
+                    4,
+                    -13,
+                    7,
+                    5,
+                    7,
+                    14,
+                    -8,
+                    -7,
+                    7,
+                    2
+                ],
+                11
+            ],
+            [
+                [
+                    3,
+                    9
+                ],
+                8
+            ],
+            [
+                [
+                    6,
+                    -2,
+                    -7,
+                    -1
+                ],
+                6
+            ],
+            [
+                [
+                    9,
+                    -6
+                ],
+                -5
+            ],
+            [
+                [
+                    11,
+                    -6,
+                    -7,
+                    -14
+                ],
+                -14
+            ]
+        ],
+        []
+    ],
+    "seed": 1449326892
+}
diff --git a/golden/MonoidMap [Int] (Product Natural).json b/golden/MonoidMap [Int] (Product Natural).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] (Product Natural).json
@@ -0,0 +1,856 @@
+{
+    "samples": [
+        [],
+        [
+            [
+                [
+                    -7,
+                    4
+                ],
+                10
+            ]
+        ],
+        [
+            [
+                [
+                    -3,
+                    -14,
+                    8,
+                    -6,
+                    -8,
+                    -11,
+                    12,
+                    2,
+                    -5,
+                    13,
+                    3,
+                    13,
+                    1,
+                    6
+                ],
+                7
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    3,
+                    -12,
+                    2,
+                    5,
+                    -6,
+                    7,
+                    -2,
+                    -4,
+                    5,
+                    -2,
+                    10
+                ],
+                8
+            ],
+            [
+                [
+                    -11,
+                    -3,
+                    1,
+                    -3,
+                    -2,
+                    2
+                ],
+                9
+            ],
+            [
+                [
+                    -11,
+                    11,
+                    1,
+                    3,
+                    -12,
+                    7,
+                    -12,
+                    12,
+                    0,
+                    -14
+                ],
+                13
+            ],
+            [
+                [
+                    -11,
+                    13,
+                    8,
+                    10,
+                    8,
+                    5,
+                    4,
+                    -11,
+                    4,
+                    2,
+                    -8,
+                    -9,
+                    -8,
+                    13
+                ],
+                4
+            ],
+            [
+                [
+                    -1,
+                    5,
+                    10,
+                    -13,
+                    11,
+                    -4,
+                    3,
+                    -12,
+                    0,
+                    4,
+                    7,
+                    1,
+                    5,
+                    14
+                ],
+                5
+            ],
+            [
+                [
+                    -1,
+                    14,
+                    5,
+                    -4,
+                    0,
+                    1,
+                    -14,
+                    -8,
+                    9,
+                    -12,
+                    6
+                ],
+                9
+            ],
+            [
+                [
+                    1,
+                    12
+                ],
+                10
+            ],
+            [
+                [
+                    12,
+                    -13,
+                    -14,
+                    -4,
+                    5,
+                    5
+                ],
+                11
+            ],
+            [
+                [
+                    12,
+                    6,
+                    -8,
+                    9,
+                    -6,
+                    -5
+                ],
+                6
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -9,
+                    7,
+                    9,
+                    -12,
+                    2,
+                    13
+                ],
+                3
+            ],
+            [
+                [
+                    -11,
+                    -3,
+                    3,
+                    12,
+                    -11,
+                    13
+                ],
+                5
+            ],
+            [
+                [
+                    -10,
+                    -8,
+                    0,
+                    -12,
+                    2,
+                    -4,
+                    -2
+                ],
+                12
+            ],
+            [
+                [
+                    -7,
+                    -14,
+                    2,
+                    1,
+                    6,
+                    2
+                ],
+                2
+            ],
+            [
+                [
+                    -3,
+                    -9
+                ],
+                6
+            ],
+            [
+                [
+                    -1,
+                    -14,
+                    -11,
+                    8,
+                    -3,
+                    -1
+                ],
+                9
+            ],
+            [
+                [
+                    2,
+                    -8,
+                    -6,
+                    -3,
+                    2,
+                    8,
+                    4,
+                    -1,
+                    -2,
+                    -14
+                ],
+                4
+            ],
+            [
+                [
+                    5,
+                    -6,
+                    6,
+                    1
+                ],
+                4
+            ],
+            [
+                [
+                    11,
+                    12,
+                    0,
+                    -12,
+                    10,
+                    3,
+                    6,
+                    13,
+                    14,
+                    -6,
+                    -11
+                ],
+                7
+            ]
+        ],
+        [
+            [
+                [],
+                2
+            ],
+            [
+                [
+                    -13,
+                    -3,
+                    8,
+                    -10
+                ],
+                12
+            ],
+            [
+                [
+                    -12,
+                    9,
+                    -9,
+                    4,
+                    5,
+                    1,
+                    7,
+                    -13,
+                    -6,
+                    -1,
+                    -13,
+                    11,
+                    -3,
+                    14
+                ],
+                2
+            ],
+            [
+                [
+                    -10,
+                    1,
+                    5,
+                    -2,
+                    -1,
+                    9,
+                    -5,
+                    -11,
+                    -2,
+                    -6,
+                    -10,
+                    11
+                ],
+                12
+            ],
+            [
+                [
+                    -4,
+                    -5
+                ],
+                9
+            ],
+            [
+                [
+                    -3
+                ],
+                12
+            ],
+            [
+                [
+                    -3,
+                    -3,
+                    -6,
+                    4,
+                    -7,
+                    2
+                ],
+                9
+            ],
+            [
+                [
+                    0,
+                    11,
+                    -9,
+                    -9
+                ],
+                14
+            ],
+            [
+                [
+                    11,
+                    -9,
+                    -3,
+                    -12,
+                    1,
+                    3,
+                    -3,
+                    2,
+                    -11,
+                    -3,
+                    -6,
+                    7
+                ],
+                2
+            ],
+            [
+                [
+                    14
+                ],
+                8
+            ]
+        ],
+        [
+            [
+                [
+                    -6,
+                    -13,
+                    -14,
+                    -1
+                ],
+                9
+            ],
+            [
+                [
+                    -6,
+                    10,
+                    -13,
+                    -5,
+                    -14,
+                    -3,
+                    -5
+                ],
+                6
+            ],
+            [
+                [
+                    -1,
+                    4,
+                    -10,
+                    -11,
+                    -14,
+                    -14,
+                    -9,
+                    10,
+                    0,
+                    11,
+                    -6,
+                    0,
+                    14,
+                    -13
+                ],
+                12
+            ],
+            [
+                [
+                    2,
+                    -11,
+                    12,
+                    -13,
+                    11,
+                    11,
+                    4,
+                    -8,
+                    7,
+                    8,
+                    -3,
+                    -14,
+                    -1
+                ],
+                11
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -11,
+                    6,
+                    9,
+                    -14,
+                    -5,
+                    3,
+                    13,
+                    14,
+                    -9,
+                    -4,
+                    13,
+                    12
+                ],
+                9
+            ],
+            [
+                [
+                    -7,
+                    -7,
+                    4,
+                    -4,
+                    -9,
+                    3,
+                    0,
+                    4,
+                    -12,
+                    6,
+                    9,
+                    -9,
+                    14
+                ],
+                14
+            ],
+            [
+                [
+                    -6,
+                    3,
+                    1,
+                    -2,
+                    3
+                ],
+                12
+            ],
+            [
+                [
+                    -4,
+                    0,
+                    11,
+                    -9,
+                    -7
+                ],
+                3
+            ],
+            [
+                [
+                    -4,
+                    9,
+                    8,
+                    8,
+                    -10,
+                    -2
+                ],
+                9
+            ],
+            [
+                [
+                    -3,
+                    -2,
+                    -11,
+                    5,
+                    11,
+                    -6,
+                    14
+                ],
+                12
+            ],
+            [
+                [
+                    -1,
+                    -8,
+                    4,
+                    5,
+                    -4,
+                    -13,
+                    3,
+                    9,
+                    4,
+                    -8
+                ],
+                8
+            ],
+            [
+                [
+                    -1,
+                    9,
+                    8,
+                    -7,
+                    14,
+                    8,
+                    9
+                ],
+                9
+            ],
+            [
+                [
+                    0,
+                    12,
+                    3,
+                    10,
+                    13,
+                    10,
+                    -4,
+                    -5,
+                    9
+                ],
+                8
+            ],
+            [
+                [
+                    8,
+                    7,
+                    11,
+                    11,
+                    -7,
+                    -5,
+                    0,
+                    -10,
+                    12
+                ],
+                7
+            ],
+            [
+                [
+                    9,
+                    4,
+                    -1,
+                    6,
+                    0,
+                    4,
+                    2,
+                    0,
+                    9
+                ],
+                4
+            ],
+            [
+                [
+                    11,
+                    7,
+                    -8,
+                    1,
+                    14,
+                    8,
+                    0,
+                    -9
+                ],
+                6
+            ],
+            [
+                [
+                    14,
+                    -3,
+                    -14,
+                    14,
+                    13,
+                    -13,
+                    -9,
+                    14
+                ],
+                9
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    5,
+                    -9
+                ],
+                9
+            ],
+            [
+                [
+                    -12
+                ],
+                4
+            ],
+            [
+                [
+                    -7,
+                    5,
+                    2,
+                    1,
+                    -9,
+                    -13,
+                    2,
+                    -8,
+                    0,
+                    7
+                ],
+                4
+            ],
+            [
+                [
+                    -6,
+                    -6,
+                    14,
+                    1
+                ],
+                3
+            ],
+            [
+                [
+                    -3,
+                    -10,
+                    12,
+                    -10,
+                    -11,
+                    -1,
+                    2,
+                    -9,
+                    0,
+                    -4
+                ],
+                5
+            ],
+            [
+                [
+                    -2
+                ],
+                5
+            ],
+            [
+                [
+                    -2,
+                    -9,
+                    -5,
+                    -5,
+                    1,
+                    10,
+                    5,
+                    0,
+                    -14,
+                    -8,
+                    -4
+                ],
+                11
+            ],
+            [
+                [
+                    -1
+                ],
+                7
+            ],
+            [
+                [
+                    2,
+                    6,
+                    -3,
+                    2,
+                    -13,
+                    -8,
+                    -9,
+                    13,
+                    -8,
+                    -11,
+                    -1,
+                    -4
+                ],
+                4
+            ],
+            [
+                [
+                    4,
+                    4,
+                    5,
+                    -12,
+                    -8,
+                    1
+                ],
+                12
+            ],
+            [
+                [
+                    6,
+                    -1,
+                    8,
+                    3
+                ],
+                0
+            ],
+            [
+                [
+                    8,
+                    5,
+                    12,
+                    -8,
+                    0,
+                    6,
+                    -7,
+                    4,
+                    -12
+                ],
+                6
+            ]
+        ],
+        [
+            [
+                [],
+                9
+            ],
+            [
+                [
+                    -11,
+                    11,
+                    6,
+                    -10,
+                    6
+                ],
+                13
+            ],
+            [
+                [
+                    -10
+                ],
+                4
+            ],
+            [
+                [
+                    -3,
+                    -10
+                ],
+                4
+            ],
+            [
+                [
+                    -3,
+                    14
+                ],
+                10
+            ],
+            [
+                [
+                    -2,
+                    14,
+                    2,
+                    8,
+                    -8
+                ],
+                10
+            ],
+            [
+                [
+                    1,
+                    8,
+                    14
+                ],
+                3
+            ],
+            [
+                [
+                    5,
+                    -13,
+                    -1,
+                    -11,
+                    -12,
+                    -9,
+                    9,
+                    10
+                ],
+                3
+            ],
+            [
+                [
+                    5,
+                    4
+                ],
+                14
+            ],
+            [
+                [
+                    8,
+                    -3,
+                    11,
+                    9,
+                    7,
+                    -7,
+                    -7
+                ],
+                11
+            ],
+            [
+                [
+                    8,
+                    1,
+                    -10,
+                    -3,
+                    -14,
+                    14
+                ],
+                4
+            ],
+            [
+                [
+                    12,
+                    1,
+                    -3,
+                    12,
+                    -5,
+                    14,
+                    14
+                ],
+                10
+            ]
+        ]
+    ],
+    "seed": 1920560133
+}
diff --git a/golden/MonoidMap [Int] (Set Int).json b/golden/MonoidMap [Int] (Set Int).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] (Set Int).json
@@ -0,0 +1,976 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -13,
+                    -10,
+                    9
+                ],
+                [
+                    -11,
+                    -8,
+                    -6,
+                    -5,
+                    -4,
+                    -1,
+                    4,
+                    7,
+                    9,
+                    11,
+                    12,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -3,
+                    -11,
+                    -7,
+                    -13,
+                    10,
+                    14,
+                    -1,
+                    12,
+                    -11,
+                    1,
+                    2
+                ],
+                [
+                    -14,
+                    -10,
+                    -8,
+                    -7,
+                    -6,
+                    3,
+                    4,
+                    7,
+                    9
+                ]
+            ],
+            [
+                [
+                    -3,
+                    -9,
+                    12,
+                    3,
+                    -11,
+                    14
+                ],
+                [
+                    -10,
+                    -4,
+                    3,
+                    4,
+                    13
+                ]
+            ],
+            [
+                [
+                    4,
+                    3,
+                    0,
+                    -9,
+                    -11,
+                    -12,
+                    -14,
+                    -4,
+                    3
+                ],
+                [
+                    -12,
+                    -10,
+                    -9,
+                    -6,
+                    -5
+                ]
+            ],
+            [
+                [
+                    5,
+                    -8,
+                    9,
+                    1,
+                    13,
+                    3,
+                    -6,
+                    -3,
+                    13,
+                    -11,
+                    14,
+                    -2,
+                    9
+                ],
+                [
+                    -2,
+                    11
+                ]
+            ],
+            [
+                [
+                    8,
+                    -9,
+                    11,
+                    4,
+                    6,
+                    -14,
+                    12,
+                    0,
+                    0,
+                    -12,
+                    8,
+                    -3,
+                    -12
+                ],
+                [
+                    14
+                ]
+            ],
+            [
+                [
+                    12,
+                    11,
+                    -6,
+                    6,
+                    2,
+                    -1,
+                    12,
+                    6,
+                    13,
+                    14,
+                    10,
+                    9,
+                    -3,
+                    -11
+                ],
+                [
+                    -14,
+                    -11,
+                    -10,
+                    -4,
+                    7
+                ]
+            ],
+            [
+                [
+                    14,
+                    8,
+                    -4
+                ],
+                [
+                    -14,
+                    -2,
+                    -1,
+                    0,
+                    2,
+                    3,
+                    7,
+                    8,
+                    10,
+                    12,
+                    13
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    -14,
+                    -13,
+                    -11,
+                    -7,
+                    -3,
+                    4,
+                    8,
+                    9,
+                    12,
+                    13
+                ]
+            ],
+            [
+                [
+                    -4,
+                    -12,
+                    5,
+                    -13,
+                    12,
+                    1,
+                    -6,
+                    1,
+                    12,
+                    -2,
+                    7,
+                    1,
+                    4,
+                    -1
+                ],
+                [
+                    -14,
+                    -11,
+                    -4,
+                    -2,
+                    0,
+                    7,
+                    11,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    6,
+                    -4,
+                    -6,
+                    1
+                ],
+                [
+                    -14,
+                    -10,
+                    -8,
+                    -7,
+                    -4,
+                    1,
+                    2,
+                    3,
+                    5,
+                    6,
+                    10,
+                    11,
+                    13
+                ]
+            ],
+            [
+                [
+                    8,
+                    9,
+                    14
+                ],
+                [
+                    -6,
+                    -5
+                ]
+            ]
+        ],
+        [],
+        [
+            [
+                [
+                    -14
+                ],
+                [
+                    -7,
+                    -6,
+                    -4,
+                    -1,
+                    0,
+                    1,
+                    3,
+                    4
+                ]
+            ],
+            [
+                [
+                    -14,
+                    5,
+                    5,
+                    -10,
+                    -3,
+                    -3,
+                    6,
+                    -8,
+                    3,
+                    -2,
+                    13,
+                    3
+                ],
+                [
+                    -11,
+                    -7,
+                    0,
+                    4,
+                    5,
+                    7
+                ]
+            ],
+            [
+                [
+                    -13
+                ],
+                [
+                    -14,
+                    -13,
+                    -8,
+                    -2,
+                    1,
+                    5,
+                    6,
+                    11,
+                    12
+                ]
+            ],
+            [
+                [
+                    -6,
+                    10,
+                    12,
+                    11,
+                    2,
+                    -11,
+                    -12,
+                    12,
+                    11
+                ],
+                [
+                    -12,
+                    -11,
+                    -7,
+                    -2,
+                    3,
+                    4,
+                    9,
+                    11
+                ]
+            ],
+            [
+                [
+                    -4,
+                    1,
+                    13,
+                    -12,
+                    -7,
+                    -10,
+                    7
+                ],
+                [
+                    3
+                ]
+            ],
+            [
+                [
+                    -3,
+                    4
+                ],
+                [
+                    -9,
+                    -2,
+                    8,
+                    11,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    2,
+                    -7,
+                    -10,
+                    -11,
+                    -3,
+                    12,
+                    -14,
+                    14,
+                    13,
+                    -13
+                ],
+                [
+                    -14,
+                    -12,
+                    -6,
+                    -5,
+                    6,
+                    12
+                ]
+            ],
+            [
+                [
+                    6,
+                    -5,
+                    9,
+                    -11,
+                    -12,
+                    -10,
+                    -3,
+                    7,
+                    11
+                ],
+                [
+                    -8,
+                    -1,
+                    2,
+                    3
+                ]
+            ],
+            [
+                [
+                    8,
+                    -10,
+                    8,
+                    1,
+                    -13,
+                    9,
+                    -4,
+                    2,
+                    6,
+                    13,
+                    -1,
+                    12,
+                    -11
+                ],
+                [
+                    -13,
+                    -8,
+                    -7,
+                    -4,
+                    1
+                ]
+            ],
+            [
+                [
+                    9,
+                    2,
+                    -14
+                ],
+                [
+                    0,
+                    1,
+                    10
+                ]
+            ],
+            [
+                [
+                    14,
+                    -3,
+                    0,
+                    11,
+                    -7,
+                    1,
+                    -13,
+                    -2,
+                    -14,
+                    8
+                ],
+                [
+                    -12,
+                    -6,
+                    -4,
+                    2,
+                    7
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -6,
+                    13,
+                    14,
+                    2,
+                    1,
+                    0,
+                    -4,
+                    3,
+                    -4,
+                    11
+                ],
+                [
+                    0,
+                    1,
+                    7,
+                    8,
+                    9
+                ]
+            ],
+            [
+                [
+                    11,
+                    2,
+                    4
+                ],
+                [
+                    -11,
+                    -2,
+                    1,
+                    3,
+                    7,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -13,
+                    -10,
+                    -11,
+                    8,
+                    -6,
+                    -7,
+                    12,
+                    12,
+                    -7,
+                    -7
+                ],
+                [
+                    -4,
+                    -3,
+                    1,
+                    7,
+                    8,
+                    10,
+                    11,
+                    14
+                ]
+            ],
+            [
+                [
+                    -6,
+                    -8,
+                    10,
+                    -14,
+                    -4,
+                    -14,
+                    -3,
+                    -5,
+                    -5,
+                    10,
+                    -11,
+                    10,
+                    14,
+                    13
+                ],
+                [
+                    -10,
+                    -9,
+                    3,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    -1,
+                    -13
+                ],
+                [
+                    -14,
+                    -12,
+                    -3,
+                    -2,
+                    0,
+                    1,
+                    8,
+                    9,
+                    10
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -5,
+                    -6,
+                    1
+                ],
+                [
+                    -14,
+                    -7,
+                    -6,
+                    -4,
+                    -2,
+                    5,
+                    6,
+                    9,
+                    10,
+                    13
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    -13,
+                    -11,
+                    0,
+                    5,
+                    7,
+                    8,
+                    13
+                ]
+            ],
+            [
+                [
+                    -4,
+                    10,
+                    5,
+                    1,
+                    -9,
+                    -7,
+                    6,
+                    10,
+                    -9,
+                    5,
+                    -2,
+                    5
+                ],
+                [
+                    -6,
+                    -4,
+                    2,
+                    10,
+                    11
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -4,
+                    -13,
+                    -11,
+                    1,
+                    3,
+                    -8,
+                    9,
+                    -1
+                ],
+                [
+                    8
+                ]
+            ],
+            [
+                [
+                    1,
+                    -11,
+                    -4,
+                    -3,
+                    12,
+                    5,
+                    -7,
+                    1,
+                    3,
+                    -5,
+                    0,
+                    -10,
+                    -5
+                ],
+                [
+                    -14,
+                    -1,
+                    0,
+                    6
+                ]
+            ],
+            [
+                [
+                    4,
+                    -8
+                ],
+                [
+                    -7,
+                    -4,
+                    -2,
+                    0,
+                    2,
+                    10,
+                    12,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    -5,
+                    -4
+                ]
+            ],
+            [
+                [
+                    -11,
+                    -5,
+                    10,
+                    12,
+                    -13,
+                    -2,
+                    11,
+                    11,
+                    -9,
+                    6,
+                    14
+                ],
+                [
+                    1
+                ]
+            ],
+            [
+                [
+                    -10,
+                    -10,
+                    11,
+                    8,
+                    -12,
+                    9,
+                    -6,
+                    -14,
+                    0
+                ],
+                [
+                    -14,
+                    -6,
+                    -4,
+                    -3,
+                    -1,
+                    3
+                ]
+            ],
+            [
+                [
+                    -6,
+                    0,
+                    8,
+                    -1,
+                    2,
+                    -3,
+                    1
+                ],
+                [
+                    -9,
+                    9,
+                    10,
+                    14
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -5,
+                    -3,
+                    -2,
+                    -3,
+                    -11,
+                    10,
+                    -1,
+                    -3,
+                    4
+                ],
+                [
+                    -11,
+                    -9
+                ]
+            ],
+            [
+                [
+                    3,
+                    6,
+                    -4,
+                    0,
+                    -11,
+                    11,
+                    2
+                ],
+                [
+                    -14,
+                    -10,
+                    -7,
+                    -6,
+                    -5,
+                    1,
+                    4,
+                    6,
+                    7,
+                    10,
+                    14
+                ]
+            ],
+            [
+                [
+                    6,
+                    11
+                ],
+                [
+                    -9,
+                    -6,
+                    -3,
+                    -1,
+                    4,
+                    5,
+                    6,
+                    8,
+                    9,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    11,
+                    -4,
+                    8,
+                    12,
+                    -2,
+                    2,
+                    3,
+                    -10,
+                    5
+                ],
+                [
+                    -7,
+                    1,
+                    13
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    -13,
+                    -9,
+                    -7,
+                    -4,
+                    -3,
+                    1,
+                    2,
+                    5,
+                    7,
+                    9,
+                    11,
+                    13
+                ]
+            ],
+            [
+                [
+                    -13
+                ],
+                [
+                    -10,
+                    -9,
+                    -7,
+                    -5,
+                    -1,
+                    1,
+                    2,
+                    7,
+                    11
+                ]
+            ],
+            [
+                [
+                    -10,
+                    -8,
+                    -4,
+                    -11,
+                    -4,
+                    -4
+                ],
+                [
+                    -14,
+                    -13,
+                    -7,
+                    8,
+                    10
+                ]
+            ],
+            [
+                [
+                    -10,
+                    5,
+                    3,
+                    7,
+                    -5,
+                    -2,
+                    -3,
+                    -9,
+                    5,
+                    -13,
+                    10
+                ],
+                [
+                    -5,
+                    0,
+                    1,
+                    6,
+                    7
+                ]
+            ],
+            [
+                [
+                    -4,
+                    -13,
+                    14,
+                    13,
+                    0,
+                    -4
+                ],
+                [
+                    -7,
+                    -5
+                ]
+            ],
+            [
+                [
+                    7
+                ],
+                [
+                    -8,
+                    -3,
+                    5,
+                    6,
+                    10,
+                    13
+                ]
+            ],
+            [
+                [
+                    11,
+                    -2,
+                    6,
+                    -4,
+                    -9,
+                    -2,
+                    12,
+                    4,
+                    -3,
+                    9
+                ],
+                [
+                    7,
+                    8,
+                    12
+                ]
+            ],
+            [
+                [
+                    13,
+                    -8,
+                    -3,
+                    14,
+                    -2,
+                    4,
+                    4,
+                    -11,
+                    -12,
+                    -1,
+                    5,
+                    -5,
+                    6
+                ],
+                [
+                    -11,
+                    -7,
+                    -6,
+                    1,
+                    3,
+                    4,
+                    8,
+                    10
+                ]
+            ]
+        ]
+    ],
+    "seed": 1067593260
+}
diff --git a/golden/MonoidMap [Int] (Set Natural).json b/golden/MonoidMap [Int] (Set Natural).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] (Set Natural).json
@@ -0,0 +1,1367 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -14,
+                    9
+                ],
+                [
+                    4,
+                    7,
+                    9,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -12,
+                    -1,
+                    -7,
+                    -9,
+                    -5,
+                    14,
+                    5,
+                    11,
+                    -6,
+                    3,
+                    8,
+                    -5,
+                    8
+                ],
+                [
+                    1,
+                    7,
+                    8,
+                    9,
+                    11,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -4,
+                    10
+                ],
+                [
+                    4,
+                    6,
+                    9,
+                    10,
+                    11,
+                    12,
+                    13
+                ]
+            ],
+            [
+                [
+                    2,
+                    -11,
+                    -7,
+                    8,
+                    5,
+                    -13,
+                    -13,
+                    -6,
+                    8,
+                    -6,
+                    8,
+                    3,
+                    -14,
+                    1
+                ],
+                [
+                    0,
+                    1,
+                    2,
+                    8,
+                    10,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    8
+                ],
+                [
+                    0,
+                    3,
+                    5,
+                    7,
+                    9,
+                    11,
+                    12,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    2
+                ],
+                [
+                    1,
+                    7,
+                    8,
+                    9,
+                    11,
+                    12,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -13
+                ],
+                [
+                    1,
+                    3,
+                    5,
+                    7,
+                    8,
+                    9,
+                    10,
+                    11,
+                    13
+                ]
+            ],
+            [
+                [
+                    -9,
+                    -4,
+                    -10,
+                    -11
+                ],
+                [
+                    0,
+                    4,
+                    5,
+                    6,
+                    8,
+                    10,
+                    11,
+                    13
+                ]
+            ],
+            [
+                [
+                    -4,
+                    6,
+                    8,
+                    -2,
+                    9,
+                    11,
+                    -3,
+                    9,
+                    13,
+                    7,
+                    13,
+                    -7
+                ],
+                [
+                    0,
+                    2,
+                    3,
+                    6,
+                    7,
+                    8,
+                    9,
+                    11
+                ]
+            ],
+            [
+                [
+                    2,
+                    -9,
+                    12,
+                    -1,
+                    8,
+                    -5,
+                    -6,
+                    -10,
+                    -5,
+                    -7,
+                    -8,
+                    14
+                ],
+                [
+                    2,
+                    3,
+                    4,
+                    5,
+                    6,
+                    7,
+                    8,
+                    9,
+                    11,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    2,
+                    4,
+                    5,
+                    -12,
+                    1,
+                    6,
+                    -3,
+                    -13,
+                    7,
+                    10,
+                    -11,
+                    3,
+                    -1
+                ],
+                [
+                    0,
+                    3,
+                    4,
+                    5,
+                    8,
+                    9,
+                    11,
+                    12,
+                    13
+                ]
+            ],
+            [
+                [
+                    6
+                ],
+                [
+                    0,
+                    1,
+                    3,
+                    5,
+                    6,
+                    8,
+                    12,
+                    13
+                ]
+            ],
+            [
+                [
+                    6,
+                    12,
+                    14,
+                    -14,
+                    8,
+                    -6,
+                    -13,
+                    -11,
+                    2,
+                    -10
+                ],
+                [
+                    0,
+                    5,
+                    7,
+                    8,
+                    9,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    8,
+                    -1,
+                    -9,
+                    6,
+                    -13,
+                    6,
+                    -11,
+                    8,
+                    -1,
+                    4,
+                    8,
+                    -9,
+                    7
+                ],
+                [
+                    0,
+                    1,
+                    2,
+                    4,
+                    8,
+                    10,
+                    11,
+                    12
+                ]
+            ],
+            [
+                [
+                    9,
+                    13,
+                    -4,
+                    -3,
+                    4,
+                    12,
+                    -14,
+                    13,
+                    -5,
+                    12,
+                    10
+                ],
+                [
+                    4,
+                    7,
+                    9,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    0,
+                    1,
+                    2,
+                    3,
+                    4,
+                    6,
+                    7,
+                    9,
+                    10,
+                    11,
+                    12,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -1,
+                    -3
+                ],
+                [
+                    4,
+                    5,
+                    7,
+                    9,
+                    12
+                ]
+            ],
+            [
+                [
+                    5,
+                    11,
+                    -7,
+                    -8,
+                    12
+                ],
+                [
+                    2,
+                    5,
+                    7
+                ]
+            ],
+            [
+                [
+                    12,
+                    -6,
+                    14,
+                    9,
+                    -3,
+                    3,
+                    1
+                ],
+                [
+                    3,
+                    5,
+                    8,
+                    12,
+                    13
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -4,
+                    2,
+                    -7,
+                    11,
+                    5,
+                    9,
+                    3,
+                    -7
+                ],
+                [
+                    0
+                ]
+            ],
+            [
+                [
+                    -10,
+                    -7,
+                    -10
+                ],
+                [
+                    1,
+                    3,
+                    7,
+                    8,
+                    9,
+                    11,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -8,
+                    14,
+                    -12,
+                    10,
+                    2,
+                    8,
+                    7,
+                    -13,
+                    8,
+                    6,
+                    10,
+                    -4,
+                    -10
+                ],
+                [
+                    3
+                ]
+            ],
+            [
+                [
+                    2,
+                    -9,
+                    -13
+                ],
+                [
+                    0,
+                    1,
+                    2,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    2,
+                    7,
+                    -5
+                ],
+                [
+                    5,
+                    7,
+                    8,
+                    10,
+                    13
+                ]
+            ],
+            [
+                [
+                    4,
+                    3,
+                    14,
+                    -11,
+                    -4,
+                    0,
+                    12,
+                    -2,
+                    7,
+                    8,
+                    1,
+                    -2,
+                    -6,
+                    -8
+                ],
+                [
+                    3,
+                    5,
+                    8,
+                    11,
+                    13
+                ]
+            ],
+            [
+                [
+                    13,
+                    10,
+                    6,
+                    7,
+                    2,
+                    9
+                ],
+                [
+                    1,
+                    3,
+                    4,
+                    5,
+                    8,
+                    10,
+                    11,
+                    13,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    0,
+                    1,
+                    4,
+                    5,
+                    6,
+                    10,
+                    11
+                ]
+            ],
+            [
+                [
+                    -13,
+                    7,
+                    14,
+                    7,
+                    9,
+                    10
+                ],
+                [
+                    0,
+                    2,
+                    4,
+                    5,
+                    9,
+                    10,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    -10,
+                    6
+                ],
+                [
+                    5
+                ]
+            ],
+            [
+                [
+                    -9,
+                    14,
+                    7,
+                    11,
+                    8,
+                    -7,
+                    4,
+                    8,
+                    -2
+                ],
+                [
+                    1,
+                    2,
+                    4,
+                    7,
+                    8,
+                    10,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -6,
+                    -9,
+                    14,
+                    -10,
+                    9,
+                    11,
+                    -14,
+                    -6,
+                    3
+                ],
+                [
+                    0,
+                    1,
+                    4,
+                    6,
+                    7,
+                    8,
+                    11,
+                    13
+                ]
+            ],
+            [
+                [
+                    -4,
+                    -7,
+                    12,
+                    -8,
+                    -9,
+                    -8,
+                    0,
+                    14,
+                    3,
+                    13,
+                    -4,
+                    2,
+                    -5
+                ],
+                [
+                    4,
+                    5,
+                    6,
+                    10,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    -2,
+                    3,
+                    -3,
+                    -4,
+                    -7,
+                    -6,
+                    10,
+                    9,
+                    -12,
+                    -4,
+                    -5,
+                    4
+                ],
+                [
+                    0,
+                    1,
+                    6,
+                    9,
+                    10,
+                    11,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -1,
+                    10
+                ],
+                [
+                    1,
+                    2,
+                    3,
+                    4,
+                    6,
+                    7,
+                    8,
+                    9,
+                    10,
+                    11,
+                    12
+                ]
+            ],
+            [
+                [
+                    5,
+                    0,
+                    -2,
+                    -9,
+                    -9,
+                    2,
+                    1,
+                    10,
+                    -10,
+                    -14,
+                    -8,
+                    -10,
+                    2,
+                    -2
+                ],
+                [
+                    1,
+                    3,
+                    4,
+                    7,
+                    8,
+                    12,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    9,
+                    -8
+                ],
+                [
+                    0,
+                    5,
+                    6,
+                    9,
+                    11,
+                    12,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    9,
+                    2,
+                    7,
+                    8,
+                    12,
+                    11,
+                    -2,
+                    -9,
+                    5,
+                    -9,
+                    -10,
+                    3,
+                    -14,
+                    -3
+                ],
+                [
+                    1,
+                    2,
+                    11,
+                    12,
+                    13
+                ]
+            ],
+            [
+                [
+                    9,
+                    8,
+                    -12,
+                    -11,
+                    13,
+                    -3,
+                    -10,
+                    -12,
+                    -5,
+                    4
+                ],
+                [
+                    1,
+                    2,
+                    4,
+                    7,
+                    9,
+                    12
+                ]
+            ],
+            [
+                [
+                    13,
+                    10,
+                    12,
+                    -8,
+                    -7,
+                    10,
+                    4,
+                    3,
+                    13
+                ],
+                [
+                    0,
+                    2,
+                    3,
+                    4,
+                    5,
+                    8,
+                    10,
+                    11,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    2,
+                    8
+                ]
+            ],
+            [
+                [
+                    -14,
+                    -7
+                ],
+                [
+                    2,
+                    4,
+                    5,
+                    6,
+                    10,
+                    14
+                ]
+            ],
+            [
+                [
+                    -3,
+                    -5,
+                    -6,
+                    -5,
+                    9,
+                    11,
+                    -12
+                ],
+                [
+                    0,
+                    1,
+                    5,
+                    6,
+                    7,
+                    10,
+                    11,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    8,
+                    -2,
+                    -5,
+                    -9,
+                    4,
+                    10
+                ],
+                [
+                    1,
+                    2,
+                    3,
+                    4,
+                    7,
+                    8,
+                    9,
+                    10,
+                    11,
+                    12
+                ]
+            ],
+            [
+                [
+                    14,
+                    -8,
+                    -3,
+                    -8,
+                    -8
+                ],
+                [
+                    2,
+                    4,
+                    6,
+                    10,
+                    11
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    0,
+                    1,
+                    6,
+                    7,
+                    8,
+                    9,
+                    10,
+                    11,
+                    12,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -9,
+                    8,
+                    -3,
+                    9
+                ],
+                [
+                    5
+                ]
+            ],
+            [
+                [
+                    -5,
+                    -2
+                ],
+                [
+                    0,
+                    1,
+                    2,
+                    6,
+                    8,
+                    9,
+                    11,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    -5,
+                    2,
+                    -4,
+                    13,
+                    -14,
+                    3,
+                    -2,
+                    -10,
+                    -3,
+                    -10,
+                    -12,
+                    13
+                ],
+                [
+                    0,
+                    9,
+                    11,
+                    12
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -5,
+                    13,
+                    11,
+                    -11,
+                    -2,
+                    4
+                ],
+                [
+                    0,
+                    3,
+                    4,
+                    5,
+                    6,
+                    8,
+                    9,
+                    11
+                ]
+            ],
+            [
+                [
+                    0,
+                    9
+                ],
+                [
+                    0,
+                    1,
+                    2,
+                    3,
+                    8,
+                    11,
+                    12,
+                    13
+                ]
+            ],
+            [
+                [
+                    5,
+                    -13
+                ],
+                [
+                    1,
+                    5,
+                    6,
+                    7
+                ]
+            ],
+            [
+                [
+                    9,
+                    1,
+                    -6,
+                    1,
+                    6,
+                    -9,
+                    -8,
+                    11,
+                    5,
+                    10,
+                    9,
+                    -13,
+                    -13
+                ],
+                [
+                    1,
+                    2,
+                    6,
+                    7,
+                    9,
+                    11,
+                    12,
+                    13
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -6,
+                    -9,
+                    -14,
+                    -8,
+                    -11,
+                    -8
+                ],
+                [
+                    0,
+                    2,
+                    3,
+                    5,
+                    6,
+                    7,
+                    10,
+                    11,
+                    14
+                ]
+            ],
+            [
+                [
+                    -6,
+                    -7,
+                    -8
+                ],
+                [
+                    1,
+                    2,
+                    3,
+                    4,
+                    9,
+                    10,
+                    11,
+                    12
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -12
+                ],
+                [
+                    2,
+                    4,
+                    10,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    -8,
+                    -8,
+                    8,
+                    -9,
+                    -9,
+                    -4,
+                    8,
+                    -5,
+                    -6,
+                    3,
+                    -7
+                ],
+                [
+                    0,
+                    2,
+                    13
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    3,
+                    8
+                ]
+            ],
+            [
+                [
+                    -13,
+                    -11,
+                    -11,
+                    -4,
+                    -5,
+                    -13,
+                    -5,
+                    3,
+                    -9
+                ],
+                [
+                    0,
+                    3,
+                    7,
+                    10,
+                    11,
+                    12,
+                    13
+                ]
+            ],
+            [
+                [
+                    -12,
+                    12,
+                    -13,
+                    -1
+                ],
+                [
+                    4,
+                    7,
+                    12,
+                    14
+                ]
+            ],
+            [
+                [
+                    -10,
+                    11,
+                    -4,
+                    -7,
+                    -9,
+                    -5,
+                    8
+                ],
+                [
+                    3,
+                    5,
+                    6,
+                    7,
+                    8,
+                    10,
+                    12,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -8,
+                    -10,
+                    4,
+                    1,
+                    -12,
+                    -14,
+                    7,
+                    -4,
+                    2,
+                    1
+                ],
+                [
+                    1,
+                    4,
+                    6,
+                    8,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    -3,
+                    -14,
+                    5,
+                    9,
+                    5,
+                    8,
+                    -7,
+                    -8,
+                    0,
+                    -2
+                ],
+                [
+                    5,
+                    6,
+                    9,
+                    12
+                ]
+            ],
+            [
+                [
+                    -3,
+                    5,
+                    13,
+                    3,
+                    14,
+                    6
+                ],
+                [
+                    0,
+                    1,
+                    2,
+                    4,
+                    5,
+                    6,
+                    7,
+                    10,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    3,
+                    -7,
+                    -14,
+                    -14,
+                    -3,
+                    4,
+                    -6,
+                    1,
+                    3,
+                    13
+                ],
+                [
+                    3,
+                    7,
+                    12
+                ]
+            ],
+            [
+                [
+                    7
+                ],
+                [
+                    9,
+                    10,
+                    12
+                ]
+            ],
+            [
+                [
+                    7,
+                    -7,
+                    -12
+                ],
+                [
+                    1,
+                    6,
+                    7,
+                    8,
+                    9,
+                    10,
+                    11,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    10,
+                    -13,
+                    -14,
+                    -5,
+                    -6,
+                    -14,
+                    -5,
+                    1,
+                    -14,
+                    -9,
+                    12,
+                    -11
+                ],
+                [
+                    3,
+                    4,
+                    7,
+                    8,
+                    9,
+                    11,
+                    14
+                ]
+            ],
+            [
+                [
+                    10,
+                    4,
+                    10,
+                    -4,
+                    9,
+                    13,
+                    7
+                ],
+                [
+                    1,
+                    2,
+                    4,
+                    6,
+                    7,
+                    8,
+                    9,
+                    10,
+                    11,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    12,
+                    -6,
+                    -13,
+                    2,
+                    12,
+                    1,
+                    1,
+                    5
+                ],
+                [
+                    1,
+                    4,
+                    5,
+                    6,
+                    7,
+                    10,
+                    13,
+                    14
+                ]
+            ],
+            [
+                [
+                    14,
+                    -3,
+                    1,
+                    13,
+                    -9,
+                    11,
+                    0,
+                    7,
+                    8,
+                    7,
+                    12,
+                    12,
+                    -2
+                ],
+                [
+                    0,
+                    2,
+                    5,
+                    8
+                ]
+            ]
+        ]
+    ],
+    "seed": -941550428
+}
diff --git a/golden/MonoidMap [Int] (Sum Int).json b/golden/MonoidMap [Int] (Sum Int).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] (Sum Int).json
@@ -0,0 +1,744 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -11,
+                    -9,
+                    -12,
+                    -5,
+                    0
+                ],
+                1
+            ],
+            [
+                [
+                    11,
+                    5,
+                    2,
+                    -10,
+                    14,
+                    -9,
+                    3,
+                    12,
+                    -10,
+                    -10
+                ],
+                -6
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    4,
+                    -4,
+                    -9,
+                    0,
+                    3,
+                    8,
+                    -12,
+                    10,
+                    -1,
+                    8,
+                    -13,
+                    10
+                ],
+                -1
+            ],
+            [
+                [
+                    0,
+                    -8,
+                    0,
+                    -7,
+                    -11
+                ],
+                9
+            ],
+            [
+                [
+                    1,
+                    5,
+                    3,
+                    -14,
+                    12
+                ],
+                -12
+            ],
+            [
+                [
+                    2,
+                    9
+                ],
+                10
+            ],
+            [
+                [
+                    11
+                ],
+                -11
+            ],
+            [
+                [
+                    13
+                ],
+                -7
+            ]
+        ],
+        [
+            [
+                [],
+                12
+            ],
+            [
+                [
+                    -10,
+                    13,
+                    1,
+                    1,
+                    9,
+                    13,
+                    14,
+                    3
+                ],
+                7
+            ],
+            [
+                [
+                    -9,
+                    12,
+                    -13,
+                    4,
+                    11,
+                    9,
+                    11,
+                    -1
+                ],
+                -11
+            ],
+            [
+                [
+                    -8
+                ],
+                4
+            ],
+            [
+                [
+                    -8,
+                    -3,
+                    9,
+                    -1,
+                    3,
+                    -2,
+                    14,
+                    -13,
+                    -3,
+                    -11,
+                    11,
+                    3
+                ],
+                11
+            ],
+            [
+                [
+                    -8,
+                    9,
+                    7,
+                    4,
+                    -13,
+                    -2
+                ],
+                14
+            ],
+            [
+                [
+                    0,
+                    -7,
+                    14,
+                    11,
+                    11
+                ],
+                12
+            ],
+            [
+                [
+                    1,
+                    -14,
+                    -11,
+                    -4,
+                    8,
+                    14,
+                    10,
+                    -3
+                ],
+                12
+            ],
+            [
+                [
+                    3,
+                    -10,
+                    -4,
+                    7,
+                    0,
+                    -6,
+                    13,
+                    3,
+                    8,
+                    9,
+                    -12
+                ],
+                13
+            ],
+            [
+                [
+                    4,
+                    -13,
+                    -9,
+                    -9,
+                    11,
+                    7,
+                    7,
+                    -3,
+                    11,
+                    7,
+                    2
+                ],
+                2
+            ],
+            [
+                [
+                    5,
+                    8,
+                    -6,
+                    -2,
+                    6,
+                    10,
+                    -12,
+                    -8,
+                    -7,
+                    3
+                ],
+                -7
+            ],
+            [
+                [
+                    9,
+                    -9,
+                    -1,
+                    -2,
+                    14
+                ],
+                -4
+            ],
+            [
+                [
+                    11,
+                    0
+                ],
+                -3
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -3,
+                    -4,
+                    -10,
+                    6
+                ],
+                11
+            ],
+            [
+                [
+                    -6,
+                    12,
+                    2,
+                    2
+                ],
+                -9
+            ],
+            [
+                [
+                    -3
+                ],
+                13
+            ],
+            [
+                [
+                    13,
+                    -11,
+                    -6,
+                    -13,
+                    -10,
+                    -8,
+                    -13,
+                    2,
+                    7,
+                    -14
+                ],
+                -2
+            ]
+        ],
+        [
+            [
+                [],
+                -12
+            ],
+            [
+                [
+                    -11
+                ],
+                10
+            ],
+            [
+                [
+                    -7,
+                    9,
+                    14,
+                    10,
+                    13,
+                    -10
+                ],
+                8
+            ],
+            [
+                [
+                    -5,
+                    -13,
+                    -7
+                ],
+                8
+            ],
+            [
+                [
+                    -5,
+                    -13,
+                    5,
+                    -2
+                ],
+                9
+            ],
+            [
+                [
+                    -5,
+                    4,
+                    9,
+                    -2,
+                    12,
+                    14,
+                    11,
+                    -13
+                ],
+                -12
+            ],
+            [
+                [
+                    -4,
+                    14,
+                    -6
+                ],
+                -1
+            ],
+            [
+                [
+                    -2,
+                    5,
+                    1,
+                    3,
+                    -10,
+                    11,
+                    -5,
+                    7,
+                    2,
+                    1,
+                    -9,
+                    -9,
+                    -4,
+                    14
+                ],
+                -3
+            ],
+            [
+                [
+                    0,
+                    -9,
+                    -9,
+                    -2
+                ],
+                8
+            ],
+            [
+                [
+                    1,
+                    -4,
+                    11,
+                    7,
+                    -11,
+                    7,
+                    1,
+                    14
+                ],
+                4
+            ],
+            [
+                [
+                    4,
+                    14,
+                    6,
+                    9,
+                    -9,
+                    3,
+                    14,
+                    1,
+                    -3,
+                    14
+                ],
+                3
+            ],
+            [
+                [
+                    7,
+                    3,
+                    -7,
+                    -2,
+                    7
+                ],
+                -10
+            ],
+            [
+                [
+                    12,
+                    -12,
+                    14,
+                    -1,
+                    -9,
+                    -12
+                ],
+                -11
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    2,
+                    10,
+                    -9,
+                    4,
+                    9,
+                    7,
+                    13,
+                    -8,
+                    11,
+                    6,
+                    3,
+                    10,
+                    -13
+                ],
+                11
+            ],
+            [
+                [
+                    -10,
+                    5,
+                    -4,
+                    6,
+                    -6,
+                    5
+                ],
+                -8
+            ],
+            [
+                [
+                    2,
+                    -9,
+                    -5,
+                    4,
+                    14,
+                    -3,
+                    -10,
+                    -7,
+                    13,
+                    6,
+                    -12
+                ],
+                -10
+            ],
+            [
+                [
+                    3,
+                    -4,
+                    -12,
+                    -7,
+                    1,
+                    -8,
+                    -14,
+                    7
+                ],
+                14
+            ],
+            [
+                [
+                    6,
+                    12,
+                    8,
+                    -11,
+                    14,
+                    -14,
+                    13,
+                    9,
+                    10,
+                    4
+                ],
+                -10
+            ],
+            [
+                [
+                    8,
+                    9,
+                    12,
+                    13,
+                    6,
+                    3,
+                    -10,
+                    -7,
+                    5,
+                    2,
+                    -11,
+                    -7,
+                    12,
+                    -4
+                ],
+                -8
+            ],
+            [
+                [
+                    14,
+                    10,
+                    5
+                ],
+                8
+            ],
+            [
+                [
+                    14,
+                    12,
+                    3,
+                    -8,
+                    7
+                ],
+                1
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    0,
+                    -10,
+                    11,
+                    -3,
+                    -8,
+                    3,
+                    -9
+                ],
+                -2
+            ],
+            [
+                [
+                    2,
+                    7,
+                    -3
+                ],
+                -7
+            ],
+            [
+                [
+                    6,
+                    14,
+                    -7,
+                    4,
+                    -5,
+                    4,
+                    -5,
+                    -13,
+                    -11,
+                    -5,
+                    -5
+                ],
+                -10
+            ],
+            [
+                [
+                    9,
+                    10,
+                    -9,
+                    5,
+                    2,
+                    1,
+                    1,
+                    -7
+                ],
+                3
+            ]
+        ],
+        [
+            [
+                [],
+                9
+            ],
+            [
+                [
+                    -11,
+                    1,
+                    -7,
+                    -11,
+                    8
+                ],
+                -1
+            ],
+            [
+                [
+                    -10
+                ],
+                1
+            ],
+            [
+                [
+                    -8,
+                    -11,
+                    -12,
+                    -6,
+                    -5,
+                    13
+                ],
+                11
+            ],
+            [
+                [
+                    -4,
+                    -13,
+                    -3,
+                    -13,
+                    4
+                ],
+                -2
+            ],
+            [
+                [
+                    2,
+                    -10,
+                    13,
+                    5,
+                    -13,
+                    1,
+                    11,
+                    7,
+                    6,
+                    11,
+                    -5,
+                    -6
+                ],
+                6
+            ],
+            [
+                [
+                    2,
+                    -5,
+                    -6,
+                    -12,
+                    6,
+                    1,
+                    10,
+                    -11,
+                    4,
+                    9,
+                    5,
+                    -6
+                ],
+                -1
+            ],
+            [
+                [
+                    2,
+                    4,
+                    -4,
+                    -4,
+                    -10,
+                    6,
+                    12,
+                    3,
+                    14,
+                    7
+                ],
+                9
+            ],
+            [
+                [
+                    5,
+                    13,
+                    -2
+                ],
+                10
+            ],
+            [
+                [
+                    7
+                ],
+                -9
+            ],
+            [
+                [
+                    10,
+                    5,
+                    8,
+                    -8,
+                    1,
+                    -13,
+                    -7,
+                    0,
+                    1,
+                    13,
+                    -3,
+                    -12
+                ],
+                -2
+            ],
+            [
+                [
+                    12,
+                    -1,
+                    9,
+                    2,
+                    -12
+                ],
+                8
+            ]
+        ],
+        [
+            [
+                [
+                    1
+                ],
+                -3
+            ],
+            [
+                [
+                    10,
+                    -1,
+                    -11,
+                    -7,
+                    -12,
+                    5,
+                    -10,
+                    14
+                ],
+                -6
+            ]
+        ],
+        []
+    ],
+    "seed": -1382382262
+}
diff --git a/golden/MonoidMap [Int] (Sum Natural).json b/golden/MonoidMap [Int] (Sum Natural).json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] (Sum Natural).json
@@ -0,0 +1,777 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -10,
+                    -1,
+                    13,
+                    5,
+                    -13,
+                    -5,
+                    -6,
+                    2
+                ],
+                14
+            ]
+        ],
+        [
+            [
+                [
+                    -14,
+                    -1
+                ],
+                9
+            ],
+            [
+                [
+                    -13,
+                    11,
+                    9,
+                    -1,
+                    0,
+                    0,
+                    -7,
+                    -12,
+                    -8
+                ],
+                10
+            ],
+            [
+                [
+                    -12
+                ],
+                11
+            ],
+            [
+                [
+                    -12,
+                    -13,
+                    -13,
+                    -3,
+                    -8,
+                    -2,
+                    10,
+                    13,
+                    -7,
+                    11,
+                    11,
+                    6,
+                    0
+                ],
+                10
+            ],
+            [
+                [
+                    -10
+                ],
+                14
+            ],
+            [
+                [
+                    -7,
+                    3,
+                    -3,
+                    6,
+                    -13,
+                    -3,
+                    -11,
+                    7,
+                    13,
+                    3
+                ],
+                4
+            ],
+            [
+                [
+                    -6,
+                    -6,
+                    3,
+                    -13,
+                    14,
+                    2,
+                    -11,
+                    -6,
+                    -13,
+                    2,
+                    1,
+                    -14
+                ],
+                12
+            ],
+            [
+                [
+                    -6,
+                    7,
+                    5,
+                    6,
+                    3,
+                    11,
+                    9,
+                    10,
+                    -5,
+                    13
+                ],
+                11
+            ],
+            [
+                [
+                    -1,
+                    14,
+                    -9,
+                    5,
+                    -4,
+                    11,
+                    -14,
+                    8,
+                    11,
+                    5,
+                    9,
+                    4,
+                    3
+                ],
+                8
+            ],
+            [
+                [
+                    7,
+                    5,
+                    -2,
+                    14,
+                    1,
+                    -11,
+                    -4,
+                    -2,
+                    -11,
+                    -1
+                ],
+                8
+            ],
+            [
+                [
+                    11,
+                    -7,
+                    13,
+                    8,
+                    8,
+                    7
+                ],
+                6
+            ]
+        ],
+        [
+            [
+                [],
+                1
+            ],
+            [
+                [
+                    -13,
+                    -11,
+                    12,
+                    -13,
+                    8,
+                    12,
+                    -13,
+                    -5,
+                    5,
+                    -13,
+                    7,
+                    2,
+                    13
+                ],
+                2
+            ],
+            [
+                [
+                    -4,
+                    -11,
+                    -3,
+                    -2,
+                    5,
+                    6,
+                    14,
+                    -10,
+                    5,
+                    0,
+                    2,
+                    -6,
+                    3
+                ],
+                9
+            ],
+            [
+                [
+                    -3,
+                    -8,
+                    -3,
+                    9,
+                    7,
+                    4,
+                    -10,
+                    -10,
+                    5,
+                    -9,
+                    0,
+                    -9,
+                    -3,
+                    2
+                ],
+                2
+            ],
+            [
+                [
+                    -2,
+                    -13,
+                    4,
+                    4,
+                    8,
+                    4,
+                    1,
+                    3,
+                    0,
+                    -5,
+                    1,
+                    3,
+                    0,
+                    5
+                ],
+                8
+            ],
+            [
+                [
+                    -1,
+                    -9,
+                    -3,
+                    11,
+                    6,
+                    5,
+                    -11,
+                    -5,
+                    -14
+                ],
+                7
+            ],
+            [
+                [
+                    0,
+                    0,
+                    3
+                ],
+                12
+            ],
+            [
+                [
+                    2,
+                    -8
+                ],
+                11
+            ],
+            [
+                [
+                    8,
+                    11,
+                    -7,
+                    -13,
+                    12,
+                    -7,
+                    1,
+                    -3
+                ],
+                10
+            ],
+            [
+                [
+                    9,
+                    -3,
+                    -7,
+                    12,
+                    -8,
+                    4,
+                    -3,
+                    -6,
+                    2,
+                    -3
+                ],
+                2
+            ]
+        ],
+        [],
+        [
+            [
+                [
+                    -10,
+                    -2,
+                    4,
+                    -5,
+                    -12,
+                    1,
+                    -4,
+                    3,
+                    -6,
+                    -12,
+                    12,
+                    11
+                ],
+                10
+            ],
+            [
+                [
+                    -9,
+                    11,
+                    1
+                ],
+                4
+            ],
+            [
+                [
+                    -6,
+                    2
+                ],
+                14
+            ],
+            [
+                [
+                    -5,
+                    5,
+                    -8
+                ],
+                3
+            ],
+            [
+                [
+                    -1
+                ],
+                3
+            ],
+            [
+                [
+                    12,
+                    -2
+                ],
+                8
+            ]
+        ],
+        [
+            [
+                [
+                    -8,
+                    -4,
+                    -6,
+                    2,
+                    1,
+                    -8,
+                    6,
+                    2,
+                    -10,
+                    -13,
+                    12,
+                    2
+                ],
+                6
+            ],
+            [
+                [
+                    0,
+                    -9,
+                    -10,
+                    11,
+                    -14,
+                    13,
+                    -14,
+                    -10,
+                    -10,
+                    6,
+                    -9,
+                    2,
+                    1,
+                    11
+                ],
+                11
+            ],
+            [
+                [
+                    2,
+                    11,
+                    -10,
+                    -4,
+                    14,
+                    12,
+                    -2,
+                    -10,
+                    3,
+                    11,
+                    2,
+                    4,
+                    12
+                ],
+                12
+            ],
+            [
+                [
+                    3,
+                    3,
+                    12,
+                    9,
+                    8,
+                    11,
+                    8,
+                    -7,
+                    -4,
+                    3,
+                    0,
+                    7
+                ],
+                14
+            ],
+            [
+                [
+                    7,
+                    -12,
+                    -10,
+                    -11,
+                    -4
+                ],
+                7
+            ]
+        ],
+        [
+            [
+                [],
+                11
+            ],
+            [
+                [
+                    -14,
+                    7,
+                    -8,
+                    5,
+                    2,
+                    6,
+                    6,
+                    -4,
+                    -6,
+                    -7
+                ],
+                6
+            ],
+            [
+                [
+                    -11,
+                    11,
+                    2,
+                    -3
+                ],
+                4
+            ],
+            [
+                [
+                    -6,
+                    -5,
+                    11,
+                    -1,
+                    6,
+                    8
+                ],
+                3
+            ],
+            [
+                [
+                    -4,
+                    6,
+                    4,
+                    7,
+                    -13,
+                    13,
+                    9,
+                    -10,
+                    -13,
+                    13
+                ],
+                8
+            ],
+            [
+                [
+                    -4,
+                    14,
+                    -6,
+                    -9,
+                    6,
+                    -14,
+                    -11,
+                    -2,
+                    -12,
+                    -6,
+                    -14
+                ],
+                8
+            ],
+            [
+                [
+                    0,
+                    -12,
+                    10,
+                    -1,
+                    7,
+                    -13,
+                    9,
+                    1,
+                    -8
+                ],
+                6
+            ],
+            [
+                [
+                    2,
+                    3,
+                    8
+                ],
+                14
+            ],
+            [
+                [
+                    7
+                ],
+                11
+            ],
+            [
+                [
+                    9,
+                    -12,
+                    3,
+                    -4,
+                    4,
+                    0
+                ],
+                10
+            ],
+            [
+                [
+                    10,
+                    0,
+                    5
+                ],
+                12
+            ],
+            [
+                [
+                    12,
+                    -8,
+                    3,
+                    -7,
+                    7,
+                    -6,
+                    10,
+                    11,
+                    -5,
+                    0,
+                    -9,
+                    0
+                ],
+                7
+            ],
+            [
+                [
+                    14,
+                    7,
+                    -1,
+                    -2,
+                    14,
+                    11,
+                    -3,
+                    1,
+                    -8,
+                    10
+                ],
+                14
+            ]
+        ],
+        [
+            [
+                [
+                    -9,
+                    10,
+                    6,
+                    -13,
+                    -14,
+                    5
+                ],
+                2
+            ],
+            [
+                [
+                    2,
+                    -8,
+                    14,
+                    13,
+                    -6,
+                    11,
+                    -9,
+                    3,
+                    9,
+                    5,
+                    11,
+                    5,
+                    -7
+                ],
+                5
+            ]
+        ],
+        [
+            [
+                [
+                    -8,
+                    -13,
+                    11,
+                    -7,
+                    -5,
+                    3,
+                    2,
+                    1,
+                    -11,
+                    4,
+                    -13,
+                    -6,
+                    9
+                ],
+                13
+            ],
+            [
+                [
+                    -7,
+                    5,
+                    12,
+                    -8,
+                    -2,
+                    14,
+                    -8,
+                    2
+                ],
+                14
+            ],
+            [
+                [
+                    -6,
+                    3,
+                    -4,
+                    -10,
+                    -5,
+                    11,
+                    14,
+                    12,
+                    -9,
+                    7,
+                    6
+                ],
+                6
+            ],
+            [
+                [
+                    -6,
+                    5,
+                    -4,
+                    13,
+                    3,
+                    -14,
+                    -12,
+                    9,
+                    1
+                ],
+                6
+            ],
+            [
+                [
+                    -2,
+                    3,
+                    -7,
+                    11,
+                    12,
+                    4,
+                    9,
+                    -4,
+                    7,
+                    -13,
+                    7,
+                    -9
+                ],
+                11
+            ],
+            [
+                [
+                    0,
+                    4,
+                    13,
+                    -5,
+                    -10,
+                    1,
+                    14
+                ],
+                9
+            ],
+            [
+                [
+                    5,
+                    4,
+                    -7,
+                    -2,
+                    14,
+                    -6,
+                    9,
+                    10,
+                    9,
+                    -10,
+                    -2,
+                    -12,
+                    9,
+                    3
+                ],
+                13
+            ],
+            [
+                [
+                    7,
+                    14,
+                    -11,
+                    4,
+                    -5,
+                    -4,
+                    -5,
+                    6,
+                    -1,
+                    14,
+                    -5
+                ],
+                13
+            ],
+            [
+                [
+                    9,
+                    3,
+                    7,
+                    -3,
+                    -8,
+                    12,
+                    0,
+                    -13,
+                    0,
+                    -13,
+                    9,
+                    -3
+                ],
+                12
+            ]
+        ],
+        [
+            [
+                [
+                    -2,
+                    4,
+                    -9,
+                    -9
+                ],
+                9
+            ]
+        ]
+    ],
+    "seed": 1042210798
+}
diff --git a/golden/MonoidMap [Int] Text.json b/golden/MonoidMap [Int] Text.json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] Text.json
@@ -0,0 +1,849 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -14
+                ],
+                "baaaabaaaaad"
+            ],
+            [
+                [
+                    -6,
+                    -2,
+                    -9
+                ],
+                "aaaaaaaaaa"
+            ],
+            [
+                [
+                    -1,
+                    11,
+                    -10,
+                    12
+                ],
+                "aaaaaa"
+            ],
+            [
+                [
+                    1,
+                    0,
+                    4,
+                    -13,
+                    8,
+                    5,
+                    -8,
+                    1,
+                    10,
+                    12,
+                    -8,
+                    -14,
+                    -8
+                ],
+                "abaaaabababaa"
+            ],
+            [
+                [
+                    4,
+                    -10,
+                    -11,
+                    6,
+                    7,
+                    11,
+                    -9
+                ],
+                "a"
+            ],
+            [
+                [
+                    9,
+                    -7,
+                    -14,
+                    3,
+                    -2,
+                    -10
+                ],
+                "ca"
+            ],
+            [
+                [
+                    11,
+                    12,
+                    1
+                ],
+                "aaa"
+            ],
+            [
+                [
+                    12,
+                    -9,
+                    -13,
+                    4,
+                    9,
+                    1,
+                    11,
+                    -12,
+                    -9,
+                    -4,
+                    -6,
+                    -8,
+                    -3
+                ],
+                "bbbaaaaaba"
+            ],
+            [
+                [
+                    12,
+                    10
+                ],
+                "abaaaaaaaaa"
+            ]
+        ],
+        [
+            [
+                [
+                    -2,
+                    5,
+                    12,
+                    9,
+                    -12,
+                    7,
+                    14,
+                    -13,
+                    -14
+                ],
+                "b"
+            ],
+            [
+                [
+                    1,
+                    0,
+                    -13,
+                    -11
+                ],
+                "aaba"
+            ],
+            [
+                [
+                    3,
+                    -2,
+                    -10,
+                    -10,
+                    -12,
+                    -11,
+                    -7,
+                    12,
+                    -1
+                ],
+                "aaaaaa"
+            ],
+            [
+                [
+                    6
+                ],
+                "aacbaaaaaa"
+            ],
+            [
+                [
+                    6,
+                    11,
+                    0,
+                    -14,
+                    3,
+                    -2
+                ],
+                "aba"
+            ],
+            [
+                [
+                    7,
+                    -10,
+                    3,
+                    -10,
+                    -5,
+                    13
+                ],
+                "abaaaaaaaaab"
+            ],
+            [
+                [
+                    8,
+                    9,
+                    -2,
+                    -6
+                ],
+                "aaaaaaaaaaaaaa"
+            ]
+        ],
+        [
+            [
+                [
+                    -8,
+                    10,
+                    -8,
+                    -6,
+                    1,
+                    9,
+                    -14,
+                    -11,
+                    10,
+                    5,
+                    -4,
+                    1,
+                    9,
+                    -11
+                ],
+                "cbaaba"
+            ],
+            [
+                [
+                    -6,
+                    -13,
+                    8,
+                    12,
+                    8,
+                    -8,
+                    -11
+                ],
+                "baaaaaa"
+            ],
+            [
+                [
+                    -5
+                ],
+                "aaaabaaaaaaacb"
+            ],
+            [
+                [
+                    -2
+                ],
+                "baa"
+            ],
+            [
+                [
+                    8,
+                    11,
+                    2,
+                    2,
+                    -12,
+                    -6,
+                    7
+                ],
+                "aa"
+            ],
+            [
+                [
+                    11,
+                    5,
+                    12,
+                    1,
+                    13,
+                    -6,
+                    7,
+                    14,
+                    13
+                ],
+                "bababaaaaaaab"
+            ]
+        ],
+        [
+            [
+                [],
+                "cabaabaababbaa"
+            ],
+            [
+                [
+                    -13,
+                    -12,
+                    8,
+                    6
+                ],
+                "aaabcbaaa"
+            ],
+            [
+                [
+                    -5,
+                    -6,
+                    9,
+                    -9,
+                    -5,
+                    1,
+                    0,
+                    -10,
+                    1,
+                    1,
+                    -5
+                ],
+                "abbbb"
+            ],
+            [
+                [
+                    -3,
+                    -8,
+                    10,
+                    8,
+                    -1,
+                    -4,
+                    -10,
+                    -3,
+                    -5,
+                    -2,
+                    8,
+                    4,
+                    5,
+                    0
+                ],
+                "aab"
+            ],
+            [
+                [
+                    0
+                ],
+                "aaabaaaaaa"
+            ],
+            [
+                [
+                    2,
+                    10,
+                    2,
+                    6,
+                    -4,
+                    11,
+                    -14
+                ],
+                "b"
+            ],
+            [
+                [
+                    4,
+                    3,
+                    4,
+                    -11,
+                    0,
+                    2,
+                    -5,
+                    -10,
+                    10
+                ],
+                "aaaaabaaaaaa"
+            ],
+            [
+                [
+                    8,
+                    -8,
+                    -14,
+                    -7,
+                    -1,
+                    11,
+                    -13,
+                    14,
+                    1
+                ],
+                "baaaaaa"
+            ],
+            [
+                [
+                    12,
+                    -7,
+                    -2,
+                    6,
+                    -10,
+                    -4,
+                    -5,
+                    -1,
+                    2,
+                    -2
+                ],
+                "aaaaabaaabbaa"
+            ]
+        ],
+        [],
+        [
+            [
+                [
+                    -12,
+                    -9,
+                    6,
+                    -5,
+                    -4
+                ],
+                "aabaaaaaaaaa"
+            ]
+        ],
+        [
+            [
+                [
+                    -10,
+                    -9,
+                    2,
+                    8,
+                    -2,
+                    9,
+                    1,
+                    -14,
+                    0,
+                    -7,
+                    -13,
+                    -14,
+                    13
+                ],
+                "aa"
+            ],
+            [
+                [
+                    -6,
+                    6
+                ],
+                "b"
+            ],
+            [
+                [
+                    -5,
+                    -7,
+                    12,
+                    -14,
+                    -11
+                ],
+                "baaaaababababa"
+            ],
+            [
+                [
+                    -2,
+                    -14
+                ],
+                "abaaaaaaaaaaaa"
+            ],
+            [
+                [
+                    -2,
+                    -10
+                ],
+                "abaaaaacca"
+            ],
+            [
+                [
+                    4,
+                    -2,
+                    8,
+                    5
+                ],
+                "aaa"
+            ],
+            [
+                [
+                    5,
+                    -4,
+                    10,
+                    12,
+                    -11,
+                    -6,
+                    2,
+                    -4,
+                    -4,
+                    -7
+                ],
+                "a"
+            ],
+            [
+                [
+                    6,
+                    -7,
+                    -6,
+                    0,
+                    3,
+                    5,
+                    13,
+                    -13,
+                    -8,
+                    10,
+                    -10,
+                    -10,
+                    8,
+                    4
+                ],
+                "acaaaabbaaaaa"
+            ],
+            [
+                [
+                    9,
+                    0,
+                    7,
+                    13,
+                    -2,
+                    0,
+                    -9,
+                    -10
+                ],
+                "bbaac"
+            ],
+            [
+                [
+                    14,
+                    7,
+                    -4,
+                    -5,
+                    12,
+                    -14,
+                    -14
+                ],
+                "baa"
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    -13,
+                    0,
+                    -6,
+                    14,
+                    8,
+                    -6,
+                    6,
+                    0,
+                    13,
+                    14
+                ],
+                "abaaaada"
+            ],
+            [
+                [
+                    -13,
+                    14,
+                    -11,
+                    10,
+                    14,
+                    -9,
+                    -9,
+                    0,
+                    10
+                ],
+                "a"
+            ],
+            [
+                [
+                    5,
+                    -5,
+                    -10,
+                    -9,
+                    -12,
+                    -1,
+                    9,
+                    -12
+                ],
+                "aabcbba"
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    -5,
+                    -5,
+                    7
+                ],
+                "aaa"
+            ],
+            [
+                [
+                    -11,
+                    1,
+                    -7,
+                    13,
+                    -14,
+                    -11,
+                    0,
+                    6
+                ],
+                "aaaaa"
+            ],
+            [
+                [
+                    -8,
+                    12,
+                    2
+                ],
+                "aabcaaabaaaa"
+            ],
+            [
+                [
+                    -5,
+                    -5,
+                    10,
+                    -5
+                ],
+                "aaacaaaaa"
+            ],
+            [
+                [
+                    -4
+                ],
+                "aaa"
+            ],
+            [
+                [
+                    -4,
+                    6,
+                    13,
+                    -10,
+                    6,
+                    12,
+                    11,
+                    -2
+                ],
+                "abaaaa"
+            ],
+            [
+                [
+                    0,
+                    12,
+                    0,
+                    0,
+                    -9,
+                    -13,
+                    -1
+                ],
+                "aa"
+            ],
+            [
+                [
+                    2,
+                    -13,
+                    4,
+                    11,
+                    -12,
+                    -1
+                ],
+                "aaaaaaaaa"
+            ],
+            [
+                [
+                    6,
+                    -13,
+                    12
+                ],
+                "aaaaaaacbbaaa"
+            ],
+            [
+                [
+                    6,
+                    -4,
+                    10,
+                    5,
+                    -2,
+                    12,
+                    12,
+                    12,
+                    8,
+                    -13,
+                    2
+                ],
+                "aacaaabbaa"
+            ],
+            [
+                [
+                    6,
+                    2,
+                    10,
+                    -5,
+                    4,
+                    0,
+                    11,
+                    -14,
+                    -2,
+                    1,
+                    4,
+                    5
+                ],
+                "aaaab"
+            ],
+            [
+                [
+                    7,
+                    9,
+                    4,
+                    -5,
+                    1,
+                    -1,
+                    13,
+                    -5,
+                    3,
+                    -12,
+                    7,
+                    -9,
+                    -8
+                ],
+                "aaabbaa"
+            ],
+            [
+                [
+                    12,
+                    12,
+                    3,
+                    14,
+                    -4,
+                    -5,
+                    10,
+                    8,
+                    10,
+                    2,
+                    -2,
+                    -13,
+                    0,
+                    -5
+                ],
+                "bbaab"
+            ]
+        ],
+        [
+            [
+                [
+                    -11,
+                    9,
+                    8,
+                    -6,
+                    -3,
+                    -1,
+                    -14,
+                    3
+                ],
+                "baaaaaaaaababa"
+            ],
+            [
+                [
+                    -10,
+                    1,
+                    4,
+                    -3,
+                    11,
+                    14,
+                    -10,
+                    4,
+                    7,
+                    2,
+                    14,
+                    -13
+                ],
+                "aaa"
+            ],
+            [
+                [
+                    -9,
+                    3
+                ],
+                "aaab"
+            ],
+            [
+                [
+                    -5,
+                    -8,
+                    -4,
+                    4,
+                    -3,
+                    10,
+                    -14
+                ],
+                "aababa"
+            ],
+            [
+                [
+                    -5,
+                    5,
+                    10,
+                    7
+                ],
+                "aaaaaaaabb"
+            ],
+            [
+                [
+                    -4
+                ],
+                "aaaba"
+            ],
+            [
+                [
+                    -3,
+                    9,
+                    4,
+                    -14,
+                    1,
+                    -9,
+                    -6,
+                    -2,
+                    -12
+                ],
+                "aaa"
+            ],
+            [
+                [
+                    0,
+                    4,
+                    -12
+                ],
+                "aaaaaaaa"
+            ],
+            [
+                [
+                    3
+                ],
+                "abaaaaaaaaaca"
+            ],
+            [
+                [
+                    5,
+                    -6,
+                    10,
+                    -4,
+                    -8,
+                    -10,
+                    -11,
+                    -7,
+                    -9,
+                    -6,
+                    2,
+                    -10
+                ],
+                "acaaaabab"
+            ],
+            [
+                [
+                    6,
+                    -13,
+                    4,
+                    4,
+                    8,
+                    8,
+                    -10,
+                    9,
+                    -8,
+                    8,
+                    -5
+                ],
+                "aabcabaaaaaaac"
+            ],
+            [
+                [
+                    9,
+                    7,
+                    -4,
+                    -13,
+                    12
+                ],
+                "aaaaaaaa"
+            ],
+            [
+                [
+                    10,
+                    -1,
+                    14,
+                    -10,
+                    13,
+                    -5,
+                    -8
+                ],
+                "aaba"
+            ]
+        ]
+    ],
+    "seed": -1059936819
+}
diff --git a/golden/MonoidMap [Int] [Int].json b/golden/MonoidMap [Int] [Int].json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] [Int].json
@@ -0,0 +1,1090 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    -11,
+                    7,
+                    10
+                ],
+                [
+                    -12,
+                    -10,
+                    -8,
+                    -13,
+                    -12
+                ]
+            ],
+            [
+                [
+                    -2
+                ],
+                [
+                    -6
+                ]
+            ],
+            [
+                [
+                    2,
+                    -14,
+                    8,
+                    10,
+                    -13,
+                    -10
+                ],
+                [
+                    -10,
+                    -2,
+                    0,
+                    9,
+                    6,
+                    11,
+                    -12
+                ]
+            ],
+            [
+                [
+                    4,
+                    7
+                ],
+                [
+                    -6,
+                    -3,
+                    2,
+                    9,
+                    11,
+                    -6,
+                    -12,
+                    -8,
+                    -13
+                ]
+            ],
+            [
+                [
+                    7,
+                    8,
+                    4,
+                    -3,
+                    -5,
+                    -5
+                ],
+                [
+                    14,
+                    10,
+                    -11,
+                    2,
+                    -12,
+                    2,
+                    0,
+                    -3,
+                    0,
+                    -6,
+                    -7,
+                    -6
+                ]
+            ],
+            [
+                [
+                    10,
+                    7,
+                    1,
+                    8,
+                    -11
+                ],
+                [
+                    8,
+                    9,
+                    -6,
+                    9,
+                    12,
+                    -5,
+                    9,
+                    4,
+                    -2,
+                    12
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    -10,
+                    -10,
+                    -2,
+                    12,
+                    2,
+                    -7,
+                    11
+                ]
+            ],
+            [
+                [
+                    -13,
+                    -8,
+                    3,
+                    -10,
+                    5
+                ],
+                [
+                    4,
+                    12,
+                    14,
+                    11,
+                    -10
+                ]
+            ],
+            [
+                [
+                    -13,
+                    2,
+                    4,
+                    2,
+                    13,
+                    -10,
+                    -8,
+                    12
+                ],
+                [
+                    -11,
+                    8,
+                    -3,
+                    5,
+                    10,
+                    -2,
+                    12,
+                    -1
+                ]
+            ],
+            [
+                [
+                    -12
+                ],
+                [
+                    5,
+                    -13,
+                    -11,
+                    -4,
+                    -7,
+                    5,
+                    12
+                ]
+            ],
+            [
+                [
+                    -7,
+                    -1,
+                    -2,
+                    -9,
+                    4,
+                    -10,
+                    0,
+                    -11
+                ],
+                [
+                    9,
+                    -14,
+                    -11,
+                    -4,
+                    11,
+                    12,
+                    11
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -9
+                ],
+                [
+                    -4
+                ]
+            ],
+            [
+                [
+                    1,
+                    -10,
+                    0,
+                    -9,
+                    14,
+                    -10,
+                    4,
+                    14,
+                    -5,
+                    -6
+                ],
+                [
+                    0,
+                    8,
+                    10,
+                    -11,
+                    9,
+                    6
+                ]
+            ],
+            [
+                [
+                    2,
+                    -9,
+                    2,
+                    5
+                ],
+                [
+                    -6,
+                    -5
+                ]
+            ],
+            [
+                [
+                    3,
+                    10,
+                    11,
+                    -11,
+                    13,
+                    14,
+                    -10
+                ],
+                [
+                    10,
+                    5,
+                    0,
+                    -5,
+                    11,
+                    9,
+                    11,
+                    8,
+                    -11,
+                    -1,
+                    -3,
+                    14,
+                    -10
+                ]
+            ]
+        ],
+        [],
+        [
+            [
+                [],
+                [
+                    -14,
+                    -8,
+                    -9,
+                    1,
+                    -10,
+                    11,
+                    -14,
+                    -4,
+                    -1,
+                    14,
+                    9,
+                    2,
+                    -12,
+                    9,
+                    9
+                ]
+            ],
+            [
+                [
+                    -10,
+                    1,
+                    -3,
+                    13,
+                    -14,
+                    -8,
+                    -8
+                ],
+                [
+                    9
+                ]
+            ],
+            [
+                [
+                    -7,
+                    8
+                ],
+                [
+                    -4,
+                    3,
+                    4,
+                    3,
+                    7,
+                    14,
+                    -10,
+                    5,
+                    0,
+                    2,
+                    14
+                ]
+            ],
+            [
+                [
+                    -6,
+                    -5,
+                    11,
+                    -13,
+                    10,
+                    -14,
+                    -5,
+                    8,
+                    -5,
+                    9
+                ],
+                [
+                    4,
+                    -2,
+                    4,
+                    -11,
+                    -11,
+                    5,
+                    -6,
+                    -3
+                ]
+            ],
+            [
+                [
+                    3,
+                    12,
+                    -1,
+                    9,
+                    13,
+                    5,
+                    -2,
+                    10,
+                    13,
+                    -14,
+                    12,
+                    -7,
+                    0
+                ],
+                [
+                    9,
+                    6,
+                    13,
+                    9,
+                    -6
+                ]
+            ],
+            [
+                [
+                    4,
+                    -2,
+                    -4,
+                    -8,
+                    14,
+                    8,
+                    -14,
+                    -2,
+                    7,
+                    14,
+                    -8,
+                    13,
+                    0,
+                    -10
+                ],
+                [
+                    -5,
+                    1,
+                    -2,
+                    8,
+                    14,
+                    6,
+                    11,
+                    3,
+                    -3,
+                    -2,
+                    -9,
+                    -4
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -2,
+                    10,
+                    8,
+                    6,
+                    -14,
+                    -12,
+                    -3,
+                    3,
+                    11
+                ],
+                [
+                    -4,
+                    12,
+                    -6,
+                    -7,
+                    2,
+                    -10
+                ]
+            ],
+            [
+                [
+                    -2,
+                    14,
+                    3,
+                    0,
+                    -6,
+                    2,
+                    -5,
+                    1,
+                    -1,
+                    -9
+                ],
+                [
+                    14,
+                    -2,
+                    -10,
+                    -6,
+                    13,
+                    8,
+                    -9
+                ]
+            ],
+            [
+                [
+                    1,
+                    -13,
+                    -14,
+                    11,
+                    13,
+                    -12,
+                    -7,
+                    -13,
+                    -1,
+                    3,
+                    -5
+                ],
+                [
+                    -14,
+                    -1,
+                    9,
+                    6,
+                    -6,
+                    10,
+                    3
+                ]
+            ],
+            [
+                [
+                    4,
+                    11,
+                    -10,
+                    11,
+                    12,
+                    -9,
+                    10,
+                    -8,
+                    14,
+                    11,
+                    14,
+                    -3,
+                    3
+                ],
+                [
+                    -10,
+                    -6,
+                    -2,
+                    5,
+                    -11,
+                    -2,
+                    -11,
+                    13,
+                    -9,
+                    -4,
+                    -8
+                ]
+            ],
+            [
+                [
+                    8,
+                    6,
+                    4,
+                    -12,
+                    -14,
+                    14,
+                    3,
+                    -12
+                ],
+                [
+                    -6,
+                    10,
+                    13,
+                    -3,
+                    14
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -13
+                ],
+                [
+                    12,
+                    -1,
+                    8,
+                    10,
+                    -11
+                ]
+            ],
+            [
+                [
+                    -8,
+                    5,
+                    7
+                ],
+                [
+                    5,
+                    -14,
+                    -7
+                ]
+            ],
+            [
+                [
+                    -3,
+                    -6,
+                    6,
+                    7,
+                    -7,
+                    -5,
+                    -4,
+                    12
+                ],
+                [
+                    -7,
+                    14,
+                    2,
+                    -14,
+                    -12,
+                    2,
+                    2
+                ]
+            ],
+            [
+                [
+                    5,
+                    -14,
+                    -9,
+                    -2,
+                    0,
+                    11,
+                    6,
+                    -8,
+                    -8,
+                    1,
+                    -2
+                ],
+                [
+                    3,
+                    6,
+                    -11,
+                    13
+                ]
+            ],
+            [
+                [
+                    8,
+                    -1,
+                    -5,
+                    3,
+                    8,
+                    5,
+                    -14,
+                    2,
+                    3,
+                    -11
+                ],
+                [
+                    14,
+                    9,
+                    3,
+                    -2,
+                    -9,
+                    0,
+                    -12,
+                    -14,
+                    -11,
+                    -11,
+                    0,
+                    -5
+                ]
+            ],
+            [
+                [
+                    9,
+                    -14,
+                    -9,
+                    1,
+                    -2,
+                    -10,
+                    -14,
+                    -11,
+                    10,
+                    3,
+                    -1,
+                    8,
+                    3
+                ],
+                [
+                    -13,
+                    -13,
+                    -6,
+                    7,
+                    6,
+                    9,
+                    -12
+                ]
+            ],
+            [
+                [
+                    12,
+                    -7,
+                    6,
+                    8,
+                    -12,
+                    -6,
+                    -8
+                ],
+                [
+                    3,
+                    8,
+                    -11,
+                    -12,
+                    3,
+                    -8,
+                    3
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    5,
+                    -14,
+                    1,
+                    10,
+                    13,
+                    6,
+                    -13,
+                    -10,
+                    -4,
+                    11,
+                    0,
+                    -13,
+                    -11
+                ]
+            ],
+            [
+                [
+                    -12,
+                    -4
+                ],
+                [
+                    -11,
+                    -5,
+                    -5,
+                    -11,
+                    -7,
+                    -8,
+                    1
+                ]
+            ],
+            [
+                [
+                    -12,
+                    -3,
+                    -10,
+                    -11,
+                    6
+                ],
+                [
+                    -5,
+                    6,
+                    -8,
+                    11,
+                    -6,
+                    -3,
+                    -14,
+                    -5
+                ]
+            ],
+            [
+                [
+                    -6,
+                    -13,
+                    -1,
+                    8,
+                    -2,
+                    -5,
+                    2,
+                    -3,
+                    -14,
+                    5,
+                    9,
+                    -8,
+                    1,
+                    -1
+                ],
+                [
+                    2,
+                    6,
+                    -9,
+                    7,
+                    8,
+                    -8,
+                    1,
+                    7,
+                    -4,
+                    -9,
+                    -8,
+                    14,
+                    7
+                ]
+            ],
+            [
+                [
+                    -2,
+                    -11,
+                    1,
+                    -3,
+                    0,
+                    -13,
+                    3,
+                    -10,
+                    -10,
+                    3,
+                    -1,
+                    1
+                ],
+                [
+                    6,
+                    0,
+                    1,
+                    10,
+                    -8,
+                    -9,
+                    -13,
+                    8
+                ]
+            ],
+            [
+                [
+                    1
+                ],
+                [
+                    -13,
+                    8,
+                    9,
+                    14,
+                    -3,
+                    7,
+                    -3,
+                    0
+                ]
+            ],
+            [
+                [
+                    1,
+                    0,
+                    -6,
+                    -1,
+                    5,
+                    10,
+                    1,
+                    -10,
+                    -7,
+                    -4,
+                    14
+                ],
+                [
+                    -14,
+                    -4
+                ]
+            ],
+            [
+                [
+                    4,
+                    -7,
+                    12,
+                    -11,
+                    -11,
+                    2,
+                    7,
+                    -13,
+                    7,
+                    -2
+                ],
+                [
+                    -13,
+                    4
+                ]
+            ],
+            [
+                [
+                    12,
+                    -13,
+                    -9,
+                    11,
+                    -14,
+                    10,
+                    5,
+                    2
+                ],
+                [
+                    13,
+                    -3,
+                    4,
+                    -9,
+                    -7,
+                    -11,
+                    -3,
+                    12,
+                    13,
+                    0
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -12,
+                    -12
+                ],
+                [
+                    -14,
+                    -14,
+                    3,
+                    -5,
+                    4,
+                    12,
+                    -4,
+                    8,
+                    -1,
+                    -3,
+                    9,
+                    13,
+                    -1,
+                    1
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -9,
+                    8,
+                    -8,
+                    6,
+                    11
+                ],
+                [
+                    -4,
+                    5,
+                    -12,
+                    -4,
+                    -3,
+                    3,
+                    2,
+                    -12,
+                    -9,
+                    -3
+                ]
+            ],
+            [
+                [
+                    -8,
+                    -7,
+                    -11,
+                    -7,
+                    -12,
+                    14,
+                    4,
+                    9,
+                    2,
+                    0
+                ],
+                [
+                    -9,
+                    -6,
+                    -14
+                ]
+            ],
+            [
+                [
+                    0,
+                    3
+                ],
+                [
+                    -5,
+                    8,
+                    -1,
+                    7,
+                    13,
+                    -6,
+                    -13,
+                    -1,
+                    -4,
+                    8,
+                    0,
+                    -4
+                ]
+            ],
+            [
+                [
+                    4,
+                    -7,
+                    6
+                ],
+                [
+                    1,
+                    10,
+                    13,
+                    -2,
+                    -3,
+                    -2,
+                    -1,
+                    -8,
+                    5
+                ]
+            ],
+            [
+                [
+                    8,
+                    -14,
+                    -12,
+                    -13,
+                    13,
+                    3,
+                    14,
+                    11,
+                    12,
+                    -8,
+                    -3,
+                    -4
+                ],
+                [
+                    11,
+                    11,
+                    -8,
+                    14,
+                    -12,
+                    -3,
+                    -12,
+                    12,
+                    0
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -4,
+                    -6
+                ],
+                [
+                    -12,
+                    -3,
+                    8,
+                    14,
+                    8,
+                    -6,
+                    -11,
+                    -13,
+                    2,
+                    -10
+                ]
+            ],
+            [
+                [
+                    -1,
+                    -10,
+                    -14,
+                    10,
+                    9,
+                    9,
+                    -2,
+                    11,
+                    -10,
+                    2,
+                    11,
+                    7
+                ],
+                [
+                    1,
+                    -5,
+                    -13,
+                    3,
+                    14,
+                    -8,
+                    12,
+                    -11,
+                    1,
+                    2,
+                    -14,
+                    -10
+                ]
+            ],
+            [
+                [
+                    0,
+                    11,
+                    -1,
+                    -9,
+                    -4,
+                    3,
+                    12,
+                    -5,
+                    -2,
+                    -12
+                ],
+                [
+                    9
+                ]
+            ],
+            [
+                [
+                    1,
+                    5,
+                    6,
+                    12,
+                    -5,
+                    -10,
+                    -11,
+                    -13,
+                    -12
+                ],
+                [
+                    5,
+                    13,
+                    3,
+                    -7,
+                    -14,
+                    -13,
+                    11,
+                    -1
+                ]
+            ],
+            [
+                [
+                    5,
+                    -13,
+                    -13
+                ],
+                [
+                    3,
+                    1,
+                    -5,
+                    -12,
+                    -1,
+                    -4,
+                    12,
+                    -2
+                ]
+            ]
+        ]
+    ],
+    "seed": -622905619
+}
diff --git a/golden/MonoidMap [Int] [Natural].json b/golden/MonoidMap [Int] [Natural].json
new file mode 100644
--- /dev/null
+++ b/golden/MonoidMap [Int] [Natural].json
@@ -0,0 +1,1434 @@
+{
+    "samples": [
+        [
+            [
+                [
+                    1,
+                    6,
+                    3,
+                    6,
+                    12
+                ],
+                [
+                    7,
+                    11,
+                    0,
+                    11,
+                    11,
+                    12,
+                    11,
+                    0,
+                    3,
+                    7,
+                    9,
+                    0
+                ]
+            ],
+            [
+                [
+                    14,
+                    3
+                ],
+                [
+                    6,
+                    13,
+                    12,
+                    12,
+                    4,
+                    0,
+                    8,
+                    8,
+                    10,
+                    4,
+                    3,
+                    9
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    6,
+                    8,
+                    4,
+                    11,
+                    0,
+                    1,
+                    13,
+                    14,
+                    1,
+                    12
+                ]
+            ],
+            [
+                [
+                    -6,
+                    3,
+                    9,
+                    3,
+                    -2
+                ],
+                [
+                    12
+                ]
+            ],
+            [
+                [
+                    -6,
+                    14,
+                    0
+                ],
+                [
+                    12,
+                    0,
+                    3,
+                    14,
+                    1,
+                    0,
+                    13,
+                    6,
+                    1,
+                    13
+                ]
+            ],
+            [
+                [
+                    4,
+                    10,
+                    6,
+                    -4,
+                    13,
+                    8,
+                    -11,
+                    2,
+                    -1,
+                    0,
+                    -5,
+                    12
+                ],
+                [
+                    6,
+                    0,
+                    5,
+                    11,
+                    2,
+                    9,
+                    8,
+                    14,
+                    4,
+                    5
+                ]
+            ],
+            [
+                [
+                    10,
+                    2,
+                    -1,
+                    3,
+                    -8,
+                    14,
+                    -9,
+                    2,
+                    13,
+                    -11,
+                    -11,
+                    5,
+                    -11,
+                    0
+                ],
+                [
+                    9,
+                    1,
+                    11,
+                    11,
+                    6
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -8,
+                    -1,
+                    -7,
+                    -2,
+                    -3,
+                    6,
+                    9,
+                    9,
+                    -9,
+                    14,
+                    7,
+                    -7,
+                    0,
+                    -14
+                ],
+                [
+                    5,
+                    2,
+                    5,
+                    1,
+                    12,
+                    10,
+                    11,
+                    7,
+                    14,
+                    4,
+                    10,
+                    8,
+                    12
+                ]
+            ],
+            [
+                [
+                    -5,
+                    -3
+                ],
+                [
+                    7,
+                    1,
+                    10,
+                    14,
+                    2,
+                    8,
+                    5,
+                    9,
+                    1
+                ]
+            ],
+            [
+                [
+                    -4,
+                    13,
+                    8,
+                    4,
+                    -4,
+                    -12,
+                    5,
+                    -12,
+                    12,
+                    7,
+                    -11,
+                    8,
+                    -8
+                ],
+                [
+                    7,
+                    8,
+                    9,
+                    9,
+                    7,
+                    0,
+                    4,
+                    8
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    11,
+                    3,
+                    10,
+                    5
+                ]
+            ],
+            [
+                [
+                    -14,
+                    -4,
+                    14,
+                    -13,
+                    -6,
+                    -12,
+                    5
+                ],
+                [
+                    0,
+                    14,
+                    12
+                ]
+            ],
+            [
+                [
+                    -13,
+                    13,
+                    10,
+                    7,
+                    -3,
+                    -8,
+                    -14,
+                    -10,
+                    11,
+                    6,
+                    12
+                ],
+                [
+                    0,
+                    5
+                ]
+            ],
+            [
+                [
+                    -12,
+                    -8,
+                    2,
+                    0,
+                    2,
+                    -8,
+                    -10,
+                    -9,
+                    3,
+                    8
+                ],
+                [
+                    3,
+                    12,
+                    2
+                ]
+            ],
+            [
+                [
+                    -9,
+                    12,
+                    -5,
+                    14,
+                    0,
+                    -1,
+                    14
+                ],
+                [
+                    14,
+                    7,
+                    0,
+                    6,
+                    10,
+                    6,
+                    10,
+                    6,
+                    7,
+                    12,
+                    13,
+                    4
+                ]
+            ],
+            [
+                [
+                    -6,
+                    -9,
+                    9,
+                    4,
+                    -3,
+                    3,
+                    11,
+                    -14,
+                    8,
+                    -9,
+                    4,
+                    -8,
+                    14,
+                    9
+                ],
+                [
+                    5,
+                    9,
+                    5,
+                    3,
+                    8,
+                    10,
+                    0,
+                    3,
+                    14,
+                    3,
+                    9,
+                    2,
+                    14
+                ]
+            ],
+            [
+                [
+                    -1,
+                    14,
+                    -7,
+                    -13,
+                    0,
+                    14,
+                    3,
+                    8,
+                    -4
+                ],
+                [
+                    2,
+                    7,
+                    12,
+                    4,
+                    4,
+                    10,
+                    0,
+                    14
+                ]
+            ],
+            [
+                [
+                    0,
+                    5,
+                    -4,
+                    -9,
+                    10,
+                    -8
+                ],
+                [
+                    5,
+                    13,
+                    9,
+                    11,
+                    10
+                ]
+            ],
+            [
+                [
+                    1,
+                    7,
+                    -4,
+                    -9,
+                    13,
+                    10,
+                    7,
+                    -11,
+                    -10,
+                    8
+                ],
+                [
+                    2,
+                    11,
+                    3,
+                    13
+                ]
+            ],
+            [
+                [
+                    8,
+                    4,
+                    -8
+                ],
+                [
+                    2,
+                    14,
+                    5,
+                    11
+                ]
+            ],
+            [
+                [
+                    9,
+                    6,
+                    3,
+                    3,
+                    12,
+                    1,
+                    3,
+                    2,
+                    -13,
+                    6,
+                    -7,
+                    0,
+                    -9,
+                    0
+                ],
+                [
+                    8,
+                    8,
+                    3,
+                    4
+                ]
+            ],
+            [
+                [
+                    11,
+                    6,
+                    -14,
+                    -1,
+                    -2,
+                    12,
+                    -12,
+                    -14,
+                    5,
+                    9,
+                    13,
+                    5,
+                    -8,
+                    -4
+                ],
+                [
+                    8,
+                    0,
+                    0,
+                    8
+                ]
+            ],
+            [
+                [
+                    14,
+                    -3,
+                    -7,
+                    -13,
+                    -12,
+                    -6,
+                    5
+                ],
+                [
+                    7,
+                    6,
+                    7,
+                    14,
+                    4,
+                    7,
+                    2,
+                    7,
+                    12
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -8,
+                    -1,
+                    13,
+                    5,
+                    -6,
+                    -6,
+                    3,
+                    -9,
+                    11
+                ],
+                [
+                    7,
+                    2,
+                    8,
+                    7,
+                    6,
+                    12,
+                    3,
+                    5
+                ]
+            ],
+            [
+                [
+                    -1,
+                    14,
+                    -12,
+                    -8,
+                    -2,
+                    -12,
+                    0,
+                    -2,
+                    7,
+                    -7,
+                    -6,
+                    -2,
+                    -11,
+                    -3
+                ],
+                [
+                    0,
+                    4,
+                    6,
+                    5,
+                    1,
+                    2,
+                    2,
+                    9
+                ]
+            ],
+            [
+                [
+                    12,
+                    -6,
+                    -8,
+                    10,
+                    -3,
+                    10,
+                    10,
+                    3,
+                    6
+                ],
+                [
+                    0,
+                    11,
+                    4,
+                    8
+                ]
+            ],
+            [
+                [
+                    13,
+                    10,
+                    10,
+                    13
+                ],
+                [
+                    3,
+                    13,
+                    13,
+                    12,
+                    9,
+                    5,
+                    6,
+                    12,
+                    2,
+                    12,
+                    7
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -4,
+                    -7,
+                    7,
+                    -10,
+                    -8,
+                    7
+                ],
+                [
+                    12,
+                    11,
+                    8,
+                    12,
+                    13,
+                    9,
+                    2,
+                    7
+                ]
+            ],
+            [
+                [
+                    3,
+                    3,
+                    12,
+                    0,
+                    -7,
+                    3,
+                    9,
+                    -2,
+                    11,
+                    -3,
+                    5,
+                    0,
+                    4,
+                    3
+                ],
+                [
+                    7,
+                    3,
+                    10,
+                    9,
+                    7,
+                    10,
+                    11,
+                    4,
+                    5,
+                    12,
+                    6,
+                    4
+                ]
+            ],
+            [
+                [
+                    5
+                ],
+                [
+                    11,
+                    7,
+                    11,
+                    3,
+                    14,
+                    6,
+                    8,
+                    9,
+                    4
+                ]
+            ],
+            [
+                [
+                    10,
+                    -13,
+                    0,
+                    11,
+                    -5
+                ],
+                [
+                    5
+                ]
+            ],
+            [
+                [
+                    14,
+                    14,
+                    -3,
+                    -6
+                ],
+                [
+                    11,
+                    9,
+                    1,
+                    7,
+                    7,
+                    14,
+                    12,
+                    7,
+                    4,
+                    4,
+                    2,
+                    14,
+                    12,
+                    11
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    -13,
+                    -11,
+                    7,
+                    -5,
+                    -9,
+                    0,
+                    3,
+                    12
+                ],
+                [
+                    13,
+                    13,
+                    1,
+                    5,
+                    12,
+                    3
+                ]
+            ],
+            [
+                [
+                    -9,
+                    -3,
+                    7,
+                    -5,
+                    7,
+                    13,
+                    4,
+                    -14,
+                    -12,
+                    5,
+                    13
+                ],
+                [
+                    2,
+                    4,
+                    0,
+                    1,
+                    8,
+                    13
+                ]
+            ],
+            [
+                [
+                    -9,
+                    12,
+                    -8,
+                    10
+                ],
+                [
+                    5,
+                    13,
+                    12,
+                    0
+                ]
+            ],
+            [
+                [
+                    -7,
+                    5,
+                    -5
+                ],
+                [
+                    0
+                ]
+            ],
+            [
+                [
+                    -1,
+                    -1,
+                    5,
+                    8,
+                    -9,
+                    -12,
+                    10,
+                    -1,
+                    -7,
+                    -3,
+                    4,
+                    -2,
+                    -13,
+                    -7
+                ],
+                [
+                    9,
+                    9,
+                    3,
+                    11,
+                    1,
+                    11,
+                    1
+                ]
+            ],
+            [
+                [
+                    0,
+                    6,
+                    13,
+                    -7,
+                    12,
+                    7,
+                    3,
+                    -5,
+                    -9,
+                    -4,
+                    1
+                ],
+                [
+                    3,
+                    3,
+                    14,
+                    14,
+                    12,
+                    2,
+                    3,
+                    6,
+                    14,
+                    14,
+                    4,
+                    14,
+                    12
+                ]
+            ],
+            [
+                [
+                    1,
+                    -14,
+                    10,
+                    -13,
+                    -13,
+                    0,
+                    9,
+                    5,
+                    -6,
+                    -8,
+                    -12,
+                    6,
+                    5
+                ],
+                [
+                    6,
+                    10,
+                    12,
+                    12,
+                    12
+                ]
+            ],
+            [
+                [
+                    1,
+                    12,
+                    2,
+                    -6,
+                    -8,
+                    13,
+                    -4,
+                    -7,
+                    -10,
+                    6,
+                    7,
+                    7,
+                    -8,
+                    -7
+                ],
+                [
+                    5,
+                    9,
+                    8,
+                    8,
+                    8,
+                    5,
+                    3,
+                    4,
+                    13
+                ]
+            ],
+            [
+                [
+                    10,
+                    1
+                ],
+                [
+                    4,
+                    12,
+                    3,
+                    11,
+                    14,
+                    13,
+                    3,
+                    10,
+                    14,
+                    6,
+                    2,
+                    4,
+                    7,
+                    9
+                ]
+            ],
+            [
+                [
+                    12,
+                    2,
+                    -5,
+                    9,
+                    13,
+                    -13,
+                    13,
+                    -7,
+                    4
+                ],
+                [
+                    8,
+                    9
+                ]
+            ],
+            [
+                [
+                    14,
+                    4,
+                    -5,
+                    -11,
+                    -14,
+                    2,
+                    14,
+                    2,
+                    -4
+                ],
+                [
+                    7,
+                    8,
+                    8,
+                    5,
+                    8,
+                    9,
+                    13,
+                    9,
+                    4,
+                    12
+                ]
+            ]
+        ],
+        [
+            [
+                [
+                    4,
+                    13,
+                    0,
+                    -12,
+                    7,
+                    5,
+                    1,
+                    -3,
+                    9,
+                    -4,
+                    6,
+                    -9,
+                    -14
+                ],
+                [
+                    11,
+                    7,
+                    5,
+                    3,
+                    4
+                ]
+            ],
+            [
+                [
+                    5,
+                    -5,
+                    -14,
+                    -4,
+                    14,
+                    10,
+                    -11,
+                    1,
+                    8,
+                    -9
+                ],
+                [
+                    9,
+                    2,
+                    12,
+                    5,
+                    8,
+                    10,
+                    2,
+                    4,
+                    3,
+                    7,
+                    12,
+                    12
+                ]
+            ],
+            [
+                [
+                    9,
+                    3,
+                    -5,
+                    -13,
+                    -6,
+                    11,
+                    4,
+                    -14,
+                    -12,
+                    -8,
+                    -12,
+                    -3,
+                    -8
+                ],
+                [
+                    1,
+                    1,
+                    3,
+                    11,
+                    14,
+                    11,
+                    0,
+                    9
+                ]
+            ],
+            [
+                [
+                    10,
+                    1,
+                    13,
+                    4,
+                    -2,
+                    7,
+                    -9,
+                    4,
+                    11
+                ],
+                [
+                    0,
+                    11,
+                    0,
+                    10,
+                    4,
+                    9,
+                    4,
+                    8
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    1,
+                    9,
+                    11
+                ]
+            ],
+            [
+                [
+                    -9,
+                    0,
+                    -4,
+                    -10,
+                    -3,
+                    9,
+                    -3,
+                    6,
+                    8,
+                    -2
+                ],
+                [
+                    7,
+                    14,
+                    5,
+                    9,
+                    12,
+                    2,
+                    6
+                ]
+            ],
+            [
+                [
+                    -6,
+                    1,
+                    -11,
+                    -7,
+                    -3,
+                    12,
+                    10,
+                    5,
+                    14,
+                    8,
+                    -11
+                ],
+                [
+                    10,
+                    4,
+                    2,
+                    7,
+                    6,
+                    0,
+                    6,
+                    4,
+                    11,
+                    6,
+                    2
+                ]
+            ],
+            [
+                [
+                    -3,
+                    11
+                ],
+                [
+                    14,
+                    0
+                ]
+            ],
+            [
+                [
+                    3,
+                    -6,
+                    4,
+                    2,
+                    -6,
+                    -10,
+                    -13,
+                    0,
+                    9,
+                    8
+                ],
+                [
+                    8,
+                    6,
+                    7,
+                    13,
+                    5,
+                    5,
+                    11,
+                    6,
+                    4
+                ]
+            ],
+            [
+                [
+                    4
+                ],
+                [
+                    13,
+                    4,
+                    5,
+                    1,
+                    11,
+                    2,
+                    5,
+                    13,
+                    4,
+                    4,
+                    14,
+                    12
+                ]
+            ],
+            [
+                [
+                    5,
+                    -14,
+                    11,
+                    5,
+                    8,
+                    0,
+                    13,
+                    6,
+                    10,
+                    2,
+                    -5,
+                    10,
+                    -5
+                ],
+                [
+                    3,
+                    5,
+                    10,
+                    5,
+                    14,
+                    2,
+                    7,
+                    5,
+                    10,
+                    1,
+                    8,
+                    3,
+                    3
+                ]
+            ],
+            [
+                [
+                    5,
+                    0,
+                    -2,
+                    8,
+                    3,
+                    -9,
+                    2
+                ],
+                [
+                    6,
+                    9,
+                    13,
+                    12,
+                    13,
+                    8,
+                    11,
+                    11,
+                    13,
+                    1,
+                    5,
+                    12,
+                    6
+                ]
+            ],
+            [
+                [
+                    9,
+                    8,
+                    8,
+                    -2,
+                    -1,
+                    2,
+                    -6,
+                    -7,
+                    2,
+                    2,
+                    -4,
+                    2,
+                    6,
+                    -13
+                ],
+                [
+                    9,
+                    4,
+                    6,
+                    3,
+                    9,
+                    12,
+                    9,
+                    14,
+                    6,
+                    7,
+                    3,
+                    5
+                ]
+            ],
+            [
+                [
+                    10,
+                    3,
+                    -4,
+                    -6,
+                    0,
+                    2,
+                    8,
+                    -12,
+                    12,
+                    1,
+                    -11,
+                    11
+                ],
+                [
+                    0,
+                    7,
+                    12,
+                    11,
+                    11
+                ]
+            ],
+            [
+                [
+                    12,
+                    8,
+                    14,
+                    10,
+                    11,
+                    11,
+                    6,
+                    1,
+                    8,
+                    2,
+                    -8
+                ],
+                [
+                    11,
+                    12,
+                    4,
+                    10,
+                    7,
+                    0,
+                    5,
+                    8
+                ]
+            ]
+        ],
+        [
+            [
+                [],
+                [
+                    5,
+                    0,
+                    8,
+                    14,
+                    13,
+                    2,
+                    2,
+                    4,
+                    8
+                ]
+            ],
+            [
+                [
+                    -11,
+                    -14,
+                    13,
+                    -4
+                ],
+                [
+                    12,
+                    0,
+                    11,
+                    1,
+                    3,
+                    0,
+                    8,
+                    1,
+                    6
+                ]
+            ],
+            [
+                [
+                    -10,
+                    0,
+                    0
+                ],
+                [
+                    4,
+                    7
+                ]
+            ],
+            [
+                [
+                    -8
+                ],
+                [
+                    10,
+                    5,
+                    14,
+                    5,
+                    1,
+                    4,
+                    4,
+                    3
+                ]
+            ],
+            [
+                [
+                    -1,
+                    1,
+                    4,
+                    -14,
+                    -2,
+                    -12,
+                    11,
+                    4,
+                    -1,
+                    5,
+                    6
+                ],
+                [
+                    13,
+                    11,
+                    10,
+                    12,
+                    8
+                ]
+            ],
+            [
+                [
+                    7,
+                    9,
+                    -6,
+                    -11,
+                    4,
+                    -2,
+                    -12,
+                    -10
+                ],
+                [
+                    9,
+                    14,
+                    2,
+                    6,
+                    13,
+                    12,
+                    5,
+                    5,
+                    9
+                ]
+            ],
+            [
+                [
+                    14,
+                    9,
+                    3,
+                    5,
+                    2,
+                    6,
+                    8,
+                    -11,
+                    -7,
+                    -11,
+                    -11,
+                    4,
+                    3,
+                    10
+                ],
+                [
+                    4,
+                    4,
+                    4,
+                    3,
+                    6,
+                    1,
+                    5,
+                    13,
+                    5,
+                    12,
+                    5,
+                    13,
+                    7
+                ]
+            ]
+        ]
+    ],
+    "seed": -1976800060
+}
diff --git a/monoidmap-aeson.cabal b/monoidmap-aeson.cabal
--- a/monoidmap-aeson.cabal
+++ b/monoidmap-aeson.cabal
@@ -1,6 +1,6 @@
 cabal-version:  3.0
 name:           monoidmap-aeson
-version:        0.0.0.0
+version:        0.0.0.1
 bug-reports:    https://github.com/jonathanknowles/monoidmap-aeson/issues
 license:        Apache-2.0
 license-file:   LICENSE
@@ -14,6 +14,9 @@
 extra-doc-files:
     CHANGELOG.md
     README.md
+
+extra-source-files:
+    golden/*.json
 
 common dependency-aeson
     build-depends:aeson                         >= 2.2.3.0    && < 2.3
