diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -42,5 +42,6 @@
 doc/*.js
 doc/*.png
 doc/*.gif
+doc/*.json
 mk/toplibs
 README.html
diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,8 @@
 # .travis.yml file for LeanCheck
+#
+# Copyright:   (c) 2017-2018 Rudy Matela
+# License:     3-Clause BSD  (see the file LICENSE)
+# Maintainer:  Rudy Matela <rudy@matela.com.br>
 
 language: c  # not really
 
@@ -33,23 +37,35 @@
 - stack --no-terminal --skip-ghc-check test
 
 matrix:
+  allow_failures:
+  - ghc: 'head'
   include:
   - ghc: 'head'
     env:                   GHCVER=head         CABALVER=head
     addons: {apt: {packages: [ghc-head,   cabal-install-head], sources: hvr-ghc}}
+  - ghc: '8.4'
+    env:                   GHCVER=8.4.2        CABALVER=2.2
+    addons: {apt: {packages: [ghc-8.4.2,  cabal-install-2.2],  sources: hvr-ghc}}
   - ghc: '8.2'
-    env:                   GHCVER=8.2.1        CABALVER=2.0
-    addons: {apt: {packages: [ghc-8.2.1,  cabal-install-2.0],  sources: hvr-ghc}}
+    env:                   GHCVER=8.2.2        CABALVER=2.0
+    addons: {apt: {packages: [ghc-8.2.2,  cabal-install-2.0],  sources: hvr-ghc}}
   - ghc: '8.0'
     env:                   GHCVER=8.0.2        CABALVER=1.24
     addons: {apt: {packages: [ghc-8.0.2,  cabal-install-1.24], sources: hvr-ghc}}
   - ghc: '7.10'
     env:                   GHCVER=7.10.3       CABALVER=1.22
     addons: {apt: {packages: [ghc-7.10.3, cabal-install-1.22], sources: hvr-ghc}}
+  # we only support stack with GHC >= 7.10
   - ghc: '7.8'
     env:                   GHCVER=7.8.4        CABALVER=1.18
     addons: {apt: {packages: [ghc-7.8.4,  cabal-install-1.18], sources: hvr-ghc}}
-  # stack is only supported on GHC >= 7.8
+    before_install:
+    - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
+    - ghc --version
+    - cabal --version
+    script:
+    - make GHCFLAGS=-O2 && make test GHCFLAGS=-O2 && make haddock HADDOCKFLAGS=
+    - cabal test
   - ghc: '7.6'
     env:                   GHCVER=7.6.3        CABALVER=1.18
     addons: {apt: {packages: [ghc-7.6.3,  cabal-install-1.18], sources: hvr-ghc}}
@@ -70,3 +86,10 @@
     script:
     - make GHCFLAGS=-O2 && make test GHCFLAGS=-O2 && make haddock HADDOCKFLAGS=
     - cabal test
+  - ghc: 'hugs'
+    env:                   GHCVER=hugs
+    addons: {apt: {packages: [hugs]}}
+    before_install:
+    - echo ":version" | hugs
+    script:
+    - make hugs-test
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2015-2017, Rudy Matela
+Copyright (c) 2015-2018, Rudy Matela
 
 All rights reserved.
 
diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 # Makefile for LeanCheck
 #
-# Copyright:   (c) 2015-2017 Rudy Matela
+# Copyright:   (c) 2015-2018 Rudy Matela
 # License:     3-Clause BSD  (see the file LICENSE)
 # Maintainer:  Rudy Matela <rudy@matela.com.br>
 TESTS = tests/test           \
@@ -25,21 +25,16 @@
 	bench/tiers-listsofpairs \
 	bench/tiers-mixed \
 	bench/tiers
-LISTHS   = find src mk -name \*.hs
-LISTOBJS = $(LISTHS) | sed -e 's/.hs$$/.o/'
-ALLHS    = $(shell $(LISTHS))
-ALLOBJS  = $(shell $(LISTOBJS))
-OBJS = src/Test/LeanCheck.o \
-       src/Test/LeanCheck/Function.o \
-       src/Test/LeanCheck/Error.o
 GHCIMPORTDIRS = src:tests
 # -dynamic is needed only for src/Test/LeanCheck/Derive.hs and tests/test-derive.hs
 GHCFLAGS = -dynamic -O2
 HADDOCKFLAGS = --no-print-missing-docs
+HUGSIMPORTDIRS = .:./src:./tests:./etc/hugs-backports:/usr/lib/hugs/packages/*
+HUGSFLAGS = -98 -h32M
 
-all: $(OBJS)
+all: mk/toplibs
 
-all-all: $(ALLOBJS)
+all-all: mk/All.o
 
 test: $(patsubst %,%.test,$(TESTS)) diff-test
 
@@ -59,20 +54,27 @@
 clean: clean-hi-o clean-haddock
 	rm -f bench/tiers-colistable.hs
 	rm -f bench/tiers-listsofpairs.hs
-	rm -f bench/tiers-funlistable
 	rm -f bench/tiers-funlistable.hs
+	rm -f bench/tiers-mixed.hs
 	rm -f $(TESTS) $(BENCHS) $(EGS) mk/toplibs
 
 ghci: mk/All.ghci
 
-install:
-	@echo "use \`cabal install' instead"
+hugs: src/Test/LeanCheck.hugs
 
-list-hs:
-	$(LISTHS)
+hugs-test: \
+  tests/test-fun.runhugs \
+  tests/test-io.runhugs \
+  tests/test-operators.runhugs \
+  tests/test-stats.runhugs \
+  tests/test-tiers.runhugs \
+  tests/test.runhugs
+# tests/test-error.runhugs    # TODO: make this pass
+# tests/test-funshow.runhugs  # TODO: make this pass
+# tests/test-types.runhugs    # TODO: make this pass
 
-list-objs:
-	$(LISTOBJS)
+install:
+	@echo "use \`cabal install' instead"
 
 test-sdist:
 	./tests/test-sdist
@@ -80,14 +82,16 @@
 test-via-stack:
 	stack test
 
-legacy-test: # needs ghc-8.0 .. ghc-7.8 installed as such
+legacy-test: # needs ghc-8.2 .. ghc-7.8 installed as such
+	make clean  &&  make test GHC=ghc-8.2  GHCFLAGS="-Werror -dynamic"
 	make clean  &&  make test GHC=ghc-8.0  GHCFLAGS="-Werror -dynamic"
 	make clean  &&  make test GHC=ghc-7.10 GHCFLAGS="-Werror -dynamic"
 	make clean  &&  make test GHC=ghc-7.8  GHCFLAGS="-Werror -dynamic"
 	make clean  &&  make test
 
 legacy-test-via-cabal: # needs similarly named cabal wrappers
-	cabal clean  &&  cabal-ghc-8.0  configure  &&  cabal-ghc-7.10 test
+	cabal clean  &&  cabal-ghc-8.2  configure  &&  cabal-ghc-8.2  test
+	cabal clean  &&  cabal-ghc-8.0  configure  &&  cabal-ghc-8.0  test
 	cabal clean  &&  cabal-ghc-7.10 configure  &&  cabal-ghc-7.10 test
 	cabal clean  &&  cabal-ghc-7.8  configure  &&  cabal-ghc-7.8  test
 	cabal clean  &&  cabal test
@@ -103,25 +107,6 @@
 	pandoc doc/tutorial.md -o doc/tutorial.html
 	pandoc doc/data-invariant.md -o doc/data-invariant.html
 
-haddock: doc/index.html
-
-clean-haddock:
-	rm -f doc/*.{html,css,js,png,gif} README.html
-
-upload-haddock:
-	@echo "use \`cabal upload -d' instead"
-	@echo "(but 1st: cabal install --only-dependencies --enable-documentation)"
-	@echo "(to just compile docs: cabal haddock --for-hackage)"
-	@echo "(on Arch Linux, use: cabal haddock --for-hackage --haddock-options=--optghc=-dynamic)"
-
-doc/index.html: $(ALLHS)
-	./mk/haddock-i base template-haskell | xargs \
-	haddock --html -odoc $(ALLHS) $(HADDOCKFLAGS) --title=leancheck
-	@echo 'NOTE: please ensure that there are *only* 7'
-	@echo '      undocumented functions on Test.LeanCheck'
-	@echo '      as "OPTIONS_HADDOCK prune" is active'
-	@echo '      to hide cons6...cons12'
-
 # NOTE: (very hacky!) the following target allows parallel compilation (-jN) of
 # eg and tests programs so long as they don't share dependencies _not_ stored
 # in src/ and tests/.  Runnable binaries should depend on mk/toplibs instead of
@@ -169,6 +154,11 @@
 	./bench/tiers "NoDup Nat"        | diff -rud tests/diff/tiers-NoDupNat.out    -
 	./bench/tiers "NoDup Nat2"       | diff -rud tests/diff/tiers-NoDupNat2.out   -
 	./bench/tiers "NoDup Nat3"       | diff -rud tests/diff/tiers-NoDupNat3.out   -
+	./bench/tiers "Map Bool Bool"    | diff -rud tests/diff/tiers-MapBoolBool.out -
+	./bench/tiers "Map () ()"        | diff -rud tests/diff/tiers-MapUU.out       -
+	./bench/tiers "Map Nat Nat"      | diff -rud tests/diff/tiers-MapNatNat.out   -
+	./bench/tiers "Map Nat2 Nat2"    | diff -rud tests/diff/tiers-MapNat2Nat2.out -
+	./bench/tiers "Map Nat3 Nat3"    | diff -rud tests/diff/tiers-MapNat3Nat3.out -
 
 update-diff-test-tiers: bench/tiers
 	# simple types
@@ -208,6 +198,11 @@
 	./bench/tiers "NoDup Nat"        > tests/diff/tiers-NoDupNat.out
 	./bench/tiers "NoDup Nat2"       > tests/diff/tiers-NoDupNat2.out
 	./bench/tiers "NoDup Nat3"       > tests/diff/tiers-NoDupNat3.out
+	./bench/tiers "Map Bool Bool"    > tests/diff/tiers-MapBoolBool.out
+	./bench/tiers "Map () ()"        > tests/diff/tiers-MapUU.out
+	./bench/tiers "Map Nat Nat"      > tests/diff/tiers-MapNatNat.out
+	./bench/tiers "Map Nat2 Nat2"    > tests/diff/tiers-MapNat2Nat2.out
+	./bench/tiers "Map Nat3 Nat3"    > tests/diff/tiers-MapNat3Nat3.out
 
 prepare-depend: bench/tiers-listsofpairs.hs \
                 bench/tiers-colistable.hs \
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -153,6 +153,8 @@
 [tutorial on property-based testing with LeanCheck]
 \(`doc/tutorial.md` in the source repository).
 
+LeanCheck is subject to a chapter in a [PhD Thesis (2017)].
+
 [LeanCheck's Haddock documentation]: https://hackage.haskell.org/package/leancheck/docs/Test-LeanCheck.html
 [tutorial on property-based testing with LeanCheck]: https://github.com/rudymatela/leancheck/blob/master/doc/tutorial.md
 
@@ -171,6 +173,7 @@
 [Feat]: https://hackage.haskell.org/package/testing-feat
 [SmallCheck]: https://hackage.haskell.org/package/smallcheck
 [QuickCheck]: https://hackage.haskell.org/package/QuickCheck
+[PhD Thesis (2017)]: https://matela.com.br/paper/rudy-phd-thesis-2017.pdf
 
 [symbol `>`]: https://www.haskell.org/haddock/doc/html/ch03s08.html#idm140354810780208
 
diff --git a/TODO.md b/TODO.md
--- a/TODO.md
+++ b/TODO.md
@@ -7,11 +7,6 @@
 misc
 ----
 
-* improve `mk/haskell.mk`: pass ALLHS and LIBHS instead of HSS
-  By making that distinction, haskell.mk will be able to handle Haddock.
-  It will also be clearer what each parameter means.
-  Note that ALLHS and LIBHS are not (but could be) the final names.
-
 * parameterize number of tests in test programs and add slow-test target
 
 
@@ -26,7 +21,7 @@
 other improvements
 ------------------
 
-* implement `classStatsT` and `conditionStatsT`
+* implement `conditionStatsT` (see `classStatsT`)
 
 
 later
diff --git a/bench/tiers.hs b/bench/tiers.hs
--- a/bench/tiers.hs
+++ b/bench/tiers.hs
@@ -1,6 +1,6 @@
 -- tiers.hs -- prints tiers of values up to a certain point
 --
--- Copyright (c) 2015-2017 Rudy Matela.
+-- Copyright (c) 2015-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 import Test.LeanCheck
 import Test.LeanCheck.Utils.Types
@@ -50,9 +50,6 @@
 
 put :: (Show a, Eq a, Listable a) => String -> Int -> a -> IO ()
 put t n a = do
-  putStrLn $ "tiers :: [" ++ t ++ "]  ="
-  printTiers n $ tiers `asTypeOf` [[a]]
-  putStrLn $ ""
   putStrLn $ "map length (tiers :: [[ " ++ t ++ " ]])  =  "
           ++ showDotsLongerThan n (map length $ tiers `asTypeOf` [[a]])
   putStrLn $ ""
@@ -64,6 +61,9 @@
   putStrLn $ ""
   putStrLn $ "ratioRepetitions (list :: [ " ++ t ++ " ])  =  "
           ++ show (ratioRepetitions . concat . take n $ tiers `asTypeOf` [[a]])
+  putStrLn $ ""
+  putStrLn $ "tiers :: [" ++ t ++ "]  ="
+  printTiers n $ tiers `asTypeOf` [[a]]
 
 u :: a
 u = undefined
@@ -105,6 +105,8 @@
     "([()],[()])"      -> put t n (u :: ([()],[()])          )
     "([Bool],[Bool])"  -> put t n (u :: ([Bool],[Bool])      )
     "([Int],[Int])"    -> put t n (u :: ([Int],[Int])        )
+    -- lists of lists
+    "[[Int]]"          -> put t n (u :: [[Int]]              )
     -- functions
     "()->()"           -> put t n (u :: () -> ()             )
     "()->Bool"         -> put t n (u :: () -> Bool           )
@@ -149,5 +151,10 @@
     "NoDup Nat"        -> put t n (u :: NoDup Nat            )
     "NoDup Nat2"       -> put t n (u :: NoDup Nat2           )
     "NoDup Nat3"       -> put t n (u :: NoDup Nat3           )
+    "Map Bool Bool"    -> put t n (u :: Map Bool Bool        )
+    "Map () ()"        -> put t n (u :: Map () ()            )
+    "Map Nat Nat"      -> put t n (u :: Map Nat Nat          )
+    "Map Nat2 Nat2"    -> put t n (u :: Map Nat2 Nat2        )
+    "Map Nat3 Nat3"    -> put t n (u :: Map Nat3 Nat3        )
     -- unhandled
     _                  -> putStrLn $ "unknown/unhandled type `" ++ t ++ "'"
diff --git a/eg/test-bool.hs b/eg/test-bool.hs
--- a/eg/test-bool.hs
+++ b/eg/test-bool.hs
@@ -1,6 +1,6 @@
 -- test-bool.hs -- example program, testing Bool fns using LeanCheck
 --
--- Copyright (c) 2017 Rudy Matela.
+-- Copyright (c) 2017-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 import Test.LeanCheck
 import Test.LeanCheck.Function
diff --git a/eg/test-list.hs b/eg/test-list.hs
--- a/eg/test-list.hs
+++ b/eg/test-list.hs
@@ -1,6 +1,6 @@
 -- test-list.hs -- example program, testing Data.List using LeanCheck
 --
--- Copyright (c) 2017 Rudy Matela.
+-- Copyright (c) 2017-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 import Test.LeanCheck
 import Data.List
diff --git a/eg/test-sort.hs b/eg/test-sort.hs
--- a/eg/test-sort.hs
+++ b/eg/test-sort.hs
@@ -1,6 +1,6 @@
 -- test-sort.hs -- example program, testing sort using LeanCheck
 --
--- Copyright (c) 2017 Rudy Matela.
+-- Copyright (c) 2017-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 import Test.LeanCheck
 
diff --git a/leancheck.cabal b/leancheck.cabal
--- a/leancheck.cabal
+++ b/leancheck.cabal
@@ -11,7 +11,7 @@
 -- this cabal file too complicated.  -- Rudy
 
 name:                leancheck
-version:             0.7.0
+version:             0.7.1
 synopsis:            Cholesterol-free property-based testing
 description:
   LeanCheck is a simple enumerative property-based testing library.
@@ -33,7 +33,7 @@
 maintainer:          Rudy Matela <rudy@matela.com.br>
 category:            Testing
 build-type:          Simple
-cabal-version:       >=1.18
+cabal-version:       1.18
 
 extra-doc-files: README.md
                , CREDITS.md
@@ -59,7 +59,7 @@
                   , mk/Toplibs.hs
                   , tests/diff/*.out
                   , tests/diff/eg/*.out
-tested-with: GHC==8.2, GHC==8.0, GHC==7.10, GHC==7.8, GHC==7.6, GHC==7.4
+tested-with: GHC==8.4, GHC==8.2, GHC==8.0, GHC==7.10, GHC==7.8, GHC==7.6, GHC==7.4
 
 
 source-repository head
@@ -69,7 +69,7 @@
 source-repository this
   type:            git
   location:        https://github.com/rudymatela/leancheck
-  tag:             v0.7.0
+  tag:             v0.7.1
 
 library
   exposed-modules: Test.LeanCheck
diff --git a/mk/depend.mk b/mk/depend.mk
--- a/mk/depend.mk
+++ b/mk/depend.mk
@@ -182,6 +182,8 @@
   src/Test/LeanCheck/Core.hs \
   src/Test/LeanCheck/Basic.hs \
   eg/test-sort.hs
+etc/hugs-backports/Data/Function.o: \
+  etc/hugs-backports/Data/Function.hs
 mk/All.o: \
   src/Test/LeanCheck/Utils/Types.hs \
   src/Test/LeanCheck/Utils/TypeBinding.hs \
@@ -215,6 +217,11 @@
   src/Test/LeanCheck/Core.hs \
   src/Test/LeanCheck/Basic.hs \
   mk/Toplibs.hs
+Setup.o: \
+  Setup.hs
+Setup: \
+  Setup.hs \
+  mk/toplibs
 src/Test/LeanCheck/Basic.o: \
   src/Test/LeanCheck/Core.hs \
   src/Test/LeanCheck/Basic.hs
diff --git a/mk/ghcdeps b/mk/ghcdeps
--- a/mk/ghcdeps
+++ b/mk/ghcdeps
@@ -2,7 +2,7 @@
 #
 # ghcdeps: generate Haskell make dependencies for compiling with GHC.
 #
-# Copyright (c) 2015-2017 Rudy Matela.
+# Copyright (c) 2015-2018 Rudy Matela.
 # Distributed under the 3-Clause BSD licence.
 #
 # From a list of files provided on standard input,
diff --git a/mk/haddock-i b/mk/haddock-i
--- a/mk/haddock-i
+++ b/mk/haddock-i
@@ -2,7 +2,7 @@
 #
 # haddock-i: list haddock's -i parameters.
 #
-# Copyright (c) 2015-2017 Rudy Matela.
+# Copyright (c) 2015-2018 Rudy Matela.
 # Distributed under the 3-Clause BSD licence.
 #
 # $ haddock-i <package1> <package2> ... <packageN>
diff --git a/mk/haskell.mk b/mk/haskell.mk
--- a/mk/haskell.mk
+++ b/mk/haskell.mk
@@ -1,6 +1,6 @@
 # Implicit rules for compiling Haskell code.
 #
-# Copyright (c) 2015-2017 Rudy Matela.
+# Copyright (c) 2015-2018 Rudy Matela.
 # Distributed under the 3-Clause BSD licence.
 #
 # You can optionally configure the "Configuration variables" below in your main
@@ -19,24 +19,34 @@
 GHCIMPORTDIRS ?=
 GHCFLAGS ?=
 GHC ?= ghc
+GHCCMD = $(GHC) -i$(GHCIMPORTDIRS) $(GHCFLAGS)
 
+# Hugs Parameters
+HUGSIMPORTDIRS ?= "/usr/lib/hugs/packages/*"
+HUGSFLAGS ?=
+CPPHS_HUGS ?= cpphs-hugs --noline -D__HUGS__
+HUGS ?= hugs
+RUNHUGS ?= runhugs
+HUGSCMD    = $(HUGS)    -F"$(CPPHS_HUGS)" -P$(HUGSIMPORTDIRS) $(HUGSFLAGS)
+RUNHUGSCMD = $(RUNHUGS) -F"$(CPPHS_HUGS)" -P$(HUGSIMPORTDIRS) $(HUGSFLAGS)
+
+
 # Makefile where to keep the dependencies
 DEPMK ?= mk/depend.mk
 
-# By default, excludes dist and Setup.hs, so that a Makefile can coexist nicely
-# in a cabalized project.  Also excludes .stack-work.
-HSS ?= $(shell find \( -path "./dist" -o -path "./Setup.hs" -o -path "./.stack-work" \) -prune \
-                 -o -name "*.*hs" -print)
-# You can override HSS in your main Makefile
-# It should include all Haskell sources to be compiled by different targets
-# (even those that are not a dependency to all)
-# It will be used to generate dependencies and for cleaning objects
+# LIB_HSS: all library Haskell files
+# ALL_HSS: all Haskell files
+# You can override ALL/LIB_HSS in your main Makefile
+LIST_LIB_HSS ?= find src -name "*.hs"
+LIST_ALL_HSS ?= find \( -path "./dist" -o -path "./.stack-work" \) -prune \
+                     -o -name "*.*hs" -print
+LIB_HSS ?= $(shell $(LIST_LIB_HSS))
+ALL_HSS ?= $(shell $(LIST_ALL_HSS))
 
+PKGNAME = $(shell cat *.cabal | grep "^name:"    | sed -e "s/name: *//")
 
 
 # Implicit rules
-GHCCMD = $(GHC) -i$(GHCIMPORTDIRS) $(GHCFLAGS)
-
 %.hi %.o: %.hs
 	$(GHCCMD) $< && touch $@
 
@@ -47,19 +57,54 @@
 %.ghci: %.hs
 	$(GHCCMD) -O0 --interactive $<
 
+.PHONY: %.hugs
+%.hugs: %.hs
+	$(HUGSCMD) $<
 
+.PHONY: %.runhugs
+%.runhugs: %.hs
+	$(RUNHUGSCMD) $<
+
+
 # Cleaning rule (add as a clean dependency)
 .PHONY: clean-hi-o
 clean-hi-o:
-	find $(HSS) | sed -e 's/hs$$/o/'      | xargs rm -f
-	find $(HSS) | sed -e 's/hs$$/hi/'     | xargs rm -f
-	find $(HSS) | sed -e 's/hs$$/dyn_o/'  | xargs rm -f
-	find $(HSS) | sed -e 's/hs$$/dyn_hi/' | xargs rm -f
+	find $(ALL_HSS) | sed -e 's/hs$$/o/'      | xargs rm -f
+	find $(ALL_HSS) | sed -e 's/hs$$/hi/'     | xargs rm -f
+	find $(ALL_HSS) | sed -e 's/hs$$/dyn_o/'  | xargs rm -f
+	find $(ALL_HSS) | sed -e 's/hs$$/dyn_hi/' | xargs rm -f
 
 
 # Update dependency file
 .PHONY: depend
 depend:
