transform :: Eq a => [a] -> [(a, a, a, a)] transform xs = map (quadrupel . fst) $ head $ drop 4 $ iterate enmix [([], xs)] where quadrupel :: [a] -> (a, a, a, a) quadrupel (d : c : b : a : []) = (a, b, c, d) quadrupel _ = error "quadrupel" enmix :: Eq a => [([a], [a])] -> [([a], [a])] enmix = concat . map (enproduct . enfilter) enfilter :: Eq a => ([a], [a]) -> ([a], [(a, [a])]) enfilter (r, xs) = (r, [(x, filter (/= x) xs) | x <- xs]) enproduct :: ([a], [(a, [a])]) -> [([a], [a])] enproduct (r, xs) = [(x : r, t) | (x, t) <- xs]