fst :: (A,A) -> A
-- testing 4 combinations of argument values
-- pruning with 0/0 rules
-- 0 candidates of size 1
-- 2 candidates of size 2
-- tested 1 candidates
fst (x,y) = x
snd :: (A,A) -> A
-- testing 4 combinations of argument values
-- pruning with 0/0 rules
-- 0 candidates of size 1
-- 2 candidates of size 2
-- tested 2 candidates
snd (x,y) = y
swap :: (A,A) -> (A,A)
-- testing 4 combinations of argument values
-- pruning with 10/10 rules
-- 1 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 4 candidates of size 4
-- tested 4 candidates
swap (x,y) = (y,x)
curry :: ((A,A) -> A) -> A -> A -> A
-- pruning with 10/10 rules
-- 2 candidates of size 1
-- 2 candidates of size 2
-- 2 candidates of size 3
-- 6 candidates of size 4
-- tested 8 candidates
curry f x y = f (x,y)
uncurry :: (A -> A -> A) -> (A,A) -> A
-- pruning with 10/10 rules
-- 0 candidates of size 1
-- 4 candidates of size 2
-- 0 candidates of size 3
-- 4 candidates of size 4
-- tested 6 candidates
uncurry f (x,y) = f x y
pairwise :: [A] -> [(A,A)]
-- testing 3 combinations of argument values
-- pruning with 10/10 rules
-- 1 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 0 candidates of size 4
-- 0 candidates of size 5
-- 0 candidates of size 6
-- 5 candidates of size 7
-- 11 candidates of size 8
-- 17 candidates of size 9
-- tested 32 candidates
pairwise [] = []
pairwise (x:xs) = (x,head xs):pairwise (tail xs)
catpairs :: [(A,A)] -> [A]
-- testing 360 combinations of argument values
-- pruning with 12/13 rules
-- 1 candidates of size 1
-- 1 candidates of size 2
-- 1 candidates of size 3
-- 3 candidates of size 4
-- 5 candidates of size 5
-- 9 candidates of size 6
-- 17 candidates of size 7
-- 35 candidates of size 8
-- 72 candidates of size 9
-- tested 101 candidates
catpairs [] = []
catpairs (xy:xys) = fst xy:snd xy:catpairs xys
pairwise :: [A] -> [(A,A)]
-- testing 3 combinations of argument values
-- pruning with 10/10 rules
-- 1 candidates of size 1
-- 0 candidates of size 2
-- 0 candidates of size 3
-- 0 candidates of size 4
-- 0 candidates of size 5
-- 0 candidates of size 6
-- 5 candidates of size 7
-- 14 candidates of size 8
-- tested 18 candidates
pairwise [] = []
pairwise [x] = []
pairwise (x:y:xs) = (x,y):pairwise xs
catpairs :: [(A,A)] -> [A]
-- testing 360 combinations of argument values
-- pruning with 12/13 rules
-- 1 candidates of size 1
-- 1 candidates of size 2
-- 1 candidates of size 3
-- 3 candidates of size 4
-- 6 candidates of size 5
-- 12 candidates of size 6
-- 23 candidates of size 7
-- 48 candidates of size 8
-- tested 82 candidates
catpairs [] = []
catpairs ((x,y):xys) = x:y:catpairs xys