-	find $(HSS) | ./mk/ghcdeps -i$(GHCIMPORTDIRS) $(GHCFLAGS) > $(DEPMK)
+	find $(ALL_HSS) | ./mk/ghcdeps -i$(GHCIMPORTDIRS) $(GHCFLAGS) > $(DEPMK)
+
+# haddock rules
+haddock: doc/index.html
+
+clean-haddock:
+	rm -f doc/*.{html,css,js,png,gif,json} README.html
+
+upload-haddock:
+	@echo "use \`cabal upload -d' instead"
+	@echo "(but 1st: cabal install --only-dependencies --enable-documentation)"
+	@echo "(to just compile docs: cabal haddock --for-hackage)"
+	@echo "(on Arch Linux, use: cabal haddock --for-hackage --haddock-options=--optghc=-dynamic)"
+
+doc/index.html: $(LIB_HSS)
+	./mk/haddock-i base template-haskell | xargs \
+	haddock --html -odoc $(LIB_HSS) $(HADDOCKFLAGS) --title=$(PKGNAME)
+
+# lists all Haskell source files
+list-all-hss:
+	@find $(ALL_HSS)
+
+# lists library Haskell source files
+list-lib-hss:
+	@find $(LIB_HSS)
+
+show-pkgname:
+	@echo $(PKGNAME)
 
 include $(DEPMK)
diff --git a/src/Test/LeanCheck.hs b/src/Test/LeanCheck.hs
--- a/src/Test/LeanCheck.hs
+++ b/src/Test/LeanCheck.hs
@@ -1,7 +1,7 @@
 {-# OPTIONS_HADDOCK prune #-}
 -- |
 -- Module      : Test.LeanCheck
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
@@ -102,6 +102,7 @@
   , setCons
   , bagCons
   , noDupListCons
+  , mapCons
 
   -- ** Products of tiers
   , product3With
diff --git a/src/Test/LeanCheck/Basic.hs b/src/Test/LeanCheck/Basic.hs
--- a/src/Test/LeanCheck/Basic.hs
+++ b/src/Test/LeanCheck/Basic.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Basic
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Core.hs b/src/Test/LeanCheck/Core.hs
--- a/src/Test/LeanCheck/Core.hs
+++ b/src/Test/LeanCheck/Core.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Core
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Derive.hs b/src/Test/LeanCheck/Derive.hs
--- a/src/Test/LeanCheck/Derive.hs
+++ b/src/Test/LeanCheck/Derive.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE TemplateHaskell, CPP #-}
 -- |
 -- Module      : Test.LeanCheck.Derive
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
@@ -11,7 +11,7 @@
 -- This is an experimental module for deriving 'Listable' instances.
 --
 -- Needs GHC and Template Haskell
--- (tested on GHC 7.4, 7.6, 7.8, 7.10 and 8.0).
+-- (tested on GHC 7.4, 7.6, 7.8, 7.10, 8.0, 8.2 and 8.4).
 --
 -- If LeanCheck does not compile under later GHCs, this module is probably the
 -- culprit.
@@ -24,6 +24,8 @@
   )
 where
 
+#ifdef __GLASGOW_HASKELL__
+
 import Language.Haskell.TH
 import Test.LeanCheck.Basic
 import Control.Monad (unless, liftM, liftM2, filterM)
@@ -297,3 +299,27 @@
 
 nubMerges :: Ord a => [[a]] -> [a]
 nubMerges = foldr nubMerge []
+
+#else
+-- When using Hugs or other compiler without Template Haskell
+
+errorNotGHC :: a
+errorNotGHC = error "Only defined when using GHC"
+
+deriveListable :: a
+deriveListable = errorNotGHC
+
+deriveListableIfNeeded :: a
+deriveListableIfNeeded = errorNotGHC
+
+deriveListableCascading :: a
+deriveListableCascading = errorNotGHC
+
+deriveTiers :: a
+deriveTiers = errorNotGHC
+
+deriveList :: a
+deriveList = errorNotGHC
+
+-- closing #ifdef __GLASGOW_HASKELL__
+#endif
diff --git a/src/Test/LeanCheck/Error.hs b/src/Test/LeanCheck/Error.hs
--- a/src/Test/LeanCheck/Error.hs
+++ b/src/Test/LeanCheck/Error.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Error
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Function.hs b/src/Test/LeanCheck/Function.hs
--- a/src/Test/LeanCheck/Function.hs
+++ b/src/Test/LeanCheck/Function.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Function
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Function/CoListable.hs b/src/Test/LeanCheck/Function/CoListable.hs
--- a/src/Test/LeanCheck/Function/CoListable.hs
+++ b/src/Test/LeanCheck/Function/CoListable.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Function.CoListable
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Function/Eq.hs b/src/Test/LeanCheck/Function/Eq.hs
--- a/src/Test/LeanCheck/Function/Eq.hs
+++ b/src/Test/LeanCheck/Function/Eq.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Function.Eq
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Function/Listable.hs b/src/Test/LeanCheck/Function/Listable.hs
--- a/src/Test/LeanCheck/Function/Listable.hs
+++ b/src/Test/LeanCheck/Function/Listable.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Function.Listable
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Function/Listable/CoListable.hs b/src/Test/LeanCheck/Function/Listable/CoListable.hs
--- a/src/Test/LeanCheck/Function/Listable/CoListable.hs
+++ b/src/Test/LeanCheck/Function/Listable/CoListable.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Function.Listable.CoListable
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Function/Listable/FunListable.hs b/src/Test/LeanCheck/Function/Listable/FunListable.hs
--- a/src/Test/LeanCheck/Function/Listable/FunListable.hs
+++ b/src/Test/LeanCheck/Function/Listable/FunListable.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.FunListable
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Function/Listable/ListsOfPairs.hs b/src/Test/LeanCheck/Function/Listable/ListsOfPairs.hs
--- a/src/Test/LeanCheck/Function/Listable/ListsOfPairs.hs
+++ b/src/Test/LeanCheck/Function/Listable/ListsOfPairs.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Function.ListsOfPairs
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Function/Listable/Mixed.hs b/src/Test/LeanCheck/Function/Listable/Mixed.hs
--- a/src/Test/LeanCheck/Function/Listable/Mixed.hs
+++ b/src/Test/LeanCheck/Function/Listable/Mixed.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Function.Mixed
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Function/Listable/Periodic.hs b/src/Test/LeanCheck/Function/Listable/Periodic.hs
--- a/src/Test/LeanCheck/Function/Listable/Periodic.hs
+++ b/src/Test/LeanCheck/Function/Listable/Periodic.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Function.Periodic
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Function/ListsOfPairs.hs b/src/Test/LeanCheck/Function/ListsOfPairs.hs
--- a/src/Test/LeanCheck/Function/ListsOfPairs.hs
+++ b/src/Test/LeanCheck/Function/ListsOfPairs.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Function.ListsOfPairs
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
@@ -43,15 +43,15 @@
 -- they represent exceptions to a constant function,
 -- hence the name 'exceptionPairs'.
 exceptionPairs :: [[a]] -> [[b]] -> [[ [(a,b)] ]]
-exceptionPairs xss yss = concatMapT (`excep` yss) (incompleteSetsOf xss)
+exceptionPairs xss yss = concatMapT exceptionsFor (incompleteSetsOf xss)
   where
-  excep :: [a] -> [[b]] -> [[ [(a,b)] ]]
-  excep xs sbs = zip xs `mapT` products (const sbs `map` xs)
+--exceptionsFor :: [a] -> [[ [(a,b)] ]]
+  exceptionsFor xs = zip xs `mapT` products (const yss `map` xs)
 -- incompleteSetsOf is needed, instead of setsOf, because mutating *all* values
 -- of a constant function makes no sense (we would have already enumerated that
 -- function anyway).  As of 2c23c1a, it makes no difference whether
 -- incompleteSetsOf is used instead of setsOf for types with less than 12
--- values.
+-- values because of the finite guard on `-->>`.
 
 -- | Returns tiers of sets excluding the universe set.
 --
diff --git a/src/Test/LeanCheck/Function/Show.hs b/src/Test/LeanCheck/Function/Show.hs
--- a/src/Test/LeanCheck/Function/Show.hs
+++ b/src/Test/LeanCheck/Function/Show.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Function.Show
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Function/ShowFunction.hs b/src/Test/LeanCheck/Function/ShowFunction.hs
--- a/src/Test/LeanCheck/Function/ShowFunction.hs
+++ b/src/Test/LeanCheck/Function/ShowFunction.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Function.ShowFunction
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/IO.hs b/src/Test/LeanCheck/IO.hs
--- a/src/Test/LeanCheck/IO.hs
+++ b/src/Test/LeanCheck/IO.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.IO
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
@@ -24,7 +24,13 @@
 import Test.LeanCheck.Core
 import Data.Maybe (listToMaybe)
 import Data.List (find)
+#ifdef __GLASGOW_HASKELL__
 import Control.Exception (SomeException, catch, evaluate)
+#else
+-- on Hugs
+import Control.Exception (Exception, catch, evaluate)
+type SomeException = Exception
+#endif
 
 -- | Checks a property printing results on 'stdout'
 --
@@ -69,8 +75,8 @@
             | Exception Int [String] String
   deriving (Eq, Show)
 
-resultsIO :: Testable a => Int -> a -> IO [Result]
-resultsIO n = sequence . zipWith torio [1..] . take n . results
+resultsIO :: Testable a => Int -> a -> [IO Result]
+resultsIO n = zipWith torio [1..] . take n . results
   where
     tor i (_,True) = OK i
     tor i (as,False) = Falsified i as
@@ -79,12 +85,13 @@
                      in return (Exception i as (show e))
 
 resultIO :: Testable a => Int -> a -> IO Result
-resultIO n p = do
-  rs <- resultsIO n p
-  return . maybe (last rs) id
-         $ find isFailure rs
-  where isFailure (OK _) = False
-        isFailure _      = True
+resultIO n = computeResult . resultsIO n
+  where
+  computeResult []  = error "resultIO: no results, empty Listable enumeration?"
+  computeResult [r] = r
+  computeResult (r:rs) = r >>= \r -> case r of
+                                     (OK _) -> computeResult rs
+                                     _      -> return r
 
 showResult :: Int -> Result -> String
 showResult m (OK n)             = "+++ OK, passed " ++ show n ++ " tests"
diff --git a/src/Test/LeanCheck/Stats.hs b/src/Test/LeanCheck/Stats.hs
--- a/src/Test/LeanCheck/Stats.hs
+++ b/src/Test/LeanCheck/Stats.hs
@@ -1,6 +1,7 @@
+{-# LANGUAGE CPP #-}
 -- |
 -- Module      : Test.LeanCheck.Stats
--- Copyright   : (c) 2017 Rudy Matela
+-- Copyright   : (c) 2017-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
@@ -25,8 +26,23 @@
 
 import Test.LeanCheck.Core
 import Data.Function (on)
+#ifndef __HUGS__
 import Data.List (intercalate, transpose)
+#else
+import Data.List (transpose)
 
+intercalate :: [a] -> [[a]] -> [a]
+intercalate xs xss = concat (intersperse xs xss)
+  where
+  intersperse             :: a -> [a] -> [a]
+  intersperse _   []      = []
+  intersperse sep (x:xs)  = x : prependToAll sep xs
+    where
+    prependToAll            :: a -> [a] -> [a]
+    prependToAll _   []     = []
+    prependToAll sep (x:xs) = sep : x : prependToAll sep xs
+#endif
+
 classStats :: (Listable a, Show b) => Int -> (a -> b) -> IO ()
 classStats n f = putStrLn
                . table " "
@@ -40,9 +56,21 @@
                     , show (100 * n `div` len) ++ "%"
                     ]
 
--- TODO: implement this
 classStatsT :: (Listable a, Show b) => Int -> (a -> b) -> IO ()
-classStatsT = error "classStatsT: not implemented yet, use classStats for now"
+classStatsT n f = putStrLn
+                . table "  "
+                . (heading:)
+                . ([" "]:)
+                . map showCounts
+                . prependTotal
+                . countsTOn (unquote . show . f)
+                $ take n tiers
+  where
+  heading = "" : "tot " : map show [0..(n-1)]
+  showCounts (s,n,ns) = (s ++ ":") : (show n ++ " ") : map show ns
+  (_,n,ns) -+- (_,n',ns') = ("tot", n + n', zipWith (+) ns ns')
+  totalizeCounts = foldr (-+-) (undefined, 0, repeat 0)
+  prependTotal cs = totalizeCounts cs : cs
 
 conditionStats :: Listable a => Int -> [(String,a->Bool)] -> IO ()
 conditionStats n = putStrLn . table " " . map show1
@@ -57,7 +85,7 @@
 
 -- TODO: implement this
 conditionStatsT :: Listable a => Int -> [(String,a->Bool)] -> IO ()
-conditionStatsT = error "conditionsStatsT: not implemented yet, use classStats for now"
+conditionStatsT = error "conditionsStatsT: not implemented yet, use conditionStats for now"
 
 classify :: Eq a => [a] -> [[a]]
 classify = classifyBy (==)
@@ -82,6 +110,14 @@
 
 countsOn :: Eq b => (a -> b) -> [a] -> [(b,Int)]
 countsOn f = map (\xs -> (f $ head xs, length xs)) . classifyOn f
+
+countsT :: Eq a => [[a]] -> [(a,Int,[Int])]
+countsT xss = [(x,n,map (count x) xss) | (x,n) <- counts (concat xss)]
+  where
+  count x = length . filter (== x)
+
+countsTOn :: Eq b => (a -> b) -> [[a]] -> [(b,Int,[Int])]
+countsTOn f = countsT . mapT f
 
 headLength :: [a] -> (a,Int)
 headLength xs = (head xs, length xs)
diff --git a/src/Test/LeanCheck/Tiers.hs b/src/Test/LeanCheck/Tiers.hs
--- a/src/Test/LeanCheck/Tiers.hs
+++ b/src/Test/LeanCheck/Tiers.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Tiers
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
@@ -18,6 +18,7 @@
     listCons
   , setCons
   , bagCons
+  , mapCons
   , noDupListCons
 
   , maybeCons0
@@ -35,6 +36,7 @@
   , setsOf
   , noDupListsOf
   , products
+  , maps
   , listsOfLength
 
   -- * Tiers of pairs
@@ -108,6 +110,19 @@
 setCons :: Listable a => ([a] -> b) -> [[b]]
 setCons = (`mapT` setsOf tiers)
 
+-- | Given a constructor that takes a map of elements (encoded as a list),
+--   lists tiers of applications of this constructor
+--
+--   So long as the underlying 'Listable' enumerations have no repetitions,
+--   this will generate no repetitions.
+--
+--   This allows defining an efficient implementation of `tiers` that does not
+--   repeat maps given by:
+--
+--   >   tiers = mapCons fromList
+mapCons :: (Listable a, Listable b) => ([(a,b)] -> c) -> [[c]]
+mapCons = (`mapT` maps tiers tiers)
+
 -- | Given a constructor that takes a list with no duplicate elements,
 --   return tiers of applications of this constructor.
 noDupListCons :: Listable a => ([a] -> b) -> [[b]]
@@ -355,6 +370,15 @@
 -- >   tiers = mapT fromList $ setsOf tiers
 setsOf :: [[a]] -> [[[a]]]
 setsOf = ([[]]:) . concatT . setChoicesWith (\x xss -> mapT (x:) (setsOf xss))
+
+-- | Takes as arguments tiers of source and target values;
+--   returns tiers of maps from the source to the target encoded as lists
+--   without repetition.
+maps :: [[a]] -> [[b]] -> [[[(a,b)]]]
+maps xss yss = concatMapT mapsFor (setsOf xss)
+  where
+--mapsFor :: [a] -> [[ [(a,b)] ]]
+  mapsFor xs = zip xs `mapT` products (const yss `map` xs)
 
 -- | Lists tiers of choices.
 -- Choices are pairs of values and tiers excluding that value.
diff --git a/src/Test/LeanCheck/Utils.hs b/src/Test/LeanCheck/Utils.hs
--- a/src/Test/LeanCheck/Utils.hs
+++ b/src/Test/LeanCheck/Utils.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Utils
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
diff --git a/src/Test/LeanCheck/Utils/Operators.hs b/src/Test/LeanCheck/Utils/Operators.hs
--- a/src/Test/LeanCheck/Utils/Operators.hs
+++ b/src/Test/LeanCheck/Utils/Operators.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Utils.Operators
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
@@ -52,6 +52,7 @@
   , okEq
   , okOrd
   , okEqOrd
+  , okNum
   )
 where
 
@@ -228,6 +229,20 @@
 okEqOrd x y z = okEq  x y z
              && okOrd x y z
              && (x == y) == (x `compare` y == EQ) -- consistent instances
+
+okNum :: (Eq a, Num a) => a -> a -> a -> Bool
+okNum x y z  =  commutative (+) x y
+             && commutative (*) x y
+             && associative (+) x y z
+             && associative (*) x y z
+             && distributive (*) (+) x y z
+             && idempotent (+0) x
+             && idempotent (*1) x
+             && idempotent abs x
+             && idempotent signum x
+             && negate (negate x) == x
+             && abs x * signum x == x
+             && x - x == 0
 
 -- | Equal under, a ternary operator with the same fixity as '=='.
 --
diff --git a/src/Test/LeanCheck/Utils/TypeBinding.hs b/src/Test/LeanCheck/Utils/TypeBinding.hs
--- a/src/Test/LeanCheck/Utils/TypeBinding.hs
+++ b/src/Test/LeanCheck/Utils/TypeBinding.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Utils.TypeBinding
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
@@ -91,6 +91,7 @@
   , bool
   , int, integer
   , float, double
+  , rational
   , char, string
   , ordering
   , mayb, eith
@@ -281,6 +282,9 @@
 
 double :: Double
 double = undefinedOf "double"
+
+rational :: Rational
+rational = undefinedOf "rational"
 
 bool :: Bool
 bool = undefinedOf "bool"
diff --git a/src/Test/LeanCheck/Utils/Types.hs b/src/Test/LeanCheck/Utils/Types.hs
--- a/src/Test/LeanCheck/Utils/Types.hs
+++ b/src/Test/LeanCheck/Utils/Types.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test.LeanCheck.Utils.Types
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
@@ -58,13 +58,14 @@
   , NoDup (..)
   , Bag (..)
   , Set (..)
+  , Map (..)
   )
 where
 -- TODO: Add Ix and Bits instances
 
 import Test.LeanCheck (Listable(..), listIntegral)
 import Test.LeanCheck.Core ((+|),cons1)
-import Test.LeanCheck.Tiers (noDupListCons, setCons, bagCons)
+import Test.LeanCheck.Tiers (noDupListCons, setCons, bagCons, mapCons)
 import Data.Ratio ((%))
 
 narrowU :: Int -> Int -> Int
@@ -460,10 +461,13 @@
 newtype NoDup a = NoDup [a] deriving (Show, Read, Eq, Ord)
 newtype Bag a = Bag [a] deriving (Show, Read, Eq, Ord)
 newtype Set a = Set [a] deriving (Show, Read, Eq, Ord)
+newtype Map a b = Map [(a,b)] deriving (Show, Read, Eq, Ord)
 
 instance Listable a => Listable (NoDup a) where tiers = noDupListCons NoDup
 instance Listable a => Listable (Bag a)   where tiers = bagCons Bag
 instance Listable a => Listable (Set a)   where tiers = setCons Set
+instance (Listable a, Listable b)
+                    => Listable (Map a b) where tiers = mapCons Map
 
 -- | 'X' type to be wrapped around integer types for an e-'X'-treme integer
 --   enumeration.  See the 'Listable' instance for 'X'.  Use 'X' when
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -3,7 +3,7 @@
 
 # resolver: nightly-2015-09-21
 # resolver: ghc-7.10.2
-resolver: lts-9.0
+resolver: lts-11.11
 
 packages:
 - .
diff --git a/tests/Test.hs b/tests/Test.hs
--- a/tests/Test.hs
+++ b/tests/Test.hs
@@ -1,6 +1,6 @@
 -- |
 -- Module      : Test
--- Copyright   : (c) 2015-2017 Rudy Matela
+-- Copyright   : (c) 2015-2018 Rudy Matela
 -- License     : 3-Clause BSD  (see the file LICENSE)
 -- Maintainer  : Rudy Matela <rudy@matela.com.br>
 --
@@ -15,7 +15,6 @@
   , tNatTripleOrd
   , tNatQuadrupleOrd
   , tNatQuintupleOrd
-  , tNatSixtupleOrd
   , tNatListOrd
   , tListsOfNatOrd
   , tPairEqParams
@@ -104,10 +103,6 @@
 tNatQuintupleOrd :: Int -> Bool
 tNatQuintupleOrd n = n `tStrictlyOrderedBy`  comparing sum' `thn` compare
   where sum' (x,y,z,w,v) = x+y+z+w+v :: Nat
-
-tNatSixtupleOrd :: Int -> Bool
-tNatSixtupleOrd n = n `tStrictlyOrderedBy`  comparing sum' `thn` compare
-  where sum' (x,y,z,w,v,u) = x+y+z+w+v+u :: Nat
 
 tNatListOrd :: Int -> Bool
 tNatListOrd n = n `tStrictlyOrderedBy`  comparing sum' `thn` compare
diff --git a/tests/diff/tiers-BagBool.out b/tests/diff/tiers-BagBool.out
--- a/tests/diff/tiers-BagBool.out
+++ b/tests/diff/tiers-BagBool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bag Bool ]])  =  [1,2,3,4,5,6,7,8,9,10,11,12,...]
+
+length (list :: [ Bag Bool ])  =  Infinity
+
+allUnique (list :: [ Bag Bool ])  =  True
+
+ratioRepetitions (list :: [ Bag Bool ])  =  0 % 1
+
 tiers :: [Bag Bool]  =
   [ [Bag []]
   , [ Bag [False]
@@ -90,11 +98,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Bag Bool ]])  =  [1,2,3,4,5,6,7,8,9,10,11,12,...]
-
-length (list :: [ Bag Bool ])  =  Infinity
-
-allUnique (list :: [ Bag Bool ])  =  True
-
-ratioRepetitions (list :: [ Bag Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-BagNat.out b/tests/diff/tiers-BagNat.out
--- a/tests/diff/tiers-BagNat.out
+++ b/tests/diff/tiers-BagNat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bag Nat ]])  =  [1,1,2,3,5,7,11,15,22,30,42,56,...]
+
+length (list :: [ Bag Nat ])  =  Infinity
+
+allUnique (list :: [ Bag Nat ])  =  True
+
+ratioRepetitions (list :: [ Bag Nat ])  =  0 % 1
+
 tiers :: [Bag Nat]  =
   [ [Bag []]
   , [Bag [0]]
@@ -206,11 +214,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Bag Nat ]])  =  [1,1,2,3,5,7,11,15,22,30,42,56,...]
-
-length (list :: [ Bag Nat ])  =  Infinity
-
-allUnique (list :: [ Bag Nat ])  =  True
-
-ratioRepetitions (list :: [ Bag Nat ])  =  0 % 1
diff --git a/tests/diff/tiers-BagNat2.out b/tests/diff/tiers-BagNat2.out
--- a/tests/diff/tiers-BagNat2.out
+++ b/tests/diff/tiers-BagNat2.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bag Nat2 ]])  =  [1,1,2,2,3,3,4,4,5,5,6,6,...]
+
+length (list :: [ Bag Nat2 ])  =  Infinity
+
+allUnique (list :: [ Bag Nat2 ])  =  True
+
+ratioRepetitions (list :: [ Bag Nat2 ])  =  0 % 1
+
 tiers :: [Bag Nat2]  =
   [ [Bag []]
   , [Bag [0]]
@@ -53,11 +61,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Bag Nat2 ]])  =  [1,1,2,2,3,3,4,4,5,5,6,6,...]
-
-length (list :: [ Bag Nat2 ])  =  Infinity
-
-allUnique (list :: [ Bag Nat2 ])  =  True
-
-ratioRepetitions (list :: [ Bag Nat2 ])  =  0 % 1
diff --git a/tests/diff/tiers-BagNat3.out b/tests/diff/tiers-BagNat3.out
--- a/tests/diff/tiers-BagNat3.out
+++ b/tests/diff/tiers-BagNat3.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bag Nat3 ]])  =  [1,1,2,3,4,5,7,8,10,12,14,16,...]
+
+length (list :: [ Bag Nat3 ])  =  Infinity
+
+allUnique (list :: [ Bag Nat3 ])  =  True
+
+ratioRepetitions (list :: [ Bag Nat3 ])  =  0 % 1
+
 tiers :: [Bag Nat3]  =
   [ [Bag []]
   , [Bag [0]]
@@ -94,11 +102,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Bag Nat3 ]])  =  [1,1,2,3,4,5,7,8,10,12,14,16,...]
-
-length (list :: [ Bag Nat3 ])  =  Infinity
-
-allUnique (list :: [ Bag Nat3 ])  =  True
-
-ratioRepetitions (list :: [ Bag Nat3 ])  =  0 % 1
diff --git a/tests/diff/tiers-BagU.out b/tests/diff/tiers-BagU.out
--- a/tests/diff/tiers-BagU.out
+++ b/tests/diff/tiers-BagU.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bag () ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
+
+length (list :: [ Bag () ])  =  Infinity
+
+allUnique (list :: [ Bag () ])  =  True
+
+ratioRepetitions (list :: [ Bag () ])  =  0 % 1
+
 tiers :: [Bag ()]  =
   [ [Bag []]
   , [Bag [()]]
@@ -13,11 +21,3 @@
   , [Bag [(),(),(),(),(),(),(),(),(),(),()]]
   , ...
   ]
-
-map length (tiers :: [[ Bag () ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
-
-length (list :: [ Bag () ])  =  Infinity
-
-allUnique (list :: [ Bag () ])  =  True
-
-ratioRepetitions (list :: [ Bag () ])  =  0 % 1
diff --git a/tests/diff/tiers-Bool.out b/tests/diff/tiers-Bool.out
--- a/tests/diff/tiers-Bool.out
+++ b/tests/diff/tiers-Bool.out
@@ -1,9 +1,3 @@
-tiers :: [Bool]  =
-  [ [ False
-    , True
-    ]
-  ]
-
 map length (tiers :: [[ Bool ]])  =  [2]
 
 length (list :: [ Bool ])  =  2
@@ -11,3 +5,9 @@
 allUnique (list :: [ Bool ])  =  True
 
 ratioRepetitions (list :: [ Bool ])  =  0 % 1
+
+tiers :: [Bool]  =
+  [ [ False
+    , True
+    ]
+  ]
diff --git a/tests/diff/tiers-Bools.out b/tests/diff/tiers-Bools.out
--- a/tests/diff/tiers-Bools.out
+++ b/tests/diff/tiers-Bools.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Bool] ]])  =  [1,2,4,8,16,32,...]
+
+length (list :: [ [Bool] ])  =  Infinity
+
+allUnique (list :: [ [Bool] ])  =  True
+
+ratioRepetitions (list :: [ [Bool] ])  =  0 % 1
+
 tiers :: [[Bool]]  =
   [ [[]]
   , [ [False]
@@ -69,11 +77,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Bool] ]])  =  [1,2,4,8,16,32,...]
-
-length (list :: [ [Bool] ])  =  Infinity
-
-allUnique (list :: [ [Bool] ])  =  True
-
-ratioRepetitions (list :: [ [Bool] ])  =  0 % 1
diff --git a/tests/diff/tiers-Char.out b/tests/diff/tiers-Char.out
--- a/tests/diff/tiers-Char.out
+++ b/tests/diff/tiers-Char.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Char ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
+
+length (list :: [ Char ])  =  Infinity
+
+allUnique (list :: [ Char ])  =  True
+
+ratioRepetitions (list :: [ Char ])  =  0 % 1
+
 tiers :: [Char]  =
   [ ['a']
   , [' ']
@@ -13,11 +21,3 @@
   , ['!']
   , ...
   ]
-
-map length (tiers :: [[ Char ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
-
-length (list :: [ Char ])  =  Infinity
-
-allUnique (list :: [ Char ])  =  True
-
-ratioRepetitions (list :: [ Char ])  =  0 % 1
diff --git a/tests/diff/tiers-Int,Int,Int.out b/tests/diff/tiers-Int,Int,Int.out
--- a/tests/diff/tiers-Int,Int,Int.out
+++ b/tests/diff/tiers-Int,Int,Int.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ (Int,Int,Int) ]])  =  [1,3,6,10,15,21,...]
+
+length (list :: [ (Int,Int,Int) ])  =  Infinity
+
+allUnique (list :: [ (Int,Int,Int) ])  =  True
+
+ratioRepetitions (list :: [ (Int,Int,Int) ])  =  0 % 1
+
 tiers :: [(Int,Int,Int)]  =
   [ [(0,0,0)]
   , [ (0,0,1)
@@ -62,11 +70,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ (Int,Int,Int) ]])  =  [1,3,6,10,15,21,...]
-
-length (list :: [ (Int,Int,Int) ])  =  Infinity
-
-allUnique (list :: [ (Int,Int,Int) ])  =  True
-
-ratioRepetitions (list :: [ (Int,Int,Int) ])  =  0 % 1
diff --git a/tests/diff/tiers-Int,Int.out b/tests/diff/tiers-Int,Int.out
--- a/tests/diff/tiers-Int,Int.out
+++ b/tests/diff/tiers-Int,Int.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ (Int,Int) ]])  =  [1,2,3,4,5,6,7,8,9,10,11,12,...]
+
+length (list :: [ (Int,Int) ])  =  Infinity
+
+allUnique (list :: [ (Int,Int) ])  =  True
+
+ratioRepetitions (list :: [ (Int,Int) ])  =  0 % 1
+
 tiers :: [(Int,Int)]  =
   [ [(0,0)]
   , [ (0,1)
@@ -90,11 +98,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ (Int,Int) ]])  =  [1,2,3,4,5,6,7,8,9,10,11,12,...]
-
-length (list :: [ (Int,Int) ])  =  Infinity
-
-allUnique (list :: [ (Int,Int) ])  =  True
-
-ratioRepetitions (list :: [ (Int,Int) ])  =  0 % 1
diff --git a/tests/diff/tiers-Int.out b/tests/diff/tiers-Int.out
--- a/tests/diff/tiers-Int.out
+++ b/tests/diff/tiers-Int.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Int ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
+
+length (list :: [ Int ])  =  Infinity
+
+allUnique (list :: [ Int ])  =  True
+
+ratioRepetitions (list :: [ Int ])  =  0 % 1
+
 tiers :: [Int]  =
   [ [0]
   , [1]
@@ -13,11 +21,3 @@
   , [6]
   , ...
   ]
-
-map length (tiers :: [[ Int ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
-
-length (list :: [ Int ])  =  Infinity
-
-allUnique (list :: [ Int ])  =  True
-
-ratioRepetitions (list :: [ Int ])  =  0 % 1
diff --git a/tests/diff/tiers-Integer.out b/tests/diff/tiers-Integer.out
--- a/tests/diff/tiers-Integer.out
+++ b/tests/diff/tiers-Integer.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Integer ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
+
+length (list :: [ Integer ])  =  Infinity
+
+allUnique (list :: [ Integer ])  =  True
+
+ratioRepetitions (list :: [ Integer ])  =  0 % 1
+
 tiers :: [Integer]  =
   [ [0]
   , [1]
@@ -13,11 +21,3 @@
   , [6]
   , ...
   ]
-
-map length (tiers :: [[ Integer ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
-
-length (list :: [ Integer ])  =  Infinity
-
-allUnique (list :: [ Integer ])  =  True
-
-ratioRepetitions (list :: [ Integer ])  =  0 % 1
diff --git a/tests/diff/tiers-Ints.out b/tests/diff/tiers-Ints.out
--- a/tests/diff/tiers-Ints.out
+++ b/tests/diff/tiers-Ints.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Int] ]])  =  [1,1,2,4,8,16,...]
+
+length (list :: [ [Int] ])  =  Infinity
+
+allUnique (list :: [ [Int] ])  =  True
+
+ratioRepetitions (list :: [ [Int] ])  =  0 % 1
+
 tiers :: [[Int]]  =
   [ [[]]
   , [[0]]
@@ -37,11 +45,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Int] ]])  =  [1,1,2,4,8,16,...]
-
-length (list :: [ [Int] ])  =  Infinity
-
-allUnique (list :: [ [Int] ])  =  True
-
-ratioRepetitions (list :: [ [Int] ])  =  0 % 1
diff --git a/tests/diff/tiers-MapBoolBool.out b/tests/diff/tiers-MapBoolBool.out
new file mode 100644
--- /dev/null
+++ b/tests/diff/tiers-MapBoolBool.out
@@ -0,0 +1,21 @@
+map length (tiers :: [[ Map Bool Bool ]])  =  [1,4,4]
+
+length (list :: [ Map Bool Bool ])  =  9
+
+allUnique (list :: [ Map Bool Bool ])  =  True
+
+ratioRepetitions (list :: [ Map Bool Bool ])  =  0 % 1
+
+tiers :: [Map Bool Bool]  =
+  [ [Map []]
+  , [ Map [(False,False)]
+    , Map [(False,True)]
+    , Map [(True,False)]
+    , Map [(True,True)]
+    ]
+  , [ Map [(False,False),(True,False)]
+    , Map [(False,False),(True,True)]
+    , Map [(False,True),(True,False)]
+    , Map [(False,True),(True,True)]
+    ]
+  ]
diff --git a/tests/diff/tiers-MapNat2Nat2.out b/tests/diff/tiers-MapNat2Nat2.out
new file mode 100644
--- /dev/null
+++ b/tests/diff/tiers-MapNat2Nat2.out
@@ -0,0 +1,22 @@
+map length (tiers :: [[ Map Nat2 Nat2 ]])  =  [1,1,2,2,2,1]
+
+length (list :: [ Map Nat2 Nat2 ])  =  9
+
+allUnique (list :: [ Map Nat2 Nat2 ])  =  True
+
+ratioRepetitions (list :: [ Map Nat2 Nat2 ])  =  0 % 1
+
+tiers :: [Map Nat2 Nat2]  =
+  [ [Map []]
+  , [Map [(0,0)]]
+  , [ Map [(0,1)]
+    , Map [(1,0)]
+    ]
+  , [ Map [(1,1)]
+    , Map [(0,0),(1,0)]
+    ]
+  , [ Map [(0,0),(1,1)]
+    , Map [(0,1),(1,0)]
+    ]
+  , [Map [(0,1),(1,1)]]
+  ]
diff --git a/tests/diff/tiers-MapNat3Nat3.out b/tests/diff/tiers-MapNat3Nat3.out
new file mode 100644
--- /dev/null
+++ b/tests/diff/tiers-MapNat3Nat3.out
@@ -0,0 +1,84 @@
+map length (tiers :: [[ Map Nat3 Nat3 ]])  =  [1,1,2,4,5,7,8,9,9,8,6,3,...]
+
+length (list :: [ Map Nat3 Nat3 ])  =  Infinity
+
+allUnique (list :: [ Map Nat3 Nat3 ])  =  True
+
+ratioRepetitions (list :: [ Map Nat3 Nat3 ])  =  0 % 1
+
+tiers :: [Map Nat3 Nat3]  =
+  [ [Map []]
+  , [Map [(0,0)]]
+  , [ Map [(0,1)]
+    , Map [(1,0)]
+    ]
+  , [ Map [(0,2)]
+    , Map [(1,1)]
+    , Map [(0,0),(1,0)]
+    , Map [(2,0)]
+    ]
+  , [ Map [(1,2)]
+    , Map [(0,0),(1,1)]
+    , Map [(0,1),(1,0)]
+    , Map [(2,1)]
+    , Map [(0,0),(2,0)]
+    ]
+  , [ Map [(0,0),(1,2)]
+    , Map [(0,1),(1,1)]
+    , Map [(0,2),(1,0)]
+    , Map [(2,2)]
+    , Map [(0,0),(2,1)]
+    , Map [(0,1),(2,0)]
+    , Map [(1,0),(2,0)]
+    ]
+  , [ Map [(0,1),(1,2)]
+    , Map [(0,2),(1,1)]
+    , Map [(0,0),(2,2)]
+    , Map [(0,1),(2,1)]
+    , Map [(0,2),(2,0)]
+    , Map [(1,0),(2,1)]
+    , Map [(1,1),(2,0)]
+    , Map [(0,0),(1,0),(2,0)]
+    ]
+  , [ Map [(0,2),(1,2)]
+    , Map [(0,1),(2,2)]
+    , Map [(0,2),(2,1)]
+    , Map [(1,0),(2,2)]
+    , Map [(1,1),(2,1)]
+    , Map [(1,2),(2,0)]
+    , Map [(0,0),(1,0),(2,1)]
+    , Map [(0,0),(1,1),(2,0)]
+    , Map [(0,1),(1,0),(2,0)]
+    ]
+  , [ Map [(0,2),(2,2)]
+    , Map [(1,1),(2,2)]
+    , Map [(1,2),(2,1)]
+    , Map [(0,0),(1,0),(2,2)]
+    , Map [(0,0),(1,1),(2,1)]
+    , Map [(0,0),(1,2),(2,0)]
+    , Map [(0,1),(1,0),(2,1)]
+    , Map [(0,1),(1,1),(2,0)]
+    , Map [(0,2),(1,0),(2,0)]
+    ]
+  , [ Map [(1,2),(2,2)]
+    , Map [(0,0),(1,1),(2,2)]
+    , Map [(0,0),(1,2),(2,1)]
+    , Map [(0,1),(1,0),(2,2)]
+    , Map [(0,1),(1,1),(2,1)]
+    , Map [(0,1),(1,2),(2,0)]
+    , Map [(0,2),(1,0),(2,1)]
+    , Map [(0,2),(1,1),(2,0)]
+    ]
+  , [ Map [(0,0),(1,2),(2,2)]
+    , Map [(0,1),(1,1),(2,2)]
+    , Map [(0,1),(1,2),(2,1)]
+    , Map [(0,2),(1,0),(2,2)]
+    , Map [(0,2),(1,1),(2,1)]
+    , Map [(0,2),(1,2),(2,0)]
+    ]
+  , [ Map [(0,1),(1,2),(2,2)]
+    , Map [(0,2),(1,1),(2,2)]
+    , Map [(0,2),(1,2),(2,1)]
+    ]
+  , ...
+  ]
diff --git a/tests/diff/tiers-MapNatNat.out b/tests/diff/tiers-MapNatNat.out
new file mode 100644
--- /dev/null
+++ b/tests/diff/tiers-MapNatNat.out
@@ -0,0 +1,571 @@
+map length (tiers :: [[ Map Nat Nat ]])  =  [1,1,2,4,7,12,20,33,53,84,131,202,...]
+
+length (list :: [ Map Nat Nat ])  =  Infinity
+
+allUnique (list :: [ Map Nat Nat ])  =  True
+
+ratioRepetitions (list :: [ Map Nat Nat ])  =  0 % 1
+
+tiers :: [Map Nat Nat]  =
+  [ [Map []]
+  , [Map [(0,0)]]
+  , [ Map [(0,1)]
+    , Map [(1,0)]
+    ]
+  , [ Map [(0,2)]
+    , Map [(1,1)]
+    , Map [(0,0),(1,0)]
+    , Map [(2,0)]
+    ]
+  , [ Map [(0,3)]
+    , Map [(1,2)]
+    , Map [(0,0),(1,1)]
+    , Map [(0,1),(1,0)]
+    , Map [(2,1)]
+    , Map [(0,0),(2,0)]
+    , Map [(3,0)]
+    ]
+  , [ Map [(0,4)]
+    , Map [(1,3)]
+    , Map [(0,0),(1,2)]
+    , Map [(0,1),(1,1)]
+    , Map [(0,2),(1,0)]
+    , Map [(2,2)]
+    , Map [(0,0),(2,1)]
+    , Map [(0,1),(2,0)]
+    , Map [(3,1)]
+    , Map [(0,0),(3,0)]
+    , Map [(1,0),(2,0)]
+    , Map [(4,0)]
+    ]
+  , [ Map [(0,5)]
+    , Map [(1,4)]
+    , Map [(0,0),(1,3)]
+    , Map [(0,1),(1,2)]
+    , Map [(0,2),(1,1)]
+    , Map [(0,3),(1,0)]
+    , Map [(2,3)]
+    , Map [(0,0),(2,2)]
+    , Map [(0,1),(2,1)]
+    , Map [(0,2),(2,0)]
+    , Map [(3,2)]
+    , Map [(0,0),(3,1)]
+    , Map [(0,1),(3,0)]
+    , Map [(1,0),(2,1)]
+    , Map [(1,1),(2,0)]
+    , Map [(4,1)]
+    , Map [(0,0),(1,0),(2,0)]
+    , Map [(0,0),(4,0)]
+    , Map [(1,0),(3,0)]
+    , Map [(5,0)]
+    ]
+  , [ Map [(0,6)]
+    , Map [(1,5)]
+    , Map [(0,0),(1,4)]
+    , Map [(0,1),(1,3)]
+    , Map [(0,2),(1,2)]
+    , Map [(0,3),(1,1)]
+    , Map [(0,4),(1,0)]
+    , Map [(2,4)]
+    , Map [(0,0),(2,3)]
+    , Map [(0,1),(2,2)]
+    , Map [(0,2),(2,1)]
+    , Map [(0,3),(2,0)]
+    , Map [(3,3)]
+    , Map [(0,0),(3,2)]
+    , Map [(0,1),(3,1)]
+    , Map [(0,2),(3,0)]
+    , Map [(1,0),(2,2)]
+    , Map [(1,1),(2,1)]
+    , Map [(1,2),(2,0)]
+    , Map [(4,2)]
+    , Map [(0,0),(1,0),(2,1)]
+    , Map [(0,0),(1,1),(2,0)]
+    , Map [(0,1),(1,0),(2,0)]
+    , Map [(0,0),(4,1)]
+    , Map [(0,1),(4,0)]
+    , Map [(1,0),(3,1)]
+    , Map [(1,1),(3,0)]
+    , Map [(5,1)]
+    , Map [(0,0),(1,0),(3,0)]
+    , Map [(0,0),(5,0)]
+    , Map [(1,0),(4,0)]
+    , Map [(2,0),(3,0)]
+    , Map [(6,0)]
+    ]
+  , [ Map [(0,7)]
+    , Map [(1,6)]
+    , Map [(0,0),(1,5)]
+    , Map [(0,1),(1,4)]
+    , Map [(0,2),(1,3)]
+    , Map [(0,3),(1,2)]
+    , Map [(0,4),(1,1)]
+    , Map [(0,5),(1,0)]
+    , Map [(2,5)]
+    , Map [(0,0),(2,4)]
+    , Map [(0,1),(2,3)]
+    , Map [(0,2),(2,2)]
+    , Map [(0,3),(2,1)]
+    , Map [(0,4),(2,0)]
+    , Map [(3,4)]
+    , Map [(0,0),(3,3)]
+    , Map [(0,1),(3,2)]
+    , Map [(0,2),(3,1)]
+    , Map [(0,3),(3,0)]
+    , Map [(1,0),(2,3)]
+    , Map [(1,1),(2,2)]
+    , Map [(1,2),(2,1)]
+    , Map [(1,3),(2,0)]
+    , Map [(4,3)]
+    , Map [(0,0),(1,0),(2,2)]
+    , Map [(0,0),(1,1),(2,1)]
+    , Map [(0,0),(1,2),(2,0)]
+    , Map [(0,1),(1,0),(2,1)]
+    , Map [(0,1),(1,1),(2,0)]
+    , Map [(0,2),(1,0),(2,0)]
+    , Map [(0,0),(4,2)]
+    , Map [(0,1),(4,1)]
+    , Map [(0,2),(4,0)]
+    , Map [(1,0),(3,2)]
+    , Map [(1,1),(3,1)]
+    , Map [(1,2),(3,0)]
+    , Map [(5,2)]
+    , Map [(0,0),(1,0),(3,1)]
+    , Map [(0,0),(1,1),(3,0)]
+    , Map [(0,1),(1,0),(3,0)]
+    , Map [(0,0),(5,1)]
+    , Map [(0,1),(5,0)]
+    , Map [(1,0),(4,1)]
+    , Map [(1,1),(4,0)]
+    , Map [(2,0),(3,1)]
+    , Map [(2,1),(3,0)]
+    , Map [(6,1)]
+    , Map [(0,0),(1,0),(4,0)]
+    , Map [(0,0),(2,0),(3,0)]
+    , Map [(0,0),(6,0)]
+    , Map [(1,0),(5,0)]
+    , Map [(2,0),(4,0)]
+    , Map [(7,0)]
+    ]
+  , [ Map [(0,8)]
+    , Map [(1,7)]
+    , Map [(0,0),(1,6)]
+    , Map [(0,1),(1,5)]
+    , Map [(0,2),(1,4)]
+    , Map [(0,3),(1,3)]
+    , Map [(0,4),(1,2)]
+    , Map [(0,5),(1,1)]
+    , Map [(0,6),(1,0)]
+    , Map [(2,6)]
+    , Map [(0,0),(2,5)]
+    , Map [(0,1),(2,4)]
+    , Map [(0,2),(2,3)]
+    , Map [(0,3),(2,2)]
+    , Map [(0,4),(2,1)]
+    , Map [(0,5),(2,0)]
+    , Map [(3,5)]
+    , Map [(0,0),(3,4)]
+    , Map [(0,1),(3,3)]
+    , Map [(0,2),(3,2)]
+    , Map [(0,3),(3,1)]
+    , Map [(0,4),(3,0)]
+    , Map [(1,0),(2,4)]
+    , Map [(1,1),(2,3)]
+    , Map [(1,2),(2,2)]
+    , Map [(1,3),(2,1)]
+    , Map [(1,4),(2,0)]
+    , Map [(4,4)]
+    , Map [(0,0),(1,0),(2,3)]
+    , Map [(0,0),(1,1),(2,2)]
+    , Map [(0,0),(1,2),(2,1)]
+    , Map [(0,0),(1,3),(2,0)]
+    , Map [(0,1),(1,0),(2,2)]
+    , Map [(0,1),(1,1),(2,1)]
+    , Map [(0,1),(1,2),(2,0)]
+    , Map [(0,2),(1,0),(2,1)]
+    , Map [(0,2),(1,1),(2,0)]
+    , Map [(0,3),(1,0),(2,0)]
+    , Map [(0,0),(4,3)]
+    , Map [(0,1),(4,2)]
+    , Map [(0,2),(4,1)]
+    , Map [(0,3),(4,0)]
+    , Map [(1,0),(3,3)]
+    , Map [(1,1),(3,2)]
+    , Map [(1,2),(3,1)]
+    , Map [(1,3),(3,0)]
+    , Map [(5,3)]
+    , Map [(0,0),(1,0),(3,2)]
+    , Map [(0,0),(1,1),(3,1)]
+    , Map [(0,0),(1,2),(3,0)]
+    , Map [(0,1),(1,0),(3,1)]
+    , Map [(0,1),(1,1),(3,0)]
+    , Map [(0,2),(1,0),(3,0)]
+    , Map [(0,0),(5,2)]
+    , Map [(0,1),(5,1)]
+    , Map [(0,2),(5,0)]
+    , Map [(1,0),(4,2)]
+    , Map [(1,1),(4,1)]
+    , Map [(1,2),(4,0)]
+    , Map [(2,0),(3,2)]
+    , Map [(2,1),(3,1)]
+    , Map [(2,2),(3,0)]
+    , Map [(6,2)]
+    , Map [(0,0),(1,0),(4,1)]
+    , Map [(0,0),(1,1),(4,0)]
+    , Map [(0,1),(1,0),(4,0)]
+    , Map [(0,0),(2,0),(3,1)]
+    , Map [(0,0),(2,1),(3,0)]
+    , Map [(0,1),(2,0),(3,0)]
+    , Map [(0,0),(6,1)]
+    , Map [(0,1),(6,0)]
+    , Map [(1,0),(5,1)]
+    , Map [(1,1),(5,0)]
+    , Map [(2,0),(4,1)]
+    , Map [(2,1),(4,0)]
+    , Map [(7,1)]
+    , Map [(0,0),(1,0),(5,0)]
+    , Map [(0,0),(2,0),(4,0)]
+    , Map [(0,0),(7,0)]
+    , Map [(1,0),(2,0),(3,0)]
+    , Map [(1,0),(6,0)]
+    , Map [(2,0),(5,0)]
+    , Map [(3,0),(4,0)]
+    , Map [(8,0)]
+    ]
+  , [ Map [(0,9)]
+    , Map [(1,8)]
+    , Map [(0,0),(1,7)]
+    , Map [(0,1),(1,6)]
+    , Map [(0,2),(1,5)]
+    , Map [(0,3),(1,4)]
+    , Map [(0,4),(1,3)]
+    , Map [(0,5),(1,2)]
+    , Map [(0,6),(1,1)]
+    , Map [(0,7),(1,0)]
+    , Map [(2,7)]
+    , Map [(0,0),(2,6)]
+    , Map [(0,1),(2,5)]
+    , Map [(0,2),(2,4)]
+    , Map [(0,3),(2,3)]
+    , Map [(0,4),(2,2)]
+    , Map [(0,5),(2,1)]
+    , Map [(0,6),(2,0)]
+    , Map [(3,6)]
+    , Map [(0,0),(3,5)]
+    , Map [(0,1),(3,4)]
+    , Map [(0,2),(3,3)]
+    , Map [(0,3),(3,2)]
+    , Map [(0,4),(3,1)]
+    , Map [(0,5),(3,0)]
+    , Map [(1,0),(2,5)]
+    , Map [(1,1),(2,4)]
+    , Map [(1,2),(2,3)]
+    , Map [(1,3),(2,2)]
+    , Map [(1,4),(2,1)]
+    , Map [(1,5),(2,0)]
+    , Map [(4,5)]
+    , Map [(0,0),(1,0),(2,4)]
+    , Map [(0,0),(1,1),(2,3)]
+    , Map [(0,0),(1,2),(2,2)]
+    , Map [(0,0),(1,3),(2,1)]
+    , Map [(0,0),(1,4),(2,0)]
+    , Map [(0,1),(1,0),(2,3)]
+    , Map [(0,1),(1,1),(2,2)]
+    , Map [(0,1),(1,2),(2,1)]
+    , Map [(0,1),(1,3),(2,0)]
+    , Map [(0,2),(1,0),(2,2)]
+    , Map [(0,2),(1,1),(2,1)]
+    , Map [(0,2),(1,2),(2,0)]
+    , Map [(0,3),(1,0),(2,1)]
+    , Map [(0,3),(1,1),(2,0)]
+    , Map [(0,4),(1,0),(2,0)]
+    , Map [(0,0),(4,4)]
+    , Map [(0,1),(4,3)]
+    , Map [(0,2),(4,2)]
+    , Map [(0,3),(4,1)]
+    , Map [(0,4),(4,0)]
+    , Map [(1,0),(3,4)]
+    , Map [(1,1),(3,3)]
+    , Map [(1,2),(3,2)]
+    , Map [(1,3),(3,1)]
+    , Map [(1,4),(3,0)]
+    , Map [(5,4)]
+    , Map [(0,0),(1,0),(3,3)]
+    , Map [(0,0),(1,1),(3,2)]
+    , Map [(0,0),(1,2),(3,1)]
+    , Map [(0,0),(1,3),(3,0)]
+    , Map [(0,1),(1,0),(3,2)]
+    , Map [(0,1),(1,1),(3,1)]
+    , Map [(0,1),(1,2),(3,0)]
+    , Map [(0,2),(1,0),(3,1)]
+    , Map [(0,2),(1,1),(3,0)]
+    , Map [(0,3),(1,0),(3,0)]
+    , Map [(0,0),(5,3)]
+    , Map [(0,1),(5,2)]
+    , Map [(0,2),(5,1)]
+    , Map [(0,3),(5,0)]
+    , Map [(1,0),(4,3)]
+    , Map [(1,1),(4,2)]
+    , Map [(1,2),(4,1)]
+    , Map [(1,3),(4,0)]
+    , Map [(2,0),(3,3)]
+    , Map [(2,1),(3,2)]
+    , Map [(2,2),(3,1)]
+    , Map [(2,3),(3,0)]
+    , Map [(6,3)]
+    , Map [(0,0),(1,0),(4,2)]
+    , Map [(0,0),(1,1),(4,1)]
+    , Map [(0,0),(1,2),(4,0)]
+    , Map [(0,1),(1,0),(4,1)]
+    , Map [(0,1),(1,1),(4,0)]
+    , Map [(0,2),(1,0),(4,0)]
+    , Map [(0,0),(2,0),(3,2)]
+    , Map [(0,0),(2,1),(3,1)]
+    , Map [(0,0),(2,2),(3,0)]
+    , Map [(0,1),(2,0),(3,1)]
+    , Map [(0,1),(2,1),(3,0)]
+    , Map [(0,2),(2,0),(3,0)]
+    , Map [(0,0),(6,2)]
+    , Map [(0,1),(6,1)]
+    , Map [(0,2),(6,0)]
+    , Map [(1,0),(5,2)]
+    , Map [(1,1),(5,1)]
+    , Map [(1,2),(5,0)]
+    , Map [(2,0),(4,2)]
+    , Map [(2,1),(4,1)]
+    , Map [(2,2),(4,0)]
+    , Map [(7,2)]
+    , Map [(0,0),(1,0),(5,1)]
+    , Map [(0,0),(1,1),(5,0)]
+    , Map [(0,1),(1,0),(5,0)]
+    , Map [(0,0),(2,0),(4,1)]
+    , Map [(0,0),(2,1),(4,0)]
+    , Map [(0,1),(2,0),(4,0)]
+    , Map [(0,0),(7,1)]
+    , Map [(0,1),(7,0)]
+    , Map [(1,0),(2,0),(3,1)]
+    , Map [(1,0),(2,1),(3,0)]
+    , Map [(1,1),(2,0),(3,0)]
+    , Map [(1,0),(6,1)]
+    , Map [(1,1),(6,0)]
+    , Map [(2,0),(5,1)]
+    , Map [(2,1),(5,0)]
+    , Map [(3,0),(4,1)]
+    , Map [(3,1),(4,0)]
+    , Map [(8,1)]
+    , Map [(0,0),(1,0),(2,0),(3,0)]
+    , Map [(0,0),(1,0),(6,0)]
+    , Map [(0,0),(2,0),(5,0)]
+    , Map [(0,0),(3,0),(4,0)]
+    , Map [(0,0),(8,0)]
+    , Map [(1,0),(2,0),(4,0)]
+    , Map [(1,0),(7,0)]
+    , Map [(2,0),(6,0)]
+    , Map [(3,0),(5,0)]
+    , Map [(9,0)]
+    ]
+  , [ Map [(0,10)]
+    , Map [(1,9)]
+    , Map [(0,0),(1,8)]
+    , Map [(0,1),(1,7)]
+    , Map [(0,2),(1,6)]
+    , Map [(0,3),(1,5)]
+    , Map [(0,4),(1,4)]
+    , Map [(0,5),(1,3)]
+    , Map [(0,6),(1,2)]
+    , Map [(0,7),(1,1)]
+    , Map [(0,8),(1,0)]
+    , Map [(2,8)]
+    , Map [(0,0),(2,7)]
+    , Map [(0,1),(2,6)]
+    , Map [(0,2),(2,5)]
+    , Map [(0,3),(2,4)]
+    , Map [(0,4),(2,3)]
+    , Map [(0,5),(2,2)]
+    , Map [(0,6),(2,1)]
+    , Map [(0,7),(2,0)]
+    , Map [(3,7)]
+    , Map [(0,0),(3,6)]
+    , Map [(0,1),(3,5)]
+    , Map [(0,2),(3,4)]
+    , Map [(0,3),(3,3)]
+    , Map [(0,4),(3,2)]
+    , Map [(0,5),(3,1)]
+    , Map [(0,6),(3,0)]
+    , Map [(1,0),(2,6)]
+    , Map [(1,1),(2,5)]
+    , Map [(1,2),(2,4)]
+    , Map [(1,3),(2,3)]
+    , Map [(1,4),(2,2)]
+    , Map [(1,5),(2,1)]
+    , Map [(1,6),(2,0)]
+    , Map [(4,6)]
+    , Map [(0,0),(1,0),(2,5)]
+    , Map [(0,0),(1,1),(2,4)]
+    , Map [(0,0),(1,2),(2,3)]
+    , Map [(0,0),(1,3),(2,2)]
+    , Map [(0,0),(1,4),(2,1)]
+    , Map [(0,0),(1,5),(2,0)]
+    , Map [(0,1),(1,0),(2,4)]
+    , Map [(0,1),(1,1),(2,3)]
+    , Map [(0,1),(1,2),(2,2)]
+    , Map [(0,1),(1,3),(2,1)]
+    , Map [(0,1),(1,4),(2,0)]
+    , Map [(0,2),(1,0),(2,3)]
+    , Map [(0,2),(1,1),(2,2)]
+    , Map [(0,2),(1,2),(2,1)]
+    , Map [(0,2),(1,3),(2,0)]
+    , Map [(0,3),(1,0),(2,2)]
+    , Map [(0,3),(1,1),(2,1)]
+    , Map [(0,3),(1,2),(2,0)]
+    , Map [(0,4),(1,0),(2,1)]
+    , Map [(0,4),(1,1),(2,0)]
+    , Map [(0,5),(1,0),(2,0)]
+    , Map [(0,0),(4,5)]
+    , Map [(0,1),(4,4)]
+    , Map [(0,2),(4,3)]
+    , Map [(0,3),(4,2)]
+    , Map [(0,4),(4,1)]
+    , Map [(0,5),(4,0)]
+    , Map [(1,0),(3,5)]
+    , Map [(1,1),(3,4)]
+    , Map [(1,2),(3,3)]
+    , Map [(1,3),(3,2)]
+    , Map [(1,4),(3,1)]
+    , Map [(1,5),(3,0)]
+    , Map [(5,5)]
+    , Map [(0,0),(1,0),(3,4)]
+    , Map [(0,0),(1,1),(3,3)]
+    , Map [(0,0),(1,2),(3,2)]
+    , Map [(0,0),(1,3),(3,1)]
+    , Map [(0,0),(1,4),(3,0)]
+    , Map [(0,1),(1,0),(3,3)]
+    , Map [(0,1),(1,1),(3,2)]
+    , Map [(0,1),(1,2),(3,1)]
+    , Map [(0,1),(1,3),(3,0)]
+    , Map [(0,2),(1,0),(3,2)]
+    , Map [(0,2),(1,1),(3,1)]
+    , Map [(0,2),(1,2),(3,0)]
+    , Map [(0,3),(1,0),(3,1)]
+    , Map [(0,3),(1,1),(3,0)]
+    , Map [(0,4),(1,0),(3,0)]
+    , Map [(0,0),(5,4)]
+    , Map [(0,1),(5,3)]
+    , Map [(0,2),(5,2)]
+    , Map [(0,3),(5,1)]
+    , Map [(0,4),(5,0)]
+    , Map [(1,0),(4,4)]
+    , Map [(1,1),(4,3)]
+    , Map [(1,2),(4,2)]
+    , Map [(1,3),(4,1)]
+    , Map [(1,4),(4,0)]
+    , Map [(2,0),(3,4)]
+    , Map [(2,1),(3,3)]
+    , Map [(2,2),(3,2)]
+    , Map [(2,3),(3,1)]
+    , Map [(2,4),(3,0)]
+    , Map [(6,4)]
+    , Map [(0,0),(1,0),(4,3)]
+    , Map [(0,0),(1,1),(4,2)]
+    , Map [(0,0),(1,2),(4,1)]
+    , Map [(0,0),(1,3),(4,0)]
+    , Map [(0,1),(1,0),(4,2)]
+    , Map [(0,1),(1,1),(4,1)]
+    , Map [(0,1),(1,2),(4,0)]
+    , Map [(0,2),(1,0),(4,1)]
+    , Map [(0,2),(1,1),(4,0)]
+    , Map [(0,3),(1,0),(4,0)]
+    , Map [(0,0),(2,0),(3,3)]
+    , Map [(0,0),(2,1),(3,2)]
+    , Map [(0,0),(2,2),(3,1)]
+    , Map [(0,0),(2,3),(3,0)]
+    , Map [(0,1),(2,0),(3,2)]
+    , Map [(0,1),(2,1),(3,1)]
+    , Map [(0,1),(2,2),(3,0)]
+    , Map [(0,2),(2,0),(3,1)]
+    , Map [(0,2),(2,1),(3,0)]
+    , Map [(0,3),(2,0),(3,0)]
+    , Map [(0,0),(6,3)]
+    , Map [(0,1),(6,2)]
+    , Map [(0,2),(6,1)]
+    , Map [(0,3),(6,0)]
+    , Map [(1,0),(5,3)]
+    , Map [(1,1),(5,2)]
+    , Map [(1,2),(5,1)]
+    , Map [(1,3),(5,0)]
+    , Map [(2,0),(4,3)]
+    , Map [(2,1),(4,2)]
+    , Map [(2,2),(4,1)]
+    , Map [(2,3),(4,0)]
+    , Map [(7,3)]
+    , Map [(0,0),(1,0),(5,2)]
+    , Map [(0,0),(1,1),(5,1)]
+    , Map [(0,0),(1,2),(5,0)]
+    , Map [(0,1),(1,0),(5,1)]
+    , Map [(0,1),(1,1),(5,0)]
+    , Map [(0,2),(1,0),(5,0)]
+    , Map [(0,0),(2,0),(4,2)]
+    , Map [(0,0),(2,1),(4,1)]
+    , Map [(0,0),(2,2),(4,0)]
+    , Map [(0,1),(2,0),(4,1)]
+    , Map [(0,1),(2,1),(4,0)]
+    , Map [(0,2),(2,0),(4,0)]
+    , Map [(0,0),(7,2)]
+    , Map [(0,1),(7,1)]
+    , Map [(0,2),(7,0)]
+    , Map [(1,0),(2,0),(3,2)]
+    , Map [(1,0),(2,1),(3,1)]
+    , Map [(1,0),(2,2),(3,0)]
+    , Map [(1,1),(2,0),(3,1)]
+    , Map [(1,1),(2,1),(3,0)]
+    , Map [(1,2),(2,0),(3,0)]
+    , Map [(1,0),(6,2)]
+    , Map [(1,1),(6,1)]
+    , Map [(1,2),(6,0)]
+    , Map [(2,0),(5,2)]
+    , Map [(2,1),(5,1)]
+    , Map [(2,2),(5,0)]
+    , Map [(3,0),(4,2)]
+    , Map [(3,1),(4,1)]
+    , Map [(3,2),(4,0)]
+    , Map [(8,2)]
+    , Map [(0,0),(1,0),(2,0),(3,1)]
+    , Map [(0,0),(1,0),(2,1),(3,0)]
+    , Map [(0,0),(1,1),(2,0),(3,0)]
+    , Map [(0,1),(1,0),(2,0),(3,0)]
+    , Map [(0,0),(1,0),(6,1)]
+    , Map [(0,0),(1,1),(6,0)]
+    , Map [(0,1),(1,0),(6,0)]
+    , Map [(0,0),(2,0),(5,1)]
+    , Map [(0,0),(2,1),(5,0)]
+    , Map [(0,1),(2,0),(5,0)]
+    , Map [(0,0),(3,0),(4,1)]
+    , Map [(0,0),(3,1),(4,0)]
+    , Map [(0,1),(3,0),(4,0)]
+    , Map [(0,0),(8,1)]
+    , Map [(0,1),(8,0)]
+    , Map [(1,0),(2,0),(4,1)]
+    , Map [(1,0),(2,1),(4,0)]
+    , Map [(1,1),(2,0),(4,0)]
+    , Map [(1,0),(7,1)]
+    , Map [(1,1),(7,0)]
+    , Map [(2,0),(6,1)]
+    , Map [(2,1),(6,0)]
+    , Map [(3,0),(5,1)]
+    , Map [(3,1),(5,0)]
+    , Map [(9,1)]
+    , Map [(0,0),(1,0),(2,0),(4,0)]
+    , Map [(0,0),(1,0),(7,0)]
+    , Map [(0,0),(2,0),(6,0)]
+    , Map [(0,0),(3,0),(5,0)]
+    , Map [(0,0),(9,0)]
+    , Map [(1,0),(2,0),(5,0)]
+    , Map [(1,0),(3,0),(4,0)]
+    , Map [(1,0),(8,0)]
+    , Map [(2,0),(7,0)]
+    , Map [(3,0),(6,0)]
+    , Map [(4,0),(5,0)]
+    , Map [(10,0)]
+    ]
+  , ...
+  ]
diff --git a/tests/diff/tiers-MapUU.out b/tests/diff/tiers-MapUU.out
new file mode 100644
--- /dev/null
+++ b/tests/diff/tiers-MapUU.out
@@ -0,0 +1,12 @@
+map length (tiers :: [[ Map () () ]])  =  [1,1]
+
+length (list :: [ Map () () ])  =  2
+
+allUnique (list :: [ Map () () ])  =  True
+
+ratioRepetitions (list :: [ Map () () ])  =  0 % 1
+
+tiers :: [Map () ()]  =
+  [ [Map []]
+  , [Map [((),())]]
+  ]
diff --git a/tests/diff/tiers-Nat,Nat,Nat.out b/tests/diff/tiers-Nat,Nat,Nat.out
--- a/tests/diff/tiers-Nat,Nat,Nat.out
+++ b/tests/diff/tiers-Nat,Nat,Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ (Nat,Nat,Nat) ]])  =  [1,3,6,10,15,21,...]
+
+length (list :: [ (Nat,Nat,Nat) ])  =  Infinity
+
+allUnique (list :: [ (Nat,Nat,Nat) ])  =  True
+
+ratioRepetitions (list :: [ (Nat,Nat,Nat) ])  =  0 % 1
+
 tiers :: [(Nat,Nat,Nat)]  =
   [ [(0,0,0)]
   , [ (0,0,1)
@@ -62,11 +70,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ (Nat,Nat,Nat) ]])  =  [1,3,6,10,15,21,...]
-
-length (list :: [ (Nat,Nat,Nat) ])  =  Infinity
-
-allUnique (list :: [ (Nat,Nat,Nat) ])  =  True
-
-ratioRepetitions (list :: [ (Nat,Nat,Nat) ])  =  0 % 1
diff --git a/tests/diff/tiers-Nat,Nat.out b/tests/diff/tiers-Nat,Nat.out
--- a/tests/diff/tiers-Nat,Nat.out
+++ b/tests/diff/tiers-Nat,Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ (Nat,Nat) ]])  =  [1,2,3,4,5,6,7,8,9,10,11,12,...]
+
+length (list :: [ (Nat,Nat) ])  =  Infinity
+
+allUnique (list :: [ (Nat,Nat) ])  =  True
+
+ratioRepetitions (list :: [ (Nat,Nat) ])  =  0 % 1
+
 tiers :: [(Nat,Nat)]  =
   [ [(0,0)]
   , [ (0,1)
@@ -90,11 +98,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ (Nat,Nat) ]])  =  [1,2,3,4,5,6,7,8,9,10,11,12,...]
-
-length (list :: [ (Nat,Nat) ])  =  Infinity
-
-allUnique (list :: [ (Nat,Nat) ])  =  True
-
-ratioRepetitions (list :: [ (Nat,Nat) ])  =  0 % 1
diff --git a/tests/diff/tiers-Nat.out b/tests/diff/tiers-Nat.out
--- a/tests/diff/tiers-Nat.out
+++ b/tests/diff/tiers-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
+
+length (list :: [ Nat ])  =  Infinity
+
+allUnique (list :: [ Nat ])  =  True
+
+ratioRepetitions (list :: [ Nat ])  =  0 % 1
+
 tiers :: [Nat]  =
   [ [0]
   , [1]
@@ -13,11 +21,3 @@
   , [11]
   , ...
   ]
-
-map length (tiers :: [[ Nat ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
-
-length (list :: [ Nat ])  =  Infinity
-
-allUnique (list :: [ Nat ])  =  True
-
-ratioRepetitions (list :: [ Nat ])  =  0 % 1
diff --git a/tests/diff/tiers-Nats.out b/tests/diff/tiers-Nats.out
--- a/tests/diff/tiers-Nats.out
+++ b/tests/diff/tiers-Nats.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Nat] ]])  =  [1,1,2,4,8,16,...]
+
+length (list :: [ [Nat] ])  =  Infinity
+
+allUnique (list :: [ [Nat] ])  =  True
+
+ratioRepetitions (list :: [ [Nat] ])  =  0 % 1
+
 tiers :: [[Nat]]  =
   [ [[]]
   , [[0]]
@@ -37,11 +45,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Nat] ]])  =  [1,1,2,4,8,16,...]
-
-length (list :: [ [Nat] ])  =  Infinity
-
-allUnique (list :: [ [Nat] ])  =  True
-
-ratioRepetitions (list :: [ [Nat] ])  =  0 % 1
diff --git a/tests/diff/tiers-NoDupBool.out b/tests/diff/tiers-NoDupBool.out
--- a/tests/diff/tiers-NoDupBool.out
+++ b/tests/diff/tiers-NoDupBool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ NoDup Bool ]])  =  [1,2,2]
+
+length (list :: [ NoDup Bool ])  =  5
+
+allUnique (list :: [ NoDup Bool ])  =  True
+
+ratioRepetitions (list :: [ NoDup Bool ])  =  0 % 1
+
 tiers :: [NoDup Bool]  =
   [ [NoDup []]
   , [ NoDup [False]
@@ -7,11 +15,3 @@
     , NoDup [True,False]
     ]
   ]
-
-map length (tiers :: [[ NoDup Bool ]])  =  [1,2,2]
-
-length (list :: [ NoDup Bool ])  =  5
-
-allUnique (list :: [ NoDup Bool ])  =  True
-
-ratioRepetitions (list :: [ NoDup Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-NoDupNat.out b/tests/diff/tiers-NoDupNat.out
--- a/tests/diff/tiers-NoDupNat.out
+++ b/tests/diff/tiers-NoDupNat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ NoDup Nat ]])  =  [1,1,1,3,3,5,11,13,19,27,57,65,...]
+
+length (list :: [ NoDup Nat ])  =  Infinity
+
+allUnique (list :: [ NoDup Nat ])  =  True
+
+ratioRepetitions (list :: [ NoDup Nat ])  =  0 % 1
+
 tiers :: [NoDup Nat]  =
   [ [NoDup []]
   , [NoDup [0]]
@@ -216,11 +224,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ NoDup Nat ]])  =  [1,1,1,3,3,5,11,13,19,27,57,65,...]
-
-length (list :: [ NoDup Nat ])  =  Infinity
-
-allUnique (list :: [ NoDup Nat ])  =  True
-
-ratioRepetitions (list :: [ NoDup Nat ])  =  0 % 1
diff --git a/tests/diff/tiers-NoDupNat2.out b/tests/diff/tiers-NoDupNat2.out
--- a/tests/diff/tiers-NoDupNat2.out
+++ b/tests/diff/tiers-NoDupNat2.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ NoDup Nat2 ]])  =  [1,1,1,2]
+
+length (list :: [ NoDup Nat2 ])  =  5
+
+allUnique (list :: [ NoDup Nat2 ])  =  True
+
+ratioRepetitions (list :: [ NoDup Nat2 ])  =  0 % 1
+
 tiers :: [NoDup Nat2]  =
   [ [NoDup []]
   , [NoDup [0]]
@@ -6,11 +14,3 @@
     , NoDup [1,0]
     ]
   ]
-
-map length (tiers :: [[ NoDup Nat2 ]])  =  [1,1,1,2]
-
-length (list :: [ NoDup Nat2 ])  =  5
-
-allUnique (list :: [ NoDup Nat2 ])  =  True
-
-ratioRepetitions (list :: [ NoDup Nat2 ])  =  0 % 1
diff --git a/tests/diff/tiers-NoDupNat3.out b/tests/diff/tiers-NoDupNat3.out
--- a/tests/diff/tiers-NoDupNat3.out
+++ b/tests/diff/tiers-NoDupNat3.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ NoDup Nat3 ]])  =  [1,1,1,3,2,2,6]
+
+length (list :: [ NoDup Nat3 ])  =  Infinity
+
+allUnique (list :: [ NoDup Nat3 ])  =  True
+
+ratioRepetitions (list :: [ NoDup Nat3 ])  =  0 % 1
+
 tiers :: [NoDup Nat3]  =
   [ [NoDup []]
   , [NoDup [0]]
@@ -20,11 +28,3 @@
     , NoDup [2,1,0]
     ]
   ]
-
-map length (tiers :: [[ NoDup Nat3 ]])  =  [1,1,1,3,2,2,6]
-
-length (list :: [ NoDup Nat3 ])  =  Infinity
-
-allUnique (list :: [ NoDup Nat3 ])  =  True
-
-ratioRepetitions (list :: [ NoDup Nat3 ])  =  0 % 1
diff --git a/tests/diff/tiers-NoDupU.out b/tests/diff/tiers-NoDupU.out
--- a/tests/diff/tiers-NoDupU.out
+++ b/tests/diff/tiers-NoDupU.out
@@ -1,8 +1,3 @@
-tiers :: [NoDup ()]  =
-  [ [NoDup []]
-  , [NoDup [()]]
-  ]
-
 map length (tiers :: [[ NoDup () ]])  =  [1,1]
 
 length (list :: [ NoDup () ])  =  2
@@ -10,3 +5,8 @@
 allUnique (list :: [ NoDup () ])  =  True
 
 ratioRepetitions (list :: [ NoDup () ])  =  0 % 1
+
+tiers :: [NoDup ()]  =
+  [ [NoDup []]
+  , [NoDup [()]]
+  ]
diff --git a/tests/diff/tiers-SetBool.out b/tests/diff/tiers-SetBool.out
--- a/tests/diff/tiers-SetBool.out
+++ b/tests/diff/tiers-SetBool.out
@@ -1,11 +1,3 @@
-tiers :: [Set Bool]  =
-  [ [Set []]
-  , [ Set [False]
-    , Set [True]
-    ]
-  , [Set [False,True]]
-  ]
-
 map length (tiers :: [[ Set Bool ]])  =  [1,2,1]
 
 length (list :: [ Set Bool ])  =  4
@@ -13,3 +5,11 @@
 allUnique (list :: [ Set Bool ])  =  True
 
 ratioRepetitions (list :: [ Set Bool ])  =  0 % 1
+
+tiers :: [Set Bool]  =
+  [ [Set []]
+  , [ Set [False]
+    , Set [True]
+    ]
+  , [Set [False,True]]
+  ]
diff --git a/tests/diff/tiers-SetNat.out b/tests/diff/tiers-SetNat.out
--- a/tests/diff/tiers-SetNat.out
+++ b/tests/diff/tiers-SetNat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Set Nat ]])  =  [1,1,1,2,2,3,4,5,6,8,10,12,...]
+
+length (list :: [ Set Nat ])  =  Infinity
+
+allUnique (list :: [ Set Nat ])  =  True
+
+ratioRepetitions (list :: [ Set Nat ])  =  0 % 1
+
 tiers :: [Set Nat]  =
   [ [Set []]
   , [Set [0]]
@@ -65,11 +73,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Set Nat ]])  =  [1,1,1,2,2,3,4,5,6,8,10,12,...]
-
-length (list :: [ Set Nat ])  =  Infinity
-
-allUnique (list :: [ Set Nat ])  =  True
-
-ratioRepetitions (list :: [ Set Nat ])  =  0 % 1
diff --git a/tests/diff/tiers-SetNat2.out b/tests/diff/tiers-SetNat2.out
--- a/tests/diff/tiers-SetNat2.out
+++ b/tests/diff/tiers-SetNat2.out
@@ -1,10 +1,3 @@
-tiers :: [Set Nat2]  =
-  [ [Set []]
-  , [Set [0]]
-  , [Set [1]]
-  , [Set [0,1]]
-  ]
-
 map length (tiers :: [[ Set Nat2 ]])  =  [1,1,1,1]
 
 length (list :: [ Set Nat2 ])  =  4
@@ -12,3 +5,10 @@
 allUnique (list :: [ Set Nat2 ])  =  True
 
 ratioRepetitions (list :: [ Set Nat2 ])  =  0 % 1
+
+tiers :: [Set Nat2]  =
+  [ [Set []]
+  , [Set [0]]
+  , [Set [1]]
+  , [Set [0,1]]
+  ]
diff --git a/tests/diff/tiers-SetNat3.out b/tests/diff/tiers-SetNat3.out
--- a/tests/diff/tiers-SetNat3.out
+++ b/tests/diff/tiers-SetNat3.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Set Nat3 ]])  =  [1,1,1,2,1,1,1]
+
+length (list :: [ Set Nat3 ])  =  8
+
+allUnique (list :: [ Set Nat3 ])  =  True
+
+ratioRepetitions (list :: [ Set Nat3 ])  =  0 % 1
+
 tiers :: [Set Nat3]  =
   [ [Set []]
   , [Set [0]]
@@ -9,11 +17,3 @@
   , [Set [1,2]]
   , [Set [0,1,2]]
   ]
-
-map length (tiers :: [[ Set Nat3 ]])  =  [1,1,1,2,1,1,1]
-
-length (list :: [ Set Nat3 ])  =  8
-
-allUnique (list :: [ Set Nat3 ])  =  True
-
-ratioRepetitions (list :: [ Set Nat3 ])  =  0 % 1
diff --git a/tests/diff/tiers-SetU.out b/tests/diff/tiers-SetU.out
--- a/tests/diff/tiers-SetU.out
+++ b/tests/diff/tiers-SetU.out
@@ -1,8 +1,3 @@
-tiers :: [Set ()]  =
-  [ [Set []]
-  , [Set [()]]
-  ]
-
 map length (tiers :: [[ Set () ]])  =  [1,1]
 
 length (list :: [ Set () ])  =  2
@@ -10,3 +5,8 @@
 allUnique (list :: [ Set () ])  =  True
 
 ratioRepetitions (list :: [ Set () ])  =  0 % 1
+
+tiers :: [Set ()]  =
+  [ [Set []]
+  , [Set [()]]
+  ]
diff --git a/tests/diff/tiers-String.out b/tests/diff/tiers-String.out
--- a/tests/diff/tiers-String.out
+++ b/tests/diff/tiers-String.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ String ]])  =  [1,1,2,4,8,16,...]
+
+length (list :: [ String ])  =  Infinity
+
+allUnique (list :: [ String ])  =  True
+
+ratioRepetitions (list :: [ String ])  =  0 % 1
+
 tiers :: [String]  =
   [ [""]
   , ["a"]
@@ -37,11 +45,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ String ]])  =  [1,1,2,4,8,16,...]
-
-length (list :: [ String ])  =  Infinity
-
-allUnique (list :: [ String ])  =  True
-
-ratioRepetitions (list :: [ String ])  =  0 % 1
diff --git a/tests/diff/tiers-U,Us.out b/tests/diff/tiers-U,Us.out
--- a/tests/diff/tiers-U,Us.out
+++ b/tests/diff/tiers-U,Us.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [((),())] ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
+
+length (list :: [ [((),())] ])  =  Infinity
+
+allUnique (list :: [ [((),())] ])  =  True
+
+ratioRepetitions (list :: [ [((),())] ])  =  0 % 1
+
 tiers :: [[((),())]]  =
   [ [[]]
   , [[((),())]]
@@ -13,11 +21,3 @@
   , [[((),()),((),()),((),()),((),()),((),()),((),()),((),()),((),()),((),()),((),()),((),())]]
   , ...
   ]
-
-map length (tiers :: [[ [((),())] ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
-
-length (list :: [ [((),())] ])  =  Infinity
-
-allUnique (list :: [ [((),())] ])  =  True
-
-ratioRepetitions (list :: [ [((),())] ])  =  0 % 1
diff --git a/tests/diff/tiers-Us,Us.out b/tests/diff/tiers-Us,Us.out
--- a/tests/diff/tiers-Us,Us.out
+++ b/tests/diff/tiers-Us,Us.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ ([()],[()]) ]])  =  [1,2,3,4,5,6,7,8,9,10,11,12,...]
+
+length (list :: [ ([()],[()]) ])  =  Infinity
+
+allUnique (list :: [ ([()],[()]) ])  =  True
+
+ratioRepetitions (list :: [ ([()],[()]) ])  =  0 % 1
+
 tiers :: [([()],[()])]  =
   [ [([],[])]
   , [ ([],[()])
@@ -90,11 +98,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ ([()],[()]) ]])  =  [1,2,3,4,5,6,7,8,9,10,11,12,...]
-
-length (list :: [ ([()],[()]) ])  =  Infinity
-
-allUnique (list :: [ ([()],[()]) ])  =  True
-
-ratioRepetitions (list :: [ ([()],[()]) ])  =  0 % 1
diff --git a/tests/diff/tiers-Us.out b/tests/diff/tiers-Us.out
--- a/tests/diff/tiers-Us.out
+++ b/tests/diff/tiers-Us.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [()] ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
+
+length (list :: [ [()] ])  =  Infinity
+
+allUnique (list :: [ [()] ])  =  True
+
+ratioRepetitions (list :: [ [()] ])  =  0 % 1
+
 tiers :: [[()]]  =
   [ [[]]
   , [[()]]
@@ -13,11 +21,3 @@
   , [[(),(),(),(),(),(),(),(),(),(),()]]
   , ...
   ]
-
-map length (tiers :: [[ [()] ]])  =  [1,1,1,1,1,1,1,1,1,1,1,1,...]
-
-length (list :: [ [()] ])  =  Infinity
-
-allUnique (list :: [ [()] ])  =  True
-
-ratioRepetitions (list :: [ [()] ])  =  0 % 1
diff --git a/tests/diff/tiers-colistable-Bool-Bool.out b/tests/diff/tiers-colistable-Bool-Bool.out
--- a/tests/diff/tiers-colistable-Bool-Bool.out
+++ b/tests/diff/tiers-colistable-Bool-Bool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bool->Bool ]])  =  [4]
+
+length (list :: [ Bool->Bool ])  =  4
+
+allUnique (list :: [ Bool->Bool ])  =  True
+
+ratioRepetitions (list :: [ Bool->Bool ])  =  0 % 1
+
 tiers :: [Bool->Bool]  =
   [ [ \x -> case x of
               False -> False
@@ -13,11 +21,3 @@
               True -> True
     ]
   ]
-
-map length (tiers :: [[ Bool->Bool ]])  =  [4]
-
-length (list :: [ Bool->Bool ])  =  4
-
-allUnique (list :: [ Bool->Bool ])  =  True
-
-ratioRepetitions (list :: [ Bool->Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-colistable-Bool-MBool.out b/tests/diff/tiers-colistable-Bool-MBool.out
--- a/tests/diff/tiers-colistable-Bool-MBool.out
+++ b/tests/diff/tiers-colistable-Bool-MBool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bool->Maybe Bool ]])  =  [1,4,4]
+
+length (list :: [ Bool->Maybe Bool ])  =  9
+
+allUnique (list :: [ Bool->Maybe Bool ])  =  True
+
+ratioRepetitions (list :: [ Bool->Maybe Bool ])  =  0 % 1
+
 tiers :: [Bool->Maybe Bool]  =
   [ [ \x -> case x of
               False -> Nothing
@@ -30,11 +38,3 @@
               True -> Just True
     ]
   ]
-
-map length (tiers :: [[ Bool->Maybe Bool ]])  =  [1,4,4]
-
-length (list :: [ Bool->Maybe Bool ])  =  9
-
-allUnique (list :: [ Bool->Maybe Bool ])  =  True
-
-ratioRepetitions (list :: [ Bool->Maybe Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-colistable-Bool-U.out b/tests/diff/tiers-colistable-Bool-U.out
--- a/tests/diff/tiers-colistable-Bool-U.out
+++ b/tests/diff/tiers-colistable-Bool-U.out
@@ -1,10 +1,3 @@
-tiers :: [Bool->()]  =
-  [ [ \x -> case x of
-              False -> ()
-              True -> ()
-    ]
-  ]
-
 map length (tiers :: [[ Bool->() ]])  =  [1]
 
 length (list :: [ Bool->() ])  =  1
@@ -12,3 +5,10 @@
 allUnique (list :: [ Bool->() ])  =  True
 
 ratioRepetitions (list :: [ Bool->() ])  =  0 % 1
+
+tiers :: [Bool->()]  =
+  [ [ \x -> case x of
+              False -> ()
+              True -> ()
+    ]
+  ]
diff --git a/tests/diff/tiers-colistable-Bools-Bools.out b/tests/diff/tiers-colistable-Bools-Bools.out
--- a/tests/diff/tiers-colistable-Bools-Bools.out
+++ b/tests/diff/tiers-colistable-Bools-Bools.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Bool]->[Bool] ]])  =  [1,3,12,57,...]
+
+length (list :: [ [Bool]->[Bool] ])  =  Infinity
+
+allUnique (list :: [ [Bool]->[Bool] ])  =  False
+
+ratioRepetitions (list :: [ [Bool]->[Bool] ])  =  16 % 73
+
 tiers :: [[Bool]->[Bool]]  =
   [ [ \x -> case x of
               [] -> []
@@ -735,11 +743,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Bool]->[Bool] ]])  =  [1,3,12,57,...]
-
-length (list :: [ [Bool]->[Bool] ])  =  Infinity
-
-allUnique (list :: [ [Bool]->[Bool] ])  =  False
-
-ratioRepetitions (list :: [ [Bool]->[Bool] ])  =  16 % 73
diff --git a/tests/diff/tiers-colistable-Int-Int-Int.out b/tests/diff/tiers-colistable-Int-Int-Int.out
--- a/tests/diff/tiers-colistable-Int-Int-Int.out
+++ b/tests/diff/tiers-colistable-Int-Int-Int.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Int->Int->Int ]])  =  [1,3,11,46,...]
+
+length (list :: [ Int->Int->Int ])  =  Infinity
+
+allUnique (list :: [ Int->Int->Int ])  =  False
+
+ratioRepetitions (list :: [ Int->Int->Int ])  =  37 % 61
+
 tiers :: [Int->Int->Int]  =
   [ [ \x y -> case (x,y) of
                 (0,0) -> 0
@@ -615,11 +623,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Int->Int->Int ]])  =  [1,3,11,46,...]
-
-length (list :: [ Int->Int->Int ])  =  Infinity
-
-allUnique (list :: [ Int->Int->Int ])  =  False
-
-ratioRepetitions (list :: [ Int->Int->Int ])  =  37 % 61
diff --git a/tests/diff/tiers-colistable-Int-Int.out b/tests/diff/tiers-colistable-Int-Int.out
--- a/tests/diff/tiers-colistable-Int-Int.out
+++ b/tests/diff/tiers-colistable-Int-Int.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Int->Int ]])  =  [1,2,5,15,51,188,...]
+
+length (list :: [ Int->Int ])  =  Infinity
+
+allUnique (list :: [ Int->Int ])  =  False
+
+ratioRepetitions (list :: [ Int->Int ])  =  96 % 131
+
 tiers :: [Int->Int]  =
   [ [ \x -> case x of
               0 -> 0
@@ -2627,11 +2635,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Int->Int ]])  =  [1,2,5,15,51,188,...]
-
-length (list :: [ Int->Int ])  =  Infinity
-
-allUnique (list :: [ Int->Int ])  =  False
-
-ratioRepetitions (list :: [ Int->Int ])  =  96 % 131
diff --git a/tests/diff/tiers-colistable-Ints-Ints.out b/tests/diff/tiers-colistable-Ints-Ints.out
--- a/tests/diff/tiers-colistable-Ints-Ints.out
+++ b/tests/diff/tiers-colistable-Ints-Ints.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Int]->[Int] ]])  =  [1,2,6,21,...]
+
+length (list :: [ [Int]->[Int] ])  =  Infinity
+
+allUnique (list :: [ [Int]->[Int] ])  =  False
+
+ratioRepetitions (list :: [ [Int]->[Int] ])  =  2 % 5
+
 tiers :: [[Int]->[Int]]  =
   [ [ \x -> case x of
               [] -> []
@@ -305,11 +313,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Int]->[Int] ]])  =  [1,2,6,21,...]
-
-length (list :: [ [Int]->[Int] ])  =  Infinity
-
-allUnique (list :: [ [Int]->[Int] ])  =  False
-
-ratioRepetitions (list :: [ [Int]->[Int] ])  =  2 % 5
diff --git a/tests/diff/tiers-colistable-MBool-Bool.out b/tests/diff/tiers-colistable-MBool-Bool.out
--- a/tests/diff/tiers-colistable-MBool-Bool.out
+++ b/tests/diff/tiers-colistable-MBool-Bool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Maybe Bool->Bool ]])  =  [8]
+
+length (list :: [ Maybe Bool->Bool ])  =  8
+
+allUnique (list :: [ Maybe Bool->Bool ])  =  True
+
+ratioRepetitions (list :: [ Maybe Bool->Bool ])  =  0 % 1
+
 tiers :: [Maybe Bool->Bool]  =
   [ [ \x -> case x of
               Nothing -> False
@@ -33,11 +41,3 @@
               Just True -> True
     ]
   ]
-
-map length (tiers :: [[ Maybe Bool->Bool ]])  =  [8]
-
-length (list :: [ Maybe Bool->Bool ])  =  8
-
-allUnique (list :: [ Maybe Bool->Bool ])  =  True
-
-ratioRepetitions (list :: [ Maybe Bool->Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-colistable-MBool-MBool.out b/tests/diff/tiers-colistable-MBool-MBool.out
--- a/tests/diff/tiers-colistable-MBool-MBool.out
+++ b/tests/diff/tiers-colistable-MBool-MBool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Maybe Bool->Maybe Bool ]])  =  [1,6,12,8]
+
+length (list :: [ Maybe Bool->Maybe Bool ])  =  Infinity
+
+allUnique (list :: [ Maybe Bool->Maybe Bool ])  =  True
+
+ratioRepetitions (list :: [ Maybe Bool->Maybe Bool ])  =  0 % 1
+
 tiers :: [Maybe Bool->Maybe Bool]  =
   [ [ \x -> case x of
               Nothing -> Nothing
@@ -112,11 +120,3 @@
               Just True -> Just True
     ]
   ]
-
-map length (tiers :: [[ Maybe Bool->Maybe Bool ]])  =  [1,6,12,8]
-
-length (list :: [ Maybe Bool->Maybe Bool ])  =  Infinity
-
-allUnique (list :: [ Maybe Bool->Maybe Bool ])  =  True
-
-ratioRepetitions (list :: [ Maybe Bool->Maybe Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-colistable-Nat,Nat-Nat.out b/tests/diff/tiers-colistable-Nat,Nat-Nat.out
--- a/tests/diff/tiers-colistable-Nat,Nat-Nat.out
+++ b/tests/diff/tiers-colistable-Nat,Nat-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ (Nat,Nat)->Nat ]])  =  [1,3,11,46,...]
+
+length (list :: [ (Nat,Nat)->Nat ])  =  Infinity
+
+allUnique (list :: [ (Nat,Nat)->Nat ])  =  False
+
+ratioRepetitions (list :: [ (Nat,Nat)->Nat ])  =  37 % 61
+
 tiers :: [(Nat,Nat)->Nat]  =
   [ [ \x -> case x of
               (0,0) -> 0
@@ -615,11 +623,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ (Nat,Nat)->Nat ]])  =  [1,3,11,46,...]
-
-length (list :: [ (Nat,Nat)->Nat ])  =  Infinity
-
-allUnique (list :: [ (Nat,Nat)->Nat ])  =  False
-
-ratioRepetitions (list :: [ (Nat,Nat)->Nat ])  =  37 % 61
diff --git a/tests/diff/tiers-colistable-Nat-Nat-Nat.out b/tests/diff/tiers-colistable-Nat-Nat-Nat.out
--- a/tests/diff/tiers-colistable-Nat-Nat-Nat.out
+++ b/tests/diff/tiers-colistable-Nat-Nat-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat->Nat->Nat ]])  =  [1,3,11,46,...]
+
+length (list :: [ Nat->Nat->Nat ])  =  Infinity
+
+allUnique (list :: [ Nat->Nat->Nat ])  =  False
+
+ratioRepetitions (list :: [ Nat->Nat->Nat ])  =  37 % 61
+
 tiers :: [Nat->Nat->Nat]  =
   [ [ \x y -> case (x,y) of
                 (0,0) -> 0
@@ -615,11 +623,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Nat->Nat->Nat ]])  =  [1,3,11,46,...]
-
-length (list :: [ Nat->Nat->Nat ])  =  Infinity
-
-allUnique (list :: [ Nat->Nat->Nat ])  =  False
-
-ratioRepetitions (list :: [ Nat->Nat->Nat ])  =  37 % 61
diff --git a/tests/diff/tiers-colistable-Nat-Nat.out b/tests/diff/tiers-colistable-Nat-Nat.out
--- a/tests/diff/tiers-colistable-Nat-Nat.out
+++ b/tests/diff/tiers-colistable-Nat-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat->Nat ]])  =  [1,2,5,15,51,188,...]
+
+length (list :: [ Nat->Nat ])  =  Infinity
+
+allUnique (list :: [ Nat->Nat ])  =  False
+
+ratioRepetitions (list :: [ Nat->Nat ])  =  82 % 131
+
 tiers :: [Nat->Nat]  =
   [ [ \x -> case x of
               0 -> 0
@@ -2627,11 +2635,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Nat->Nat ]])  =  [1,2,5,15,51,188,...]
-
-length (list :: [ Nat->Nat ])  =  Infinity
-
-allUnique (list :: [ Nat->Nat ])  =  False
-
-ratioRepetitions (list :: [ Nat->Nat ])  =  82 % 131
diff --git a/tests/diff/tiers-colistable-Nat-U.out b/tests/diff/tiers-colistable-Nat-U.out
--- a/tests/diff/tiers-colistable-Nat-U.out
+++ b/tests/diff/tiers-colistable-Nat-U.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat->() ]])  =  [1,1,2,5,14,42,...]
+
+length (list :: [ Nat->() ])  =  Infinity
+
+allUnique (list :: [ Nat->() ])  =  False
+
+ratioRepetitions (list :: [ Nat->() ])  =  64 % 65
+
 tiers :: [Nat->()]  =
   [ [ \x -> case x of
               0 -> ()
@@ -657,11 +665,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Nat->() ]])  =  [1,1,2,5,14,42,...]
-
-length (list :: [ Nat->() ])  =  Infinity
-
-allUnique (list :: [ Nat->() ])  =  False
-
-ratioRepetitions (list :: [ Nat->() ])  =  64 % 65
diff --git a/tests/diff/tiers-colistable-Nat2-Nat2.out b/tests/diff/tiers-colistable-Nat2-Nat2.out
--- a/tests/diff/tiers-colistable-Nat2-Nat2.out
+++ b/tests/diff/tiers-colistable-Nat2-Nat2.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat2->Nat2 ]])  =  [1,2,1]
+
+length (list :: [ Nat2->Nat2 ])  =  4
+
+allUnique (list :: [ Nat2->Nat2 ])  =  True
+
+ratioRepetitions (list :: [ Nat2->Nat2 ])  =  0 % 1
+
 tiers :: [Nat2->Nat2]  =
   [ [ \x -> case x of
               0 -> 0
@@ -15,11 +23,3 @@
               1 -> 1
     ]
   ]
-
-map length (tiers :: [[ Nat2->Nat2 ]])  =  [1,2,1]
-
-length (list :: [ Nat2->Nat2 ])  =  4
-
-allUnique (list :: [ Nat2->Nat2 ])  =  True
-
-ratioRepetitions (list :: [ Nat2->Nat2 ])  =  0 % 1
diff --git a/tests/diff/tiers-colistable-Nat2-Nat3.out b/tests/diff/tiers-colistable-Nat2-Nat3.out
--- a/tests/diff/tiers-colistable-Nat2-Nat3.out
+++ b/tests/diff/tiers-colistable-Nat2-Nat3.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat2->Nat3 ]])  =  [1,2,3,2,1]
+
+length (list :: [ Nat2->Nat3 ])  =  9
+
+allUnique (list :: [ Nat2->Nat3 ])  =  True
+
+ratioRepetitions (list :: [ Nat2->Nat3 ])  =  0 % 1
+
 tiers :: [Nat2->Nat3]  =
   [ [ \x -> case x of
               0 -> 0
@@ -32,11 +40,3 @@
               1 -> 2
     ]
   ]
-
-map length (tiers :: [[ Nat2->Nat3 ]])  =  [1,2,3,2,1]
-
-length (list :: [ Nat2->Nat3 ])  =  9
-
-allUnique (list :: [ Nat2->Nat3 ])  =  True
-
-ratioRepetitions (list :: [ Nat2->Nat3 ])  =  0 % 1
diff --git a/tests/diff/tiers-colistable-Nat3-Nat2.out b/tests/diff/tiers-colistable-Nat3-Nat2.out
--- a/tests/diff/tiers-colistable-Nat3-Nat2.out
+++ b/tests/diff/tiers-colistable-Nat3-Nat2.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat3->Nat2 ]])  =  [1,3,3,1]
+
+length (list :: [ Nat3->Nat2 ])  =  8
+
+allUnique (list :: [ Nat3->Nat2 ])  =  True
+
+ratioRepetitions (list :: [ Nat3->Nat2 ])  =  0 % 1
+
 tiers :: [Nat3->Nat2]  =
   [ [ \x -> case x of
               0 -> 0
@@ -36,11 +44,3 @@
               2 -> 1
     ]
   ]
-
-map length (tiers :: [[ Nat3->Nat2 ]])  =  [1,3,3,1]
-
-length (list :: [ Nat3->Nat2 ])  =  8
-
-allUnique (list :: [ Nat3->Nat2 ])  =  True
-
-ratioRepetitions (list :: [ Nat3->Nat2 ])  =  0 % 1
diff --git a/tests/diff/tiers-colistable-Nat3-Nat3.out b/tests/diff/tiers-colistable-Nat3-Nat3.out
--- a/tests/diff/tiers-colistable-Nat3-Nat3.out
+++ b/tests/diff/tiers-colistable-Nat3-Nat3.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat3->Nat3 ]])  =  [1,3,6,7,6,3,1]
+
+length (list :: [ Nat3->Nat3 ])  =  Infinity
+
+allUnique (list :: [ Nat3->Nat3 ])  =  True
+
+ratioRepetitions (list :: [ Nat3->Nat3 ])  =  0 % 1
+
 tiers :: [Nat3->Nat3]  =
   [ [ \x -> case x of
               0 -> 0
@@ -115,11 +123,3 @@
               2 -> 2
     ]
   ]
-
-map length (tiers :: [[ Nat3->Nat3 ]])  =  [1,3,6,7,6,3,1]
-
-length (list :: [ Nat3->Nat3 ])  =  Infinity
-
-allUnique (list :: [ Nat3->Nat3 ])  =  True
-
-ratioRepetitions (list :: [ Nat3->Nat3 ])  =  0 % 1
diff --git a/tests/diff/tiers-colistable-Nats-Nats.out b/tests/diff/tiers-colistable-Nats-Nats.out
--- a/tests/diff/tiers-colistable-Nats-Nats.out
+++ b/tests/diff/tiers-colistable-Nats-Nats.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Nat]->[Nat] ]])  =  [1,2,6,21,...]
+
+length (list :: [ [Nat]->[Nat] ])  =  Infinity
+
+allUnique (list :: [ [Nat]->[Nat] ])  =  False
+
+ratioRepetitions (list :: [ [Nat]->[Nat] ])  =  2 % 5
+
 tiers :: [[Nat]->[Nat]]  =
   [ [ \x -> case x of
               [] -> []
@@ -305,11 +313,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Nat]->[Nat] ]])  =  [1,2,6,21,...]
-
-length (list :: [ [Nat]->[Nat] ])  =  Infinity
-
-allUnique (list :: [ [Nat]->[Nat] ])  =  False
-
-ratioRepetitions (list :: [ [Nat]->[Nat] ])  =  2 % 5
diff --git a/tests/diff/tiers-colistable-U-Bool.out b/tests/diff/tiers-colistable-U-Bool.out
--- a/tests/diff/tiers-colistable-U-Bool.out
+++ b/tests/diff/tiers-colistable-U-Bool.out
@@ -1,11 +1,3 @@
-tiers :: [()->Bool]  =
-  [ [ \x -> case x of
-              () -> False
-    , \x -> case x of
-              () -> True
-    ]
-  ]
-
 map length (tiers :: [[ ()->Bool ]])  =  [2]
 
 length (list :: [ ()->Bool ])  =  2
@@ -13,3 +5,11 @@
 allUnique (list :: [ ()->Bool ])  =  True
 
 ratioRepetitions (list :: [ ()->Bool ])  =  0 % 1
+
+tiers :: [()->Bool]  =
+  [ [ \x -> case x of
+              () -> False
+    , \x -> case x of
+              () -> True
+    ]
+  ]
diff --git a/tests/diff/tiers-colistable-U-Nat.out b/tests/diff/tiers-colistable-U-Nat.out
--- a/tests/diff/tiers-colistable-U-Nat.out
+++ b/tests/diff/tiers-colistable-U-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ ()->Nat ]])  =  [1,1,1,1,1,1,...]
+
+length (list :: [ ()->Nat ])  =  Infinity
+
+allUnique (list :: [ ()->Nat ])  =  True
+
+ratioRepetitions (list :: [ ()->Nat ])  =  0 % 1
+
 tiers :: [()->Nat]  =
   [ [ \x -> case x of
               () -> 0
@@ -19,11 +27,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ ()->Nat ]])  =  [1,1,1,1,1,1,...]
-
-length (list :: [ ()->Nat ])  =  Infinity
-
-allUnique (list :: [ ()->Nat ])  =  True
-
-ratioRepetitions (list :: [ ()->Nat ])  =  0 % 1
diff --git a/tests/diff/tiers-colistable-U-U.out b/tests/diff/tiers-colistable-U-U.out
--- a/tests/diff/tiers-colistable-U-U.out
+++ b/tests/diff/tiers-colistable-U-U.out
@@ -1,9 +1,3 @@
-tiers :: [()->()]  =
-  [ [ \x -> case x of
-              () -> ()
-    ]
-  ]
-
 map length (tiers :: [[ ()->() ]])  =  [1]
 
 length (list :: [ ()->() ])  =  1
@@ -11,3 +5,9 @@
 allUnique (list :: [ ()->() ])  =  True
 
 ratioRepetitions (list :: [ ()->() ])  =  0 % 1
+
+tiers :: [()->()]  =
+  [ [ \x -> case x of
+              () -> ()
+    ]
+  ]
diff --git a/tests/diff/tiers-colistable-Us-Us.out b/tests/diff/tiers-colistable-Us-Us.out
--- a/tests/diff/tiers-colistable-Us-Us.out
+++ b/tests/diff/tiers-colistable-Us-Us.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [()]->[()] ]])  =  [1,2,4,8,...]
+
+length (list :: [ [()]->[()] ])  =  Infinity
+
+allUnique (list :: [ [()]->[()] ])  =  False
+
+ratioRepetitions (list :: [ [()]->[()] ])  =  1 % 3
+
 tiers :: [[()]->[()]]  =
   [ [ \x -> case x of
               [] -> []
@@ -155,11 +163,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [()]->[()] ]])  =  [1,2,4,8,...]
-
-length (list :: [ [()]->[()] ])  =  Infinity
-
-allUnique (list :: [ [()]->[()] ])  =  False
-
-ratioRepetitions (list :: [ [()]->[()] ])  =  1 % 3
diff --git a/tests/diff/tiers-funlistable-Bool-Bool.out b/tests/diff/tiers-funlistable-Bool-Bool.out
--- a/tests/diff/tiers-funlistable-Bool-Bool.out
+++ b/tests/diff/tiers-funlistable-Bool-Bool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bool->Bool ]])  =  [4]
+
+length (list :: [ Bool->Bool ])  =  4
+
+allUnique (list :: [ Bool->Bool ])  =  True
+
+ratioRepetitions (list :: [ Bool->Bool ])  =  0 % 1
+
 tiers :: [Bool->Bool]  =
   [ [ \x -> case x of
               False -> False
@@ -13,11 +21,3 @@
               True -> True
     ]
   ]
-
-map length (tiers :: [[ Bool->Bool ]])  =  [4]
-
-length (list :: [ Bool->Bool ])  =  4
-
-allUnique (list :: [ Bool->Bool ])  =  True
-
-ratioRepetitions (list :: [ Bool->Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-funlistable-Bool-MBool.out b/tests/diff/tiers-funlistable-Bool-MBool.out
--- a/tests/diff/tiers-funlistable-Bool-MBool.out
+++ b/tests/diff/tiers-funlistable-Bool-MBool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bool->Maybe Bool ]])  =  [1,4,4]
+
+length (list :: [ Bool->Maybe Bool ])  =  9
+
+allUnique (list :: [ Bool->Maybe Bool ])  =  True
+
+ratioRepetitions (list :: [ Bool->Maybe Bool ])  =  0 % 1
+
 tiers :: [Bool->Maybe Bool]  =
   [ [ \x -> case x of
               False -> Nothing
@@ -30,11 +38,3 @@
               True -> Just True
     ]
   ]
-
-map length (tiers :: [[ Bool->Maybe Bool ]])  =  [1,4,4]
-
-length (list :: [ Bool->Maybe Bool ])  =  9
-
-allUnique (list :: [ Bool->Maybe Bool ])  =  True
-
-ratioRepetitions (list :: [ Bool->Maybe Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-funlistable-Bool-U.out b/tests/diff/tiers-funlistable-Bool-U.out
--- a/tests/diff/tiers-funlistable-Bool-U.out
+++ b/tests/diff/tiers-funlistable-Bool-U.out
@@ -1,10 +1,3 @@
-tiers :: [Bool->()]  =
-  [ [ \x -> case x of
-              False -> ()
-              True -> ()
-    ]
-  ]
-
 map length (tiers :: [[ Bool->() ]])  =  [1]
 
 length (list :: [ Bool->() ])  =  1
@@ -12,3 +5,10 @@
 allUnique (list :: [ Bool->() ])  =  True
 
 ratioRepetitions (list :: [ Bool->() ])  =  0 % 1
+
+tiers :: [Bool->()]  =
+  [ [ \x -> case x of
+              False -> ()
+              True -> ()
+    ]
+  ]
diff --git a/tests/diff/tiers-funlistable-Bools-Bools.out b/tests/diff/tiers-funlistable-Bools-Bools.out
--- a/tests/diff/tiers-funlistable-Bools-Bools.out
+++ b/tests/diff/tiers-funlistable-Bools-Bools.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Bool]->[Bool] ]])  =  [1,2,4,8,...]
+
+length (list :: [ [Bool]->[Bool] ])  =  Infinity
+
+allUnique (list :: [ [Bool]->[Bool] ])  =  True
+
+ratioRepetitions (list :: [ [Bool]->[Bool] ])  =  0 % 1
+
 tiers :: [[Bool]->[Bool]]  =
   [ [ \x -> case x of
               [] -> []
@@ -155,11 +163,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Bool]->[Bool] ]])  =  [1,2,4,8,...]
-
-length (list :: [ [Bool]->[Bool] ])  =  Infinity
-
-allUnique (list :: [ [Bool]->[Bool] ])  =  True
-
-ratioRepetitions (list :: [ [Bool]->[Bool] ])  =  0 % 1
diff --git a/tests/diff/tiers-funlistable-Int-Int-Int.out b/tests/diff/tiers-funlistable-Int-Int-Int.out
--- a/tests/diff/tiers-funlistable-Int-Int-Int.out
+++ b/tests/diff/tiers-funlistable-Int-Int-Int.out
@@ -1,6 +1,3 @@
-tiers :: [Int->Int->Int]  =
-  [[]]
-
 map length (tiers :: [[ Int->Int->Int ]])  =  [0]
 
 length (list :: [ Int->Int->Int ])  =  0
@@ -8,3 +5,6 @@
 allUnique (list :: [ Int->Int->Int ])  =  True
 
 ratioRepetitions (list :: [ Int->Int->Int ])  =  0 % 1
+
+tiers :: [Int->Int->Int]  =
+  [[]]
diff --git a/tests/diff/tiers-funlistable-Int-Int.out b/tests/diff/tiers-funlistable-Int-Int.out
--- a/tests/diff/tiers-funlistable-Int-Int.out
+++ b/tests/diff/tiers-funlistable-Int-Int.out
@@ -1,6 +1,3 @@
-tiers :: [Int->Int]  =
-  [[]]
-
 map length (tiers :: [[ Int->Int ]])  =  [0]
 
 length (list :: [ Int->Int ])  =  0
@@ -8,3 +5,6 @@
 allUnique (list :: [ Int->Int ])  =  True
 
 ratioRepetitions (list :: [ Int->Int ])  =  0 % 1
+
+tiers :: [Int->Int]  =
+  [[]]
diff --git a/tests/diff/tiers-funlistable-Ints-Ints.out b/tests/diff/tiers-funlistable-Ints-Ints.out
--- a/tests/diff/tiers-funlistable-Ints-Ints.out
+++ b/tests/diff/tiers-funlistable-Ints-Ints.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Int]->[Int] ]])  =  [1,1,2,4,...]
+
+length (list :: [ [Int]->[Int] ])  =  Infinity
+
+allUnique (list :: [ [Int]->[Int] ])  =  True
+
+ratioRepetitions (list :: [ [Int]->[Int] ])  =  0 % 1
+
 tiers :: [[Int]->[Int]]  =
   [ [ \x -> case x of
               [] -> []
@@ -85,11 +93,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Int]->[Int] ]])  =  [1,1,2,4,...]
-
-length (list :: [ [Int]->[Int] ])  =  Infinity
-
-allUnique (list :: [ [Int]->[Int] ])  =  True
-
-ratioRepetitions (list :: [ [Int]->[Int] ])  =  0 % 1
diff --git a/tests/diff/tiers-funlistable-MBool-Bool.out b/tests/diff/tiers-funlistable-MBool-Bool.out
--- a/tests/diff/tiers-funlistable-MBool-Bool.out
+++ b/tests/diff/tiers-funlistable-MBool-Bool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Maybe Bool->Bool ]])  =  [8]
+
+length (list :: [ Maybe Bool->Bool ])  =  8
+
+allUnique (list :: [ Maybe Bool->Bool ])  =  True
+
+ratioRepetitions (list :: [ Maybe Bool->Bool ])  =  0 % 1
+
 tiers :: [Maybe Bool->Bool]  =
   [ [ \x -> case x of
               Nothing -> False
@@ -33,11 +41,3 @@
               Just True -> True
     ]
   ]
-
-map length (tiers :: [[ Maybe Bool->Bool ]])  =  [8]
-
-length (list :: [ Maybe Bool->Bool ])  =  8
-
-allUnique (list :: [ Maybe Bool->Bool ])  =  True
-
-ratioRepetitions (list :: [ Maybe Bool->Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-funlistable-MBool-MBool.out b/tests/diff/tiers-funlistable-MBool-MBool.out
--- a/tests/diff/tiers-funlistable-MBool-MBool.out
+++ b/tests/diff/tiers-funlistable-MBool-MBool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Maybe Bool->Maybe Bool ]])  =  [1,6,12,8]
+
+length (list :: [ Maybe Bool->Maybe Bool ])  =  Infinity
+
+allUnique (list :: [ Maybe Bool->Maybe Bool ])  =  True
+
+ratioRepetitions (list :: [ Maybe Bool->Maybe Bool ])  =  0 % 1
+
 tiers :: [Maybe Bool->Maybe Bool]  =
   [ [ \x -> case x of
               Nothing -> Nothing
@@ -112,11 +120,3 @@
               Just True -> Just True
     ]
   ]
-
-map length (tiers :: [[ Maybe Bool->Maybe Bool ]])  =  [1,6,12,8]
-
-length (list :: [ Maybe Bool->Maybe Bool ])  =  Infinity
-
-allUnique (list :: [ Maybe Bool->Maybe Bool ])  =  True
-
-ratioRepetitions (list :: [ Maybe Bool->Maybe Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-funlistable-Nat,Nat-Nat.out b/tests/diff/tiers-funlistable-Nat,Nat-Nat.out
--- a/tests/diff/tiers-funlistable-Nat,Nat-Nat.out
+++ b/tests/diff/tiers-funlistable-Nat,Nat-Nat.out
@@ -1,6 +1,3 @@
-tiers :: [(Nat,Nat)->Nat]  =
-  [[]]
-
 map length (tiers :: [[ (Nat,Nat)->Nat ]])  =  [0]
 
 length (list :: [ (Nat,Nat)->Nat ])  =  0
@@ -8,3 +5,6 @@
 allUnique (list :: [ (Nat,Nat)->Nat ])  =  True
 
 ratioRepetitions (list :: [ (Nat,Nat)->Nat ])  =  0 % 1
+
+tiers :: [(Nat,Nat)->Nat]  =
+  [[]]
diff --git a/tests/diff/tiers-funlistable-Nat-Nat-Nat.out b/tests/diff/tiers-funlistable-Nat-Nat-Nat.out
--- a/tests/diff/tiers-funlistable-Nat-Nat-Nat.out
+++ b/tests/diff/tiers-funlistable-Nat-Nat-Nat.out
@@ -1,6 +1,3 @@
-tiers :: [Nat->Nat->Nat]  =
-  [[]]
-
 map length (tiers :: [[ Nat->Nat->Nat ]])  =  [0]
 
 length (list :: [ Nat->Nat->Nat ])  =  0
@@ -8,3 +5,6 @@
 allUnique (list :: [ Nat->Nat->Nat ])  =  True
 
 ratioRepetitions (list :: [ Nat->Nat->Nat ])  =  0 % 1
+
+tiers :: [Nat->Nat->Nat]  =
+  [[]]
diff --git a/tests/diff/tiers-funlistable-Nat-Nat.out b/tests/diff/tiers-funlistable-Nat-Nat.out
--- a/tests/diff/tiers-funlistable-Nat-Nat.out
+++ b/tests/diff/tiers-funlistable-Nat-Nat.out
@@ -1,6 +1,3 @@
-tiers :: [Nat->Nat]  =
-  [[]]
-
 map length (tiers :: [[ Nat->Nat ]])  =  [0]
 
 length (list :: [ Nat->Nat ])  =  0
@@ -8,3 +5,6 @@
 allUnique (list :: [ Nat->Nat ])  =  True
 
 ratioRepetitions (list :: [ Nat->Nat ])  =  0 % 1
+
+tiers :: [Nat->Nat]  =
+  [[]]
diff --git a/tests/diff/tiers-funlistable-Nat-U.out b/tests/diff/tiers-funlistable-Nat-U.out
--- a/tests/diff/tiers-funlistable-Nat-U.out
+++ b/tests/diff/tiers-funlistable-Nat-U.out
@@ -1,6 +1,3 @@
-tiers :: [Nat->()]  =
-  [[]]
-
 map length (tiers :: [[ Nat->() ]])  =  [0]
 
 length (list :: [ Nat->() ])  =  0
@@ -8,3 +5,6 @@
 allUnique (list :: [ Nat->() ])  =  True
 
 ratioRepetitions (list :: [ Nat->() ])  =  0 % 1
+
+tiers :: [Nat->()]  =
+  [[]]
diff --git a/tests/diff/tiers-funlistable-Nat2-Nat2.out b/tests/diff/tiers-funlistable-Nat2-Nat2.out
--- a/tests/diff/tiers-funlistable-Nat2-Nat2.out
+++ b/tests/diff/tiers-funlistable-Nat2-Nat2.out
@@ -1,6 +1,3 @@
-tiers :: [Nat2->Nat2]  =
-  [[]]
-
 map length (tiers :: [[ Nat2->Nat2 ]])  =  [0]
 
 length (list :: [ Nat2->Nat2 ])  =  0
@@ -8,3 +5,6 @@
 allUnique (list :: [ Nat2->Nat2 ])  =  True
 
 ratioRepetitions (list :: [ Nat2->Nat2 ])  =  0 % 1
+
+tiers :: [Nat2->Nat2]  =
+  [[]]
diff --git a/tests/diff/tiers-funlistable-Nat2-Nat3.out b/tests/diff/tiers-funlistable-Nat2-Nat3.out
--- a/tests/diff/tiers-funlistable-Nat2-Nat3.out
+++ b/tests/diff/tiers-funlistable-Nat2-Nat3.out
@@ -1,6 +1,3 @@
-tiers :: [Nat2->Nat3]  =
-  [[]]
-
 map length (tiers :: [[ Nat2->Nat3 ]])  =  [0]
 
 length (list :: [ Nat2->Nat3 ])  =  0
@@ -8,3 +5,6 @@
 allUnique (list :: [ Nat2->Nat3 ])  =  True
 
 ratioRepetitions (list :: [ Nat2->Nat3 ])  =  0 % 1
+
+tiers :: [Nat2->Nat3]  =
+  [[]]
diff --git a/tests/diff/tiers-funlistable-Nat3-Nat2.out b/tests/diff/tiers-funlistable-Nat3-Nat2.out
--- a/tests/diff/tiers-funlistable-Nat3-Nat2.out
+++ b/tests/diff/tiers-funlistable-Nat3-Nat2.out
@@ -1,6 +1,3 @@
-tiers :: [Nat3->Nat2]  =
-  [[]]
-
 map length (tiers :: [[ Nat3->Nat2 ]])  =  [0]
 
 length (list :: [ Nat3->Nat2 ])  =  0
@@ -8,3 +5,6 @@
 allUnique (list :: [ Nat3->Nat2 ])  =  True
 
 ratioRepetitions (list :: [ Nat3->Nat2 ])  =  0 % 1
+
+tiers :: [Nat3->Nat2]  =
+  [[]]
diff --git a/tests/diff/tiers-funlistable-Nat3-Nat3.out b/tests/diff/tiers-funlistable-Nat3-Nat3.out
--- a/tests/diff/tiers-funlistable-Nat3-Nat3.out
+++ b/tests/diff/tiers-funlistable-Nat3-Nat3.out
@@ -1,6 +1,3 @@
-tiers :: [Nat3->Nat3]  =
-  [[]]
-
 map length (tiers :: [[ Nat3->Nat3 ]])  =  [0]
 
 length (list :: [ Nat3->Nat3 ])  =  0
@@ -8,3 +5,6 @@
 allUnique (list :: [ Nat3->Nat3 ])  =  True
 
 ratioRepetitions (list :: [ Nat3->Nat3 ])  =  0 % 1
+
+tiers :: [Nat3->Nat3]  =
+  [[]]
diff --git a/tests/diff/tiers-funlistable-Nats-Nats.out b/tests/diff/tiers-funlistable-Nats-Nats.out
--- a/tests/diff/tiers-funlistable-Nats-Nats.out
+++ b/tests/diff/tiers-funlistable-Nats-Nats.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Nat]->[Nat] ]])  =  [1,1,2,4,...]
+
+length (list :: [ [Nat]->[Nat] ])  =  Infinity
+
+allUnique (list :: [ [Nat]->[Nat] ])  =  True
+
+ratioRepetitions (list :: [ [Nat]->[Nat] ])  =  0 % 1
+
 tiers :: [[Nat]->[Nat]]  =
   [ [ \x -> case x of
               [] -> []
@@ -85,11 +93,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Nat]->[Nat] ]])  =  [1,1,2,4,...]
-
-length (list :: [ [Nat]->[Nat] ])  =  Infinity
-
-allUnique (list :: [ [Nat]->[Nat] ])  =  True
-
-ratioRepetitions (list :: [ [Nat]->[Nat] ])  =  0 % 1
diff --git a/tests/diff/tiers-funlistable-U-Bool.out b/tests/diff/tiers-funlistable-U-Bool.out
--- a/tests/diff/tiers-funlistable-U-Bool.out
+++ b/tests/diff/tiers-funlistable-U-Bool.out
@@ -1,11 +1,3 @@
-tiers :: [()->Bool]  =
-  [ [ \x -> case x of
-              () -> False
-    , \x -> case x of
-              () -> True
-    ]
-  ]
-
 map length (tiers :: [[ ()->Bool ]])  =  [2]
 
 length (list :: [ ()->Bool ])  =  2
@@ -13,3 +5,11 @@
 allUnique (list :: [ ()->Bool ])  =  True
 
 ratioRepetitions (list :: [ ()->Bool ])  =  0 % 1
+
+tiers :: [()->Bool]  =
+  [ [ \x -> case x of
+              () -> False
+    , \x -> case x of
+              () -> True
+    ]
+  ]
diff --git a/tests/diff/tiers-funlistable-U-Nat.out b/tests/diff/tiers-funlistable-U-Nat.out
--- a/tests/diff/tiers-funlistable-U-Nat.out
+++ b/tests/diff/tiers-funlistable-U-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ ()->Nat ]])  =  [1,1,1,1,1,1,...]
+
+length (list :: [ ()->Nat ])  =  Infinity
+
+allUnique (list :: [ ()->Nat ])  =  True
+
+ratioRepetitions (list :: [ ()->Nat ])  =  0 % 1
+
 tiers :: [()->Nat]  =
   [ [ \x -> case x of
               () -> 0
@@ -19,11 +27,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ ()->Nat ]])  =  [1,1,1,1,1,1,...]
-
-length (list :: [ ()->Nat ])  =  Infinity
-
-allUnique (list :: [ ()->Nat ])  =  True
-
-ratioRepetitions (list :: [ ()->Nat ])  =  0 % 1
diff --git a/tests/diff/tiers-funlistable-U-U.out b/tests/diff/tiers-funlistable-U-U.out
--- a/tests/diff/tiers-funlistable-U-U.out
+++ b/tests/diff/tiers-funlistable-U-U.out
@@ -1,9 +1,3 @@
-tiers :: [()->()]  =
-  [ [ \x -> case x of
-              () -> ()
-    ]
-  ]
-
 map length (tiers :: [[ ()->() ]])  =  [1]
 
 length (list :: [ ()->() ])  =  1
@@ -11,3 +5,9 @@
 allUnique (list :: [ ()->() ])  =  True
 
 ratioRepetitions (list :: [ ()->() ])  =  0 % 1
+
+tiers :: [()->()]  =
+  [ [ \x -> case x of
+              () -> ()
+    ]
+  ]
diff --git a/tests/diff/tiers-funlistable-Us-Us.out b/tests/diff/tiers-funlistable-Us-Us.out
--- a/tests/diff/tiers-funlistable-Us-Us.out
+++ b/tests/diff/tiers-funlistable-Us-Us.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [()]->[()] ]])  =  [1,1,1,1,...]
+
+length (list :: [ [()]->[()] ])  =  Infinity
+
+allUnique (list :: [ [()]->[()] ])  =  True
+
+ratioRepetitions (list :: [ [()]->[()] ])  =  0 % 1
+
 tiers :: [[()]->[()]]  =
   [ [ \x -> case x of
               [] -> []
@@ -45,11 +53,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [()]->[()] ]])  =  [1,1,1,1,...]
-
-length (list :: [ [()]->[()] ])  =  Infinity
-
-allUnique (list :: [ [()]->[()] ])  =  True
-
-ratioRepetitions (list :: [ [()]->[()] ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Bool-Bool.out b/tests/diff/tiers-listsofpairs-Bool-Bool.out
--- a/tests/diff/tiers-listsofpairs-Bool-Bool.out
+++ b/tests/diff/tiers-listsofpairs-Bool-Bool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bool->Bool ]])  =  [4]
+
+length (list :: [ Bool->Bool ])  =  4
+
+allUnique (list :: [ Bool->Bool ])  =  True
+
+ratioRepetitions (list :: [ Bool->Bool ])  =  0 % 1
+
 tiers :: [Bool->Bool]  =
   [ [ \x -> case x of
               False -> False
@@ -13,11 +21,3 @@
               True -> True
     ]
   ]
-
-map length (tiers :: [[ Bool->Bool ]])  =  [4]
-
-length (list :: [ Bool->Bool ])  =  4
-
-allUnique (list :: [ Bool->Bool ])  =  True
-
-ratioRepetitions (list :: [ Bool->Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Bool-MBool.out b/tests/diff/tiers-listsofpairs-Bool-MBool.out
--- a/tests/diff/tiers-listsofpairs-Bool-MBool.out
+++ b/tests/diff/tiers-listsofpairs-Bool-MBool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bool->Maybe Bool ]])  =  [1,4,4]
+
+length (list :: [ Bool->Maybe Bool ])  =  9
+
+allUnique (list :: [ Bool->Maybe Bool ])  =  True
+
+ratioRepetitions (list :: [ Bool->Maybe Bool ])  =  0 % 1
+
 tiers :: [Bool->Maybe Bool]  =
   [ [ \x -> case x of
               False -> Nothing
@@ -30,11 +38,3 @@
               True -> Just True
     ]
   ]
-
-map length (tiers :: [[ Bool->Maybe Bool ]])  =  [1,4,4]
-
-length (list :: [ Bool->Maybe Bool ])  =  9
-
-allUnique (list :: [ Bool->Maybe Bool ])  =  True
-
-ratioRepetitions (list :: [ Bool->Maybe Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Bool-U.out b/tests/diff/tiers-listsofpairs-Bool-U.out
--- a/tests/diff/tiers-listsofpairs-Bool-U.out
+++ b/tests/diff/tiers-listsofpairs-Bool-U.out
@@ -1,10 +1,3 @@
-tiers :: [Bool->()]  =
-  [ [ \x -> case x of
-              False -> ()
-              True -> ()
-    ]
-  ]
-
 map length (tiers :: [[ Bool->() ]])  =  [1]
 
 length (list :: [ Bool->() ])  =  1
@@ -12,3 +5,10 @@
 allUnique (list :: [ Bool->() ])  =  True
 
 ratioRepetitions (list :: [ Bool->() ])  =  0 % 1
+
+tiers :: [Bool->()]  =
+  [ [ \x -> case x of
+              False -> ()
+              True -> ()
+    ]
+  ]
diff --git a/tests/diff/tiers-listsofpairs-Bools-Bools.out b/tests/diff/tiers-listsofpairs-Bools-Bools.out
--- a/tests/diff/tiers-listsofpairs-Bools-Bools.out
+++ b/tests/diff/tiers-listsofpairs-Bools-Bools.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Bool]->[Bool] ]])  =  [1,2,8,26,...]
+
+length (list :: [ [Bool]->[Bool] ])  =  Infinity
+
+allUnique (list :: [ [Bool]->[Bool] ])  =  True
+
+ratioRepetitions (list :: [ [Bool]->[Bool] ])  =  0 % 1
+
 tiers :: [[Bool]->[Bool]]  =
   [ [ \x -> case x of
               [] -> []
@@ -375,11 +383,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Bool]->[Bool] ]])  =  [1,2,8,26,...]
-
-length (list :: [ [Bool]->[Bool] ])  =  Infinity
-
-allUnique (list :: [ [Bool]->[Bool] ])  =  True
-
-ratioRepetitions (list :: [ [Bool]->[Bool] ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Int-Int-Int.out b/tests/diff/tiers-listsofpairs-Int-Int-Int.out
--- a/tests/diff/tiers-listsofpairs-Int-Int-Int.out
+++ b/tests/diff/tiers-listsofpairs-Int-Int-Int.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Int->Int->Int ]])  =  [1,1,5,13,...]
+
+length (list :: [ Int->Int->Int ])  =  Infinity
+
+allUnique (list :: [ Int->Int->Int ])  =  True
+
+ratioRepetitions (list :: [ Int->Int->Int ])  =  0 % 1
+
 tiers :: [Int->Int->Int]  =
   [ [ \x y -> case (x,y) of
                 (0,0) -> 0
@@ -205,11 +213,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Int->Int->Int ]])  =  [1,1,5,13,...]
-
-length (list :: [ Int->Int->Int ])  =  Infinity
-
-allUnique (list :: [ Int->Int->Int ])  =  True
-
-ratioRepetitions (list :: [ Int->Int->Int ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Int-Int.out b/tests/diff/tiers-listsofpairs-Int-Int.out
--- a/tests/diff/tiers-listsofpairs-Int-Int.out
+++ b/tests/diff/tiers-listsofpairs-Int-Int.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Int->Int ]])  =  [1,1,3,5,10,16,...]
+
+length (list :: [ Int->Int ])  =  Infinity
+
+allUnique (list :: [ Int->Int ])  =  True
+
+ratioRepetitions (list :: [ Int->Int ])  =  0 % 1
+
 tiers :: [Int->Int]  =
   [ [ \x -> case x of
               0 -> 0
@@ -367,11 +375,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Int->Int ]])  =  [1,1,3,5,10,16,...]
-
-length (list :: [ Int->Int ])  =  Infinity
-
-allUnique (list :: [ Int->Int ])  =  True
-
-ratioRepetitions (list :: [ Int->Int ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Ints-Ints.out b/tests/diff/tiers-listsofpairs-Ints-Ints.out
--- a/tests/diff/tiers-listsofpairs-Ints-Ints.out
+++ b/tests/diff/tiers-listsofpairs-Ints-Ints.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Int]->[Int] ]])  =  [1,1,4,10,...]
+
+length (list :: [ [Int]->[Int] ])  =  Infinity
+
+allUnique (list :: [ [Int]->[Int] ])  =  True
+
+ratioRepetitions (list :: [ [Int]->[Int] ])  =  0 % 1
+
 tiers :: [[Int]->[Int]]  =
   [ [ \x -> case x of
               [] -> []
@@ -165,11 +173,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Int]->[Int] ]])  =  [1,1,4,10,...]
-
-length (list :: [ [Int]->[Int] ])  =  Infinity
-
-allUnique (list :: [ [Int]->[Int] ])  =  True
-
-ratioRepetitions (list :: [ [Int]->[Int] ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-MBool-Bool.out b/tests/diff/tiers-listsofpairs-MBool-Bool.out
--- a/tests/diff/tiers-listsofpairs-MBool-Bool.out
+++ b/tests/diff/tiers-listsofpairs-MBool-Bool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Maybe Bool->Bool ]])  =  [8]
+
+length (list :: [ Maybe Bool->Bool ])  =  8
+
+allUnique (list :: [ Maybe Bool->Bool ])  =  True
+
+ratioRepetitions (list :: [ Maybe Bool->Bool ])  =  0 % 1
+
 tiers :: [Maybe Bool->Bool]  =
   [ [ \x -> case x of
               Nothing -> False
@@ -33,11 +41,3 @@
               Just True -> True
     ]
   ]
-
-map length (tiers :: [[ Maybe Bool->Bool ]])  =  [8]
-
-length (list :: [ Maybe Bool->Bool ])  =  8
-
-allUnique (list :: [ Maybe Bool->Bool ])  =  True
-
-ratioRepetitions (list :: [ Maybe Bool->Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-MBool-MBool.out b/tests/diff/tiers-listsofpairs-MBool-MBool.out
--- a/tests/diff/tiers-listsofpairs-MBool-MBool.out
+++ b/tests/diff/tiers-listsofpairs-MBool-MBool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Maybe Bool->Maybe Bool ]])  =  [1,6,12,8]
+
+length (list :: [ Maybe Bool->Maybe Bool ])  =  Infinity
+
+allUnique (list :: [ Maybe Bool->Maybe Bool ])  =  True
+
+ratioRepetitions (list :: [ Maybe Bool->Maybe Bool ])  =  0 % 1
+
 tiers :: [Maybe Bool->Maybe Bool]  =
   [ [ \x -> case x of
               Nothing -> Nothing
@@ -112,11 +120,3 @@
               Just True -> Just True
     ]
   ]
-
-map length (tiers :: [[ Maybe Bool->Maybe Bool ]])  =  [1,6,12,8]
-
-length (list :: [ Maybe Bool->Maybe Bool ])  =  Infinity
-
-allUnique (list :: [ Maybe Bool->Maybe Bool ])  =  True
-
-ratioRepetitions (list :: [ Maybe Bool->Maybe Bool ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Nat,Nat-Nat.out b/tests/diff/tiers-listsofpairs-Nat,Nat-Nat.out
--- a/tests/diff/tiers-listsofpairs-Nat,Nat-Nat.out
+++ b/tests/diff/tiers-listsofpairs-Nat,Nat-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ (Nat,Nat)->Nat ]])  =  [1,1,3,7,...]
+
+length (list :: [ (Nat,Nat)->Nat ])  =  Infinity
+
+allUnique (list :: [ (Nat,Nat)->Nat ])  =  True
+
+ratioRepetitions (list :: [ (Nat,Nat)->Nat ])  =  0 % 1
+
 tiers :: [(Nat,Nat)->Nat]  =
   [ [ \x -> case x of
               (0,0) -> 0
@@ -125,11 +133,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ (Nat,Nat)->Nat ]])  =  [1,1,3,7,...]
-
-length (list :: [ (Nat,Nat)->Nat ])  =  Infinity
-
-allUnique (list :: [ (Nat,Nat)->Nat ])  =  True
-
-ratioRepetitions (list :: [ (Nat,Nat)->Nat ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Nat-Nat-Nat.out b/tests/diff/tiers-listsofpairs-Nat-Nat-Nat.out
--- a/tests/diff/tiers-listsofpairs-Nat-Nat-Nat.out
+++ b/tests/diff/tiers-listsofpairs-Nat-Nat-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat->Nat->Nat ]])  =  [1,1,5,13,...]
+
+length (list :: [ Nat->Nat->Nat ])  =  Infinity
+
+allUnique (list :: [ Nat->Nat->Nat ])  =  True
+
+ratioRepetitions (list :: [ Nat->Nat->Nat ])  =  0 % 1
+
 tiers :: [Nat->Nat->Nat]  =
   [ [ \x y -> case (x,y) of
                 (0,0) -> 0
@@ -205,11 +213,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Nat->Nat->Nat ]])  =  [1,1,5,13,...]
-
-length (list :: [ Nat->Nat->Nat ])  =  Infinity
-
-allUnique (list :: [ Nat->Nat->Nat ])  =  True
-
-ratioRepetitions (list :: [ Nat->Nat->Nat ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Nat-Nat.out b/tests/diff/tiers-listsofpairs-Nat-Nat.out
--- a/tests/diff/tiers-listsofpairs-Nat-Nat.out
+++ b/tests/diff/tiers-listsofpairs-Nat-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat->Nat ]])  =  [1,1,3,5,10,16,...]
+
+length (list :: [ Nat->Nat ])  =  Infinity
+
+allUnique (list :: [ Nat->Nat ])  =  True
+
+ratioRepetitions (list :: [ Nat->Nat ])  =  0 % 1
+
 tiers :: [Nat->Nat]  =
   [ [ \x -> case x of
               0 -> 0
@@ -367,11 +375,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Nat->Nat ]])  =  [1,1,3,5,10,16,...]
-
-length (list :: [ Nat->Nat ])  =  Infinity
-
-allUnique (list :: [ Nat->Nat ])  =  True
-
-ratioRepetitions (list :: [ Nat->Nat ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Nat-U.out b/tests/diff/tiers-listsofpairs-Nat-U.out
--- a/tests/diff/tiers-listsofpairs-Nat-U.out
+++ b/tests/diff/tiers-listsofpairs-Nat-U.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat->() ]])  =  [1,0,0,0,0,0,...]
+
+length (list :: [ Nat->() ])  =  1
+
+allUnique (list :: [ Nat->() ])  =  True
+
+ratioRepetitions (list :: [ Nat->() ])  =  0 % 1
+
 tiers :: [Nat->()]  =
   [ [ \x -> case x of
               0 -> ()
@@ -17,11 +25,3 @@
   , []
   , ...
   ]
-
-map length (tiers :: [[ Nat->() ]])  =  [1,0,0,0,0,0,...]
-
-length (list :: [ Nat->() ])  =  1
-
-allUnique (list :: [ Nat->() ])  =  True
-
-ratioRepetitions (list :: [ Nat->() ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Nat2-Nat2.out b/tests/diff/tiers-listsofpairs-Nat2-Nat2.out
--- a/tests/diff/tiers-listsofpairs-Nat2-Nat2.out
+++ b/tests/diff/tiers-listsofpairs-Nat2-Nat2.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat2->Nat2 ]])  =  [1,2,1]
+
+length (list :: [ Nat2->Nat2 ])  =  4
+
+allUnique (list :: [ Nat2->Nat2 ])  =  True
+
+ratioRepetitions (list :: [ Nat2->Nat2 ])  =  0 % 1
+
 tiers :: [Nat2->Nat2]  =
   [ [ \x -> case x of
               0 -> 0
@@ -15,11 +23,3 @@
               1 -> 1
     ]
   ]
-
-map length (tiers :: [[ Nat2->Nat2 ]])  =  [1,2,1]
-
-length (list :: [ Nat2->Nat2 ])  =  4
-
-allUnique (list :: [ Nat2->Nat2 ])  =  True
-
-ratioRepetitions (list :: [ Nat2->Nat2 ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Nat2-Nat3.out b/tests/diff/tiers-listsofpairs-Nat2-Nat3.out
--- a/tests/diff/tiers-listsofpairs-Nat2-Nat3.out
+++ b/tests/diff/tiers-listsofpairs-Nat2-Nat3.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat2->Nat3 ]])  =  [1,2,3,2,1]
+
+length (list :: [ Nat2->Nat3 ])  =  9
+
+allUnique (list :: [ Nat2->Nat3 ])  =  True
+
+ratioRepetitions (list :: [ Nat2->Nat3 ])  =  0 % 1
+
 tiers :: [Nat2->Nat3]  =
   [ [ \x -> case x of
               0 -> 0
@@ -32,11 +40,3 @@
               1 -> 2
     ]
   ]
-
-map length (tiers :: [[ Nat2->Nat3 ]])  =  [1,2,3,2,1]
-
-length (list :: [ Nat2->Nat3 ])  =  9
-
-allUnique (list :: [ Nat2->Nat3 ])  =  True
-
-ratioRepetitions (list :: [ Nat2->Nat3 ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Nat3-Nat2.out b/tests/diff/tiers-listsofpairs-Nat3-Nat2.out
--- a/tests/diff/tiers-listsofpairs-Nat3-Nat2.out
+++ b/tests/diff/tiers-listsofpairs-Nat3-Nat2.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat3->Nat2 ]])  =  [1,3,3,1]
+
+length (list :: [ Nat3->Nat2 ])  =  8
+
+allUnique (list :: [ Nat3->Nat2 ])  =  True
+
+ratioRepetitions (list :: [ Nat3->Nat2 ])  =  0 % 1
+
 tiers :: [Nat3->Nat2]  =
   [ [ \x -> case x of
               0 -> 0
@@ -36,11 +44,3 @@
               2 -> 1
     ]
   ]
-
-map length (tiers :: [[ Nat3->Nat2 ]])  =  [1,3,3,1]
-
-length (list :: [ Nat3->Nat2 ])  =  8
-
-allUnique (list :: [ Nat3->Nat2 ])  =  True
-
-ratioRepetitions (list :: [ Nat3->Nat2 ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Nat3-Nat3.out b/tests/diff/tiers-listsofpairs-Nat3-Nat3.out
--- a/tests/diff/tiers-listsofpairs-Nat3-Nat3.out
+++ b/tests/diff/tiers-listsofpairs-Nat3-Nat3.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat3->Nat3 ]])  =  [1,3,6,7,6,3,1]
+
+length (list :: [ Nat3->Nat3 ])  =  Infinity
+
+allUnique (list :: [ Nat3->Nat3 ])  =  True
+
+ratioRepetitions (list :: [ Nat3->Nat3 ])  =  0 % 1
+
 tiers :: [Nat3->Nat3]  =
   [ [ \x -> case x of
               0 -> 0
@@ -115,11 +123,3 @@
               2 -> 2
     ]
   ]
-
-map length (tiers :: [[ Nat3->Nat3 ]])  =  [1,3,6,7,6,3,1]
-
-length (list :: [ Nat3->Nat3 ])  =  Infinity
-
-allUnique (list :: [ Nat3->Nat3 ])  =  True
-
-ratioRepetitions (list :: [ Nat3->Nat3 ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-Nats-Nats.out b/tests/diff/tiers-listsofpairs-Nats-Nats.out
--- a/tests/diff/tiers-listsofpairs-Nats-Nats.out
+++ b/tests/diff/tiers-listsofpairs-Nats-Nats.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Nat]->[Nat] ]])  =  [1,1,4,10,...]
+
+length (list :: [ [Nat]->[Nat] ])  =  Infinity
+
+allUnique (list :: [ [Nat]->[Nat] ])  =  True
+
+ratioRepetitions (list :: [ [Nat]->[Nat] ])  =  0 % 1
+
 tiers :: [[Nat]->[Nat]]  =
   [ [ \x -> case x of
               [] -> []
@@ -165,11 +173,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Nat]->[Nat] ]])  =  [1,1,4,10,...]
-
-length (list :: [ [Nat]->[Nat] ])  =  Infinity
-
-allUnique (list :: [ [Nat]->[Nat] ])  =  True
-
-ratioRepetitions (list :: [ [Nat]->[Nat] ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-U-Bool.out b/tests/diff/tiers-listsofpairs-U-Bool.out
--- a/tests/diff/tiers-listsofpairs-U-Bool.out
+++ b/tests/diff/tiers-listsofpairs-U-Bool.out
@@ -1,11 +1,3 @@
-tiers :: [()->Bool]  =
-  [ [ \x -> case x of
-              () -> False
-    , \x -> case x of
-              () -> True
-    ]
-  ]
-
 map length (tiers :: [[ ()->Bool ]])  =  [2]
 
 length (list :: [ ()->Bool ])  =  2
@@ -13,3 +5,11 @@
 allUnique (list :: [ ()->Bool ])  =  True
 
 ratioRepetitions (list :: [ ()->Bool ])  =  0 % 1
+
+tiers :: [()->Bool]  =
+  [ [ \x -> case x of
+              () -> False
+    , \x -> case x of
+              () -> True
+    ]
+  ]
diff --git a/tests/diff/tiers-listsofpairs-U-Nat.out b/tests/diff/tiers-listsofpairs-U-Nat.out
--- a/tests/diff/tiers-listsofpairs-U-Nat.out
+++ b/tests/diff/tiers-listsofpairs-U-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ ()->Nat ]])  =  [1,1,1,1,1,1,...]
+
+length (list :: [ ()->Nat ])  =  Infinity
+
+allUnique (list :: [ ()->Nat ])  =  True
+
+ratioRepetitions (list :: [ ()->Nat ])  =  0 % 1
+
 tiers :: [()->Nat]  =
   [ [ \x -> case x of
               () -> 0
@@ -19,11 +27,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ ()->Nat ]])  =  [1,1,1,1,1,1,...]
-
-length (list :: [ ()->Nat ])  =  Infinity
-
-allUnique (list :: [ ()->Nat ])  =  True
-
-ratioRepetitions (list :: [ ()->Nat ])  =  0 % 1
diff --git a/tests/diff/tiers-listsofpairs-U-U.out b/tests/diff/tiers-listsofpairs-U-U.out
--- a/tests/diff/tiers-listsofpairs-U-U.out
+++ b/tests/diff/tiers-listsofpairs-U-U.out
@@ -1,9 +1,3 @@
-tiers :: [()->()]  =
-  [ [ \x -> case x of
-              () -> ()
-    ]
-  ]
-
 map length (tiers :: [[ ()->() ]])  =  [1]
 
 length (list :: [ ()->() ])  =  1
@@ -11,3 +5,9 @@
 allUnique (list :: [ ()->() ])  =  True
 
 ratioRepetitions (list :: [ ()->() ])  =  0 % 1
+
+tiers :: [()->()]  =
+  [ [ \x -> case x of
+              () -> ()
+    ]
+  ]
diff --git a/tests/diff/tiers-listsofpairs-Us-Us.out b/tests/diff/tiers-listsofpairs-Us-Us.out
--- a/tests/diff/tiers-listsofpairs-Us-Us.out
+++ b/tests/diff/tiers-listsofpairs-Us-Us.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [()]->[()] ]])  =  [1,1,3,5,...]
+
+length (list :: [ [()]->[()] ])  =  Infinity
+
+allUnique (list :: [ [()]->[()] ])  =  True
+
+ratioRepetitions (list :: [ [()]->[()] ])  =  0 % 1
+
 tiers :: [[()]->[()]]  =
   [ [ \x -> case x of
               [] -> []
@@ -105,11 +113,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [()]->[()] ]])  =  [1,1,3,5,...]
-
-length (list :: [ [()]->[()] ])  =  Infinity
-
-allUnique (list :: [ [()]->[()] ])  =  True
-
-ratioRepetitions (list :: [ [()]->[()] ])  =  0 % 1
diff --git a/tests/diff/tiers-mixed-Bool-Bool.out b/tests/diff/tiers-mixed-Bool-Bool.out
--- a/tests/diff/tiers-mixed-Bool-Bool.out
+++ b/tests/diff/tiers-mixed-Bool-Bool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bool->Bool ]])  =  [8]
+
+length (list :: [ Bool->Bool ])  =  8
+
+allUnique (list :: [ Bool->Bool ])  =  False
+
+ratioRepetitions (list :: [ Bool->Bool ])  =  1 % 2
+
 tiers :: [Bool->Bool]  =
   [ [ \x -> case x of
               False -> False
@@ -25,11 +33,3 @@
               True -> True
     ]
   ]
-
-map length (tiers :: [[ Bool->Bool ]])  =  [8]
-
-length (list :: [ Bool->Bool ])  =  8
-
-allUnique (list :: [ Bool->Bool ])  =  False
-
-ratioRepetitions (list :: [ Bool->Bool ])  =  1 % 2
diff --git a/tests/diff/tiers-mixed-Bool-MBool.out b/tests/diff/tiers-mixed-Bool-MBool.out
--- a/tests/diff/tiers-mixed-Bool-MBool.out
+++ b/tests/diff/tiers-mixed-Bool-MBool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bool->Maybe Bool ]])  =  [2,8,8]
+
+length (list :: [ Bool->Maybe Bool ])  =  Infinity
+
+allUnique (list :: [ Bool->Maybe Bool ])  =  False
+
+ratioRepetitions (list :: [ Bool->Maybe Bool ])  =  1 % 2
+
 tiers :: [Bool->Maybe Bool]  =
   [ [ \x -> case x of
               False -> Nothing
@@ -57,11 +65,3 @@
               True -> Just True
     ]
   ]
-
-map length (tiers :: [[ Bool->Maybe Bool ]])  =  [2,8,8]
-
-length (list :: [ Bool->Maybe Bool ])  =  Infinity
-
-allUnique (list :: [ Bool->Maybe Bool ])  =  False
-
-ratioRepetitions (list :: [ Bool->Maybe Bool ])  =  1 % 2
diff --git a/tests/diff/tiers-mixed-Bool-U.out b/tests/diff/tiers-mixed-Bool-U.out
--- a/tests/diff/tiers-mixed-Bool-U.out
+++ b/tests/diff/tiers-mixed-Bool-U.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Bool->() ]])  =  [2]
+
+length (list :: [ Bool->() ])  =  2
+
+allUnique (list :: [ Bool->() ])  =  False
+
+ratioRepetitions (list :: [ Bool->() ])  =  1 % 2
+
 tiers :: [Bool->()]  =
   [ [ \x -> case x of
               False -> ()
@@ -7,11 +15,3 @@
               True -> ()
     ]
   ]
-
-map length (tiers :: [[ Bool->() ]])  =  [2]
-
-length (list :: [ Bool->() ])  =  2
-
-allUnique (list :: [ Bool->() ])  =  False
-
-ratioRepetitions (list :: [ Bool->() ])  =  1 % 2
diff --git a/tests/diff/tiers-mixed-Bools-Bools.out b/tests/diff/tiers-mixed-Bools-Bools.out
--- a/tests/diff/tiers-mixed-Bools-Bools.out
+++ b/tests/diff/tiers-mixed-Bools-Bools.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Bool]->[Bool] ]])  =  [2,5,20,83,...]
+
+length (list :: [ [Bool]->[Bool] ])  =  Infinity
+
+allUnique (list :: [ [Bool]->[Bool] ])  =  False
+
+ratioRepetitions (list :: [ [Bool]->[Bool] ])  =  43 % 110
+
 tiers :: [[Bool]->[Bool]]  =
   [ [ \x -> case x of
               [] -> []
@@ -1105,11 +1113,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Bool]->[Bool] ]])  =  [2,5,20,83,...]
-
-length (list :: [ [Bool]->[Bool] ])  =  Infinity
-
-allUnique (list :: [ [Bool]->[Bool] ])  =  False
-
-ratioRepetitions (list :: [ [Bool]->[Bool] ])  =  43 % 110
diff --git a/tests/diff/tiers-mixed-Int-Int-Int.out b/tests/diff/tiers-mixed-Int-Int-Int.out
--- a/tests/diff/tiers-mixed-Int-Int-Int.out
+++ b/tests/diff/tiers-mixed-Int-Int-Int.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Int->Int->Int ]])  =  [4,12,58,287,...]
+
+length (list :: [ Int->Int->Int ])  =  Infinity
+
+allUnique (list :: [ Int->Int->Int ])  =  False
+
+ratioRepetitions (list :: [ Int->Int->Int ])  =  315 % 361
+
 tiers :: [Int->Int->Int]  =
   [ [ \x y -> case (x,y) of
                 (0,0) -> 0
@@ -3615,11 +3623,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Int->Int->Int ]])  =  [4,12,58,287,...]
-
-length (list :: [ Int->Int->Int ])  =  Infinity
-
-allUnique (list :: [ Int->Int->Int ])  =  False
-
-ratioRepetitions (list :: [ Int->Int->Int ])  =  315 % 361
diff --git a/tests/diff/tiers-mixed-Int-Int.out b/tests/diff/tiers-mixed-Int-Int.out
--- a/tests/diff/tiers-mixed-Int-Int.out
+++ b/tests/diff/tiers-mixed-Int-Int.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Int->Int ]])  =  [2,3,8,20,61,204,...]
+
+length (list :: [ Int->Int ])  =  Infinity
+
+allUnique (list :: [ Int->Int ])  =  False
+
+ratioRepetitions (list :: [ Int->Int ])  =  211 % 298
+
 tiers :: [Int->Int]  =
   [ [ \x -> case x of
               0 -> 0
@@ -2987,11 +2995,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Int->Int ]])  =  [2,3,8,20,61,204,...]
-
-length (list :: [ Int->Int ])  =  Infinity
-
-allUnique (list :: [ Int->Int ])  =  False
-
-ratioRepetitions (list :: [ Int->Int ])  =  211 % 298
diff --git a/tests/diff/tiers-mixed-Ints-Ints.out b/tests/diff/tiers-mixed-Ints-Ints.out
--- a/tests/diff/tiers-mixed-Ints-Ints.out
+++ b/tests/diff/tiers-mixed-Ints-Ints.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Int]->[Int] ]])  =  [2,3,10,31,...]
+
+length (list :: [ [Int]->[Int] ])  =  Infinity
+
+allUnique (list :: [ [Int]->[Int] ])  =  False
+
+ratioRepetitions (list :: [ [Int]->[Int] ])  =  13 % 23
+
 tiers :: [[Int]->[Int]]  =
   [ [ \x -> case x of
               [] -> []
@@ -465,11 +473,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Int]->[Int] ]])  =  [2,3,10,31,...]
-
-length (list :: [ [Int]->[Int] ])  =  Infinity
-
-allUnique (list :: [ [Int]->[Int] ])  =  False
-
-ratioRepetitions (list :: [ [Int]->[Int] ])  =  13 % 23
diff --git a/tests/diff/tiers-mixed-MBool-Bool.out b/tests/diff/tiers-mixed-MBool-Bool.out
--- a/tests/diff/tiers-mixed-MBool-Bool.out
+++ b/tests/diff/tiers-mixed-MBool-Bool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Maybe Bool->Bool ]])  =  [16]
+
+length (list :: [ Maybe Bool->Bool ])  =  Infinity
+
+allUnique (list :: [ Maybe Bool->Bool ])  =  False
+
+ratioRepetitions (list :: [ Maybe Bool->Bool ])  =  1 % 2
+
 tiers :: [Maybe Bool->Bool]  =
   [ [ \x -> case x of
               Nothing -> False
@@ -65,11 +73,3 @@
               Just True -> True
     ]
   ]
-
-map length (tiers :: [[ Maybe Bool->Bool ]])  =  [16]
-
-length (list :: [ Maybe Bool->Bool ])  =  Infinity
-
-allUnique (list :: [ Maybe Bool->Bool ])  =  False
-
-ratioRepetitions (list :: [ Maybe Bool->Bool ])  =  1 % 2
diff --git a/tests/diff/tiers-mixed-MBool-MBool.out b/tests/diff/tiers-mixed-MBool-MBool.out
--- a/tests/diff/tiers-mixed-MBool-MBool.out
+++ b/tests/diff/tiers-mixed-MBool-MBool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Maybe Bool->Maybe Bool ]])  =  [2,12,24,16]
+
+length (list :: [ Maybe Bool->Maybe Bool ])  =  Infinity
+
+allUnique (list :: [ Maybe Bool->Maybe Bool ])  =  False
+
+ratioRepetitions (list :: [ Maybe Bool->Maybe Bool ])  =  1 % 2
+
 tiers :: [Maybe Bool->Maybe Bool]  =
   [ [ \x -> case x of
               Nothing -> Nothing
@@ -220,11 +228,3 @@
               Just True -> Just True
     ]
   ]
-
-map length (tiers :: [[ Maybe Bool->Maybe Bool ]])  =  [2,12,24,16]
-
-length (list :: [ Maybe Bool->Maybe Bool ])  =  Infinity
-
-allUnique (list :: [ Maybe Bool->Maybe Bool ])  =  False
-
-ratioRepetitions (list :: [ Maybe Bool->Maybe Bool ])  =  1 % 2
diff --git a/tests/diff/tiers-mixed-Nat,Nat-Nat.out b/tests/diff/tiers-mixed-Nat,Nat-Nat.out
--- a/tests/diff/tiers-mixed-Nat,Nat-Nat.out
+++ b/tests/diff/tiers-mixed-Nat,Nat-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ (Nat,Nat)->Nat ]])  =  [2,4,14,53,...]
+
+length (list :: [ (Nat,Nat)->Nat ])  =  Infinity
+
+allUnique (list :: [ (Nat,Nat)->Nat ])  =  False
+
+ratioRepetitions (list :: [ (Nat,Nat)->Nat ])  =  41 % 73
+
 tiers :: [(Nat,Nat)->Nat]  =
   [ [ \x -> case x of
               (0,0) -> 0
@@ -735,11 +743,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ (Nat,Nat)->Nat ]])  =  [2,4,14,53,...]
-
-length (list :: [ (Nat,Nat)->Nat ])  =  Infinity
-
-allUnique (list :: [ (Nat,Nat)->Nat ])  =  False
-
-ratioRepetitions (list :: [ (Nat,Nat)->Nat ])  =  41 % 73
diff --git a/tests/diff/tiers-mixed-Nat-Nat-Nat.out b/tests/diff/tiers-mixed-Nat-Nat-Nat.out
--- a/tests/diff/tiers-mixed-Nat-Nat-Nat.out
+++ b/tests/diff/tiers-mixed-Nat-Nat-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat->Nat->Nat ]])  =  [4,12,58,287,...]
+
+length (list :: [ Nat->Nat->Nat ])  =  Infinity
+
+allUnique (list :: [ Nat->Nat->Nat ])  =  False
+
+ratioRepetitions (list :: [ Nat->Nat->Nat ])  =  313 % 361
+
 tiers :: [Nat->Nat->Nat]  =
   [ [ \x y -> case (x,y) of
                 (0,0) -> 0
@@ -3615,11 +3623,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Nat->Nat->Nat ]])  =  [4,12,58,287,...]
-
-length (list :: [ Nat->Nat->Nat ])  =  Infinity
-
-allUnique (list :: [ Nat->Nat->Nat ])  =  False
-
-ratioRepetitions (list :: [ Nat->Nat->Nat ])  =  313 % 361
diff --git a/tests/diff/tiers-mixed-Nat-Nat.out b/tests/diff/tiers-mixed-Nat-Nat.out
--- a/tests/diff/tiers-mixed-Nat-Nat.out
+++ b/tests/diff/tiers-mixed-Nat-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat->Nat ]])  =  [2,3,8,20,61,204,...]
+
+length (list :: [ Nat->Nat ])  =  Infinity
+
+allUnique (list :: [ Nat->Nat ])  =  False
+
+ratioRepetitions (list :: [ Nat->Nat ])  =  85 % 149
+
 tiers :: [Nat->Nat]  =
   [ [ \x -> case x of
               0 -> 0
@@ -2987,11 +2995,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Nat->Nat ]])  =  [2,3,8,20,61,204,...]
-
-length (list :: [ Nat->Nat ])  =  Infinity
-
-allUnique (list :: [ Nat->Nat ])  =  False
-
-ratioRepetitions (list :: [ Nat->Nat ])  =  85 % 149
diff --git a/tests/diff/tiers-mixed-Nat-U.out b/tests/diff/tiers-mixed-Nat-U.out
--- a/tests/diff/tiers-mixed-Nat-U.out
+++ b/tests/diff/tiers-mixed-Nat-U.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat->() ]])  =  [2,1,2,5,14,42,...]
+
+length (list :: [ Nat->() ])  =  Infinity
+
+allUnique (list :: [ Nat->() ])  =  False
+
+ratioRepetitions (list :: [ Nat->() ])  =  65 % 66
+
 tiers :: [Nat->()]  =
   [ [ \x -> case x of
               0 -> ()
@@ -667,11 +675,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ Nat->() ]])  =  [2,1,2,5,14,42,...]
-
-length (list :: [ Nat->() ])  =  Infinity
-
-allUnique (list :: [ Nat->() ])  =  False
-
-ratioRepetitions (list :: [ Nat->() ])  =  65 % 66
diff --git a/tests/diff/tiers-mixed-Nat2-Nat2.out b/tests/diff/tiers-mixed-Nat2-Nat2.out
--- a/tests/diff/tiers-mixed-Nat2-Nat2.out
+++ b/tests/diff/tiers-mixed-Nat2-Nat2.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat2->Nat2 ]])  =  [2,4,2]
+
+length (list :: [ Nat2->Nat2 ])  =  8
+
+allUnique (list :: [ Nat2->Nat2 ])  =  False
+
+ratioRepetitions (list :: [ Nat2->Nat2 ])  =  1 % 2
+
 tiers :: [Nat2->Nat2]  =
   [ [ \x -> case x of
               0 -> 0
@@ -27,11 +35,3 @@
               1 -> 1
     ]
   ]
-
-map length (tiers :: [[ Nat2->Nat2 ]])  =  [2,4,2]
-
-length (list :: [ Nat2->Nat2 ])  =  8
-
-allUnique (list :: [ Nat2->Nat2 ])  =  False
-
-ratioRepetitions (list :: [ Nat2->Nat2 ])  =  1 % 2
diff --git a/tests/diff/tiers-mixed-Nat2-Nat3.out b/tests/diff/tiers-mixed-Nat2-Nat3.out
--- a/tests/diff/tiers-mixed-Nat2-Nat3.out
+++ b/tests/diff/tiers-mixed-Nat2-Nat3.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat2->Nat3 ]])  =  [2,4,6,4,2]
+
+length (list :: [ Nat2->Nat3 ])  =  Infinity
+
+allUnique (list :: [ Nat2->Nat3 ])  =  False
+
+ratioRepetitions (list :: [ Nat2->Nat3 ])  =  1 % 2
+
 tiers :: [Nat2->Nat3]  =
   [ [ \x -> case x of
               0 -> 0
@@ -59,11 +67,3 @@
               1 -> 2
     ]
   ]
-
-map length (tiers :: [[ Nat2->Nat3 ]])  =  [2,4,6,4,2]
-
-length (list :: [ Nat2->Nat3 ])  =  Infinity
-
-allUnique (list :: [ Nat2->Nat3 ])  =  False
-
-ratioRepetitions (list :: [ Nat2->Nat3 ])  =  1 % 2
diff --git a/tests/diff/tiers-mixed-Nat3-Nat2.out b/tests/diff/tiers-mixed-Nat3-Nat2.out
--- a/tests/diff/tiers-mixed-Nat3-Nat2.out
+++ b/tests/diff/tiers-mixed-Nat3-Nat2.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat3->Nat2 ]])  =  [2,6,6,2]
+
+length (list :: [ Nat3->Nat2 ])  =  Infinity
+
+allUnique (list :: [ Nat3->Nat2 ])  =  False
+
+ratioRepetitions (list :: [ Nat3->Nat2 ])  =  1 % 2
+
 tiers :: [Nat3->Nat2]  =
   [ [ \x -> case x of
               0 -> 0
@@ -68,11 +76,3 @@
               2 -> 1
     ]
   ]
-
-map length (tiers :: [[ Nat3->Nat2 ]])  =  [2,6,6,2]
-
-length (list :: [ Nat3->Nat2 ])  =  Infinity
-
-allUnique (list :: [ Nat3->Nat2 ])  =  False
-
-ratioRepetitions (list :: [ Nat3->Nat2 ])  =  1 % 2
diff --git a/tests/diff/tiers-mixed-Nat3-Nat3.out b/tests/diff/tiers-mixed-Nat3-Nat3.out
--- a/tests/diff/tiers-mixed-Nat3-Nat3.out
+++ b/tests/diff/tiers-mixed-Nat3-Nat3.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ Nat3->Nat3 ]])  =  [2,6,12,14,12,6,2]
+
+length (list :: [ Nat3->Nat3 ])  =  Infinity
+
+allUnique (list :: [ Nat3->Nat3 ])  =  False
+
+ratioRepetitions (list :: [ Nat3->Nat3 ])  =  1 % 2
+
 tiers :: [Nat3->Nat3]  =
   [ [ \x -> case x of
               0 -> 0
@@ -223,11 +231,3 @@
               2 -> 2
     ]
   ]
-
-map length (tiers :: [[ Nat3->Nat3 ]])  =  [2,6,12,14,12,6,2]
-
-length (list :: [ Nat3->Nat3 ])  =  Infinity
-
-allUnique (list :: [ Nat3->Nat3 ])  =  False
-
-ratioRepetitions (list :: [ Nat3->Nat3 ])  =  1 % 2
diff --git a/tests/diff/tiers-mixed-Nats-Nats.out b/tests/diff/tiers-mixed-Nats-Nats.out
--- a/tests/diff/tiers-mixed-Nats-Nats.out
+++ b/tests/diff/tiers-mixed-Nats-Nats.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [Nat]->[Nat] ]])  =  [2,3,10,31,...]
+
+length (list :: [ [Nat]->[Nat] ])  =  Infinity
+
+allUnique (list :: [ [Nat]->[Nat] ])  =  False
+
+ratioRepetitions (list :: [ [Nat]->[Nat] ])  =  13 % 23
+
 tiers :: [[Nat]->[Nat]]  =
   [ [ \x -> case x of
               [] -> []
@@ -465,11 +473,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [Nat]->[Nat] ]])  =  [2,3,10,31,...]
-
-length (list :: [ [Nat]->[Nat] ])  =  Infinity
-
-allUnique (list :: [ [Nat]->[Nat] ])  =  False
-
-ratioRepetitions (list :: [ [Nat]->[Nat] ])  =  13 % 23
diff --git a/tests/diff/tiers-mixed-U-Bool.out b/tests/diff/tiers-mixed-U-Bool.out
--- a/tests/diff/tiers-mixed-U-Bool.out
+++ b/tests/diff/tiers-mixed-U-Bool.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ ()->Bool ]])  =  [4]
+
+length (list :: [ ()->Bool ])  =  4
+
+allUnique (list :: [ ()->Bool ])  =  False
+
+ratioRepetitions (list :: [ ()->Bool ])  =  1 % 2
+
 tiers :: [()->Bool]  =
   [ [ \x -> case x of
               () -> False
@@ -9,11 +17,3 @@
               () -> True
     ]
   ]
-
-map length (tiers :: [[ ()->Bool ]])  =  [4]
-
-length (list :: [ ()->Bool ])  =  4
-
-allUnique (list :: [ ()->Bool ])  =  False
-
-ratioRepetitions (list :: [ ()->Bool ])  =  1 % 2
diff --git a/tests/diff/tiers-mixed-U-Nat.out b/tests/diff/tiers-mixed-U-Nat.out
--- a/tests/diff/tiers-mixed-U-Nat.out
+++ b/tests/diff/tiers-mixed-U-Nat.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ ()->Nat ]])  =  [2,2,2,2,2,2,...]
+
+length (list :: [ ()->Nat ])  =  Infinity
+
+allUnique (list :: [ ()->Nat ])  =  False
+
+ratioRepetitions (list :: [ ()->Nat ])  =  1 % 2
+
 tiers :: [()->Nat]  =
   [ [ \x -> case x of
               () -> 0
@@ -31,11 +39,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ ()->Nat ]])  =  [2,2,2,2,2,2,...]
-
-length (list :: [ ()->Nat ])  =  Infinity
-
-allUnique (list :: [ ()->Nat ])  =  False
-
-ratioRepetitions (list :: [ ()->Nat ])  =  1 % 2
diff --git a/tests/diff/tiers-mixed-U-U.out b/tests/diff/tiers-mixed-U-U.out
--- a/tests/diff/tiers-mixed-U-U.out
+++ b/tests/diff/tiers-mixed-U-U.out
@@ -1,11 +1,3 @@
-tiers :: [()->()]  =
-  [ [ \x -> case x of
-              () -> ()
-    , \x -> case x of
-              () -> ()
-    ]
-  ]
-
 map length (tiers :: [[ ()->() ]])  =  [2]
 
 length (list :: [ ()->() ])  =  2
@@ -13,3 +5,11 @@
 allUnique (list :: [ ()->() ])  =  False
 
 ratioRepetitions (list :: [ ()->() ])  =  1 % 2
+
+tiers :: [()->()]  =
+  [ [ \x -> case x of
+              () -> ()
+    , \x -> case x of
+              () -> ()
+    ]
+  ]
diff --git a/tests/diff/tiers-mixed-Us-Us.out b/tests/diff/tiers-mixed-Us-Us.out
--- a/tests/diff/tiers-mixed-Us-Us.out
+++ b/tests/diff/tiers-mixed-Us-Us.out
@@ -1,3 +1,11 @@
+map length (tiers :: [[ [()]->[()] ]])  =  [2,3,7,13,...]
+
+length (list :: [ [()]->[()] ])  =  Infinity
+
+allUnique (list :: [ [()]->[()] ])  =  False
+
+ratioRepetitions (list :: [ [()]->[()] ])  =  14 % 25
+
 tiers :: [[()]->[()]]  =
   [ [ \x -> case x of
               [] -> []
@@ -255,11 +263,3 @@
     ]
   , ...
   ]
-
-map length (tiers :: [[ [()]->[()] ]])  =  [2,3,7,13,...]
-
-length (list :: [ [()]->[()] ])  =  Infinity
-
-allUnique (list :: [ [()]->[()] ])  =  False
-
-ratioRepetitions (list :: [ [()]->[()] ])  =  14 % 25
diff --git a/tests/diff/tiers.out b/tests/diff/tiers.out
--- a/tests/diff/tiers.out
+++ b/tests/diff/tiers.out
@@ -1,6 +1,3 @@
-tiers :: [()]  =
-  [[()]]
-
 map length (tiers :: [[ () ]])  =  [1]
 
 length (list :: [ () ])  =  1
@@ -8,3 +5,6 @@
 allUnique (list :: [ () ])  =  True
 
 ratioRepetitions (list :: [ () ])  =  0 % 1
+
+tiers :: [()]  =
+  [[()]]
diff --git a/tests/test-derive.hs b/tests/test-derive.hs
--- a/tests/test-derive.hs
+++ b/tests/test-derive.hs
@@ -1,4 +1,4 @@
--- Copyright (c) 2015-2017 Rudy Matela.
+-- Copyright (c) 2015-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 {-# LANGUAGE TemplateHaskell, CPP #-}
 import Test
diff --git a/tests/test-error.hs b/tests/test-error.hs
--- a/tests/test-error.hs
+++ b/tests/test-error.hs
@@ -1,4 +1,4 @@
--- Copyright (c) 2015-2017 Rudy Matela.
+-- Copyright (c) 2015-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 import Test ()
 
diff --git a/tests/test-fun.hs b/tests/test-fun.hs
--- a/tests/test-fun.hs
+++ b/tests/test-fun.hs
@@ -1,4 +1,4 @@
--- Copyright (c) 2015-2017 Rudy Matela.
+-- Copyright (c) 2015-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 import Test
 
diff --git a/tests/test-funshow.hs b/tests/test-funshow.hs
--- a/tests/test-funshow.hs
+++ b/tests/test-funshow.hs
@@ -1,4 +1,4 @@
--- Copyright (c) 2015-2017 Rudy Matela.
+-- Copyright (c) 2015-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 import Test
 
diff --git a/tests/test-io.hs b/tests/test-io.hs
--- a/tests/test-io.hs
+++ b/tests/test-io.hs
@@ -1,4 +1,4 @@
--- Copyright (c) 2015-2017 Rudy Matela.
+-- Copyright (c) 2015-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 import Test
 import Test.LeanCheck.IO
diff --git a/tests/test-operators.hs b/tests/test-operators.hs
--- a/tests/test-operators.hs
+++ b/tests/test-operators.hs
@@ -1,4 +1,4 @@
--- Copyright (c) 2015-2017 Rudy Matela.
+-- Copyright (c) 2015-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 import Test
 
@@ -108,7 +108,15 @@
   , holds n $ okEqOrd -:> [bool]
   , holds n $ okEqOrd -:> float  -- fails if NaN is included in enumeration
   , holds n $ okEqOrd -:> double -- fails if NaN is included in enumeration
+  , holds n $ okEqOrd -:> rational
 
+  , holds n $ okNum -:> int
+  , holds n $ okNum -:> integer
+-- NOTE: the following two fail on Hugs due to a bug on Hugs.
+--, holds n $ \x y z -> none isInfinite [x,y,z] ==> okNum x y (z -: float)
+--, holds n $ \x y z -> none isInfinite [x,y,z] ==> okNum x y (z -: double)
+  , holds n $ okNum -:> rational
+
   , holds n $ idempotent id   -:> int
   , holds n $ idempotent abs  -:> int
   , holds n $ idempotent sort -:> [bool]
@@ -124,3 +132,6 @@
   , fails n $ neverIdentity abs    -:> int
   , fails n $ neverIdentity negate -:> int
   ]
+
+none :: (a -> Bool) -> [a] -> Bool
+none p = not . or . map p
diff --git a/tests/test-sdist b/tests/test-sdist
--- a/tests/test-sdist
+++ b/tests/test-sdist
@@ -2,7 +2,7 @@
 #
 # test-sdist: tests the package generated by "cabal sdist".
 #
-# Copyright (c) 2015-2017 Rudy Matela.
+# Copyright (c) 2015-2018 Rudy Matela.
 # Distributed under the 3-Clause BSD licence.
 #
 # TODO: also run "make test"
diff --git a/tests/test-stats.hs b/tests/test-stats.hs
--- a/tests/test-stats.hs
+++ b/tests/test-stats.hs
@@ -1,4 +1,4 @@
--- Copyright (c) 2017 Rudy Matela.
+-- Copyright (c) 2017-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 import Test
 
@@ -21,11 +21,21 @@
   putStrLn "take 1 :: [Int] -> [Int]"
   classStats 100 (take 1  :: [Int] -> [Int])
 
-  conditionStats 1000 [ ("odd",odd :: Int -> Bool)
-                      , ("even",even) ]
+  conditionStats 1000 [ ("odd", odd :: Int -> Bool)
+                      , ("even", even) ]
 
   conditionStats 1000 [ ("ordered",ordered :: [Int] -> Bool)
                       , ("ordered . reverse", ordered . reverse) ]
+
+  putStrLn "sum :: [Int] -> Bool"
+  classStatsT 6 (sum     :: [Int] -> Int)
+
+  putStrLn "length :: [Int] -> Int"
+  classStatsT 6 (length  :: [Int] -> Int)
+
+  putStrLn "take 1 :: [Int] -> [Int]"
+  classStatsT 6 (take 1  :: [Int] -> [Int])
+
 
   case elemIndices False (tests 100) of
     [] -> putStrLn "Tests passed!"
diff --git a/tests/test-tiers.hs b/tests/test-tiers.hs
--- a/tests/test-tiers.hs
+++ b/tests/test-tiers.hs
@@ -1,4 +1,4 @@
--- Copyright (c) 2015-2017 Rudy Matela.
+-- Copyright (c) 2015-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 import Test
 
@@ -66,6 +66,7 @@
 
   , holds 100 $ \xss -> ordered . concat $ discardLaterT (<)  (xss::[[Int]])
   , holds 100 $ \xss -> ordered . concat $ discardLaterT (<=) (xss::[[Int]])
+  , (length . concat $ discardLaterT (<=) [[1..100]]) == 100
   , (length . concat $ discardLaterT (<=) [[00..99],[100..199::Int]]) == 200
   , holds 100 $ \xss -> nub (concat xss) == concat (nubT xss :: [[Int]])
   ]
diff --git a/tests/test-types.hs b/tests/test-types.hs
--- a/tests/test-types.hs
+++ b/tests/test-types.hs
@@ -1,4 +1,4 @@
--- Copyright (c) 2015-2017 Rudy Matela.
+-- Copyright (c) 2015-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 import Test
 import System.Exit (exitFailure)
diff --git a/tests/test.hs b/tests/test.hs
--- a/tests/test.hs
+++ b/tests/test.hs
@@ -1,4 +1,4 @@
--- Copyright (c) 2015-2017 Rudy Matela.
+-- Copyright (c) 2015-2018 Rudy Matela.
 -- Distributed under the 3-Clause BSD licence (see the file LICENSE).
 import Test
 
@@ -32,7 +32,6 @@
   , tNatTripleOrd 200
   , tNatQuadrupleOrd 300
   , tNatQuintupleOrd 400
-  , tNatSixtupleOrd 500
   , tNatListOrd 500
   , tListsOfNatOrd 500
   , listsOf (tiers::[[Nat]]) =| 10 |= tiers
@@ -50,7 +49,9 @@
   , counterExample 10 (\x y -> x + y == (x::Double)) == Just ["0.0","1.0"]
   , holds          50 (\x -> x + 1 /= (x::Int))
   , counterExample 50 (\x -> x + 1 /= (x::Float))  == Just ["Infinity"]
+    || counterExample 50 (\x -> x + 1 /= (x::Float)) == Just ["inf"] -- bug on Hugs 2006-09?
   , counterExample 50 (\x -> x + 1 /= (x::Double)) == Just ["Infinity"]
+    || counterExample 50 (\x -> x + 1 /= (x::Float)) == Just ["inf"] -- bug on Hugs 2006-09?
   , allUnique (take 100 list :: [Float])
   , allUnique (take 500 list :: [Double])
 
