fst :: (A,A) -> A
-- testing 4 combinations of argument values
-- pruning with 0/0 rules
-- 1 candidates of size 1
-- 2 candidates of size 2
-- tested 2 candidates
fst (x,y)  =  x

snd :: (A,A) -> A
-- testing 4 combinations of argument values
-- pruning with 0/0 rules
-- 1 candidates of size 1
-- 2 candidates of size 2
-- tested 3 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
-- 1 candidates of size 2
-- 0 candidates of size 3
-- 4 candidates of size 4
-- tested 5 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
-- 1 candidates of size 1
-- 4 candidates of size 2
-- 0 candidates of size 3
-- 4 candidates of size 4
-- tested 7 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

