module Main where import Control.Monad import Control.Monad.Trans.Class import Control.Monad.Trans.State test = [1,1,2,3,4,2,1] joinT :: (MonadTrans t, Monad m, Monad (t m)) => t m (m a) -> t m a joinT = join . fmap lift getM :: (Monad m) => StateT (m a) m a getM = joinT get transform :: (Eq a) => [a] -> [(a,a,a,a)] transform xs = flip evalStateT xs $ do a <- getM modify (filter (/= a)) b <- getM modify (filter (/= b)) c <- getM modify (filter (/= c)) d <- getM return (a,b,c,d) main = print $ transform test