
I find it interesting to compare solutions to problems I've looked at. Hopefully my suggestions are somewhat useful. I think that this can be simplified by using more functions from XMonad.StackSet, and keeping the Maybe (W.Stack a) as it is from the pureModifier.
W.focusWindow (W.focus $ W.focusUp' ws)
rather than:
W.modify' (cycl W.focusUp' ws)
Since the cycl function could be a point of failure since it isn't as well tested as those in XMonad.StackSet, and also because I don't understand it :) If you allow the message contain a function, I think that it could simplify things and allow more options without having to touch the CycleFocus instance.
data OnWindowSubset a = OnWindowSubset (W.Stack a -> W.Stack a) deriving (Read, Show, Typeable) instance Typeable a => Message (OnWindowSubset a)
focusNth n = sendMessage $ OnWindowSubset $ \w -> iterate W.focusDown' (focusMaster' w) !! mod n (len w) where focusMaster' = fromJust . W.differentiate . W.integrate len = length . W.integrate
-- Adam