
I've pushed the reimplementation of xmonad as a zipper. This affects the StackSet module entirely (completely rewritten), and much of Operations.hs. Additional, a bit of the StackSet api has changed names (documented in the file), new QC properties have been added., and the code has shrunk by 55 lines: Code Comments Before: Operations.hs 194 139 Main.hs 110 88 StackSet.hs 101 132 XMonad.hs 57 89 Config.hs 53 136 TOTAL: 515 584 After: Operations.hs 152 149 Main.hs 97 71 StackSet.hs 87 272 XMonad.hs 71 102 Config.hs 53 136 TOTAL: 460 730 A few words of warning: * This likely breaks some of the contrib modules, due to api changes. Fixing that will happen over the next few days. * Also, the changes that affect Xinerama are untested, so Jason, if you can check that out. In particular, I believe focusWindow needs to check for visible workspaces, not just the current workspace. * Finally, Neil, if you want to rerun the Catch verifier on StackSet, that would be neat. I think I've followed up on the changes you suggested earlier in the week. Here's a sample of the changes to the logic core in StackSet, to make us feel happy. Old, table-based implementation of 'swap/promote': -promote w = maybe w id $ do - a <- peek w -- fail if null - (f, xs@(x:_)) <- M.lookup (current w) (stacks w) - let w' = w { stacks = M.insert (current w) (f, swap a x xs) (stacks w) } - return $ insert a (current w) w' -- and maintain focus (?) - where - swap a b xs = maybe xs id $ do - ai <- L.elemIndex a xs - bi <- L.elemIndex b xs - return . insertAt bi a . insertAt ai b $ xs - where insertAt n x ys = as ++ x : drop 1 bs - where (as,bs) = splitAt n ys New implementation: +swap = modify Empty $ \c -> case c of + Node _ [] _ -> c -- already master. + Node t ls rs -> Node t [] (ys ++ x : rs) where (x:ys) = reverse ls Cute eh? Similar effects for insert/rotate and friends. Window managers should be zippers. -- Don