import Data.List sweep::(String -> [String]) -> String -> String -> [String] sweep f l stack = case stack of [] -> [l] cur:substack -> concat [map (\l -> cur:l) (f (delete cur l)), sweep f l substack] ana::String -> [String] ana l = sweep (ana) l l