[xmonad] Haskell question: avoiding code duplication

Peter Jones mlists at pmade.com
Sat Feb 2 19:08:46 CET 2013

I've been working on a few customizations to xmonad but as I play with
Haskell I keep seeing a pattern of duplication in my code that I don't
know how to resolve.  Here's an example:

-- | Enables 'focusFollowsMouse' for tiled windows only.  For this to
-- work you need to turn off 'focusFollowsMouse' in your configuration
-- and then add this function to your 'handleEventHook'.
focusFollowsTiledOnly :: Event -> X All
focusFollowsTiledOnly e@(CrossingEvent {ev_window = w, ev_event_type = t})
  | isNormalEnter = whenX bothTiled (focus w) >> continueHooks
  where isNormalEnter   = t == enterNotify && ev_mode e == notifyNormal
        bothTiled       = (&&) <$> notFloating w <*> currentIsTiled
        currentIsTiled  = currentWindow >>= maybe (return True) notFloating
        currentWindow   = gets $ W.peek . windowset
        notFloating w'  = gets $ not . M.member w' . W.floating . windowset
        continueHooks   = return . mempty $ True
focusFollowsTiledOnly _ = return . mempty $ True

The last two lines demonstrate the pattern I've been seeing.  The only
way I know how to remove this duplication is to move it out into a
top-level function.  Is that correct?


Peter Jones --- Love to Develop
303-219-0226 http://devalot.com

More information about the xmonad mailing list