import Data.List (elemIndex) import Data.Maybe (fromJust) spin n xs = let (ys, zs) = splitAt n xs in zs ++ ys exchange m n xs | n > m = ys ++ [y] ++ zs ++ [x] ++ ws | n == m = xs | otherwise = exchange n m xs where (ys, x:xs') = splitAt m xs (zs, y:ws) = splitAt (n - m - 1) xs' partner x y xs = exchange m n xs where m = fromJust $ elemIndex x xs n = fromJust $ elemIndex y xs