[xmonad] Why isn't mappend for Query flipped?

Brent Yorgey byorgey at seas.upenn.edu
Tue Jun 9 12:49:04 EDT 2009

In XMonad.Core, we have

  type ManageHook = Query (Endo WindowSet)

  newtype Query a = Query (ReaderT Window X a)
      deriving (Functor, Monad, MonadReader Window, MonadIO)

  instance Monoid a => Monoid (Query a) where
      mempty  = return mempty
      mappend = liftM2 mappend

So 'mappend' for Query is just the 'mappend' for Endo, lifted over the
ReaderT.  But of course, 'mappend' for Endo is just function
composition.  The upshot is that

  m1 <+> m2

does m2, and THEN m1.  Mostly no one notices since ManageHooks tend to
consist of a bunch of actions with disjoint premises, so it doesn't
matter in which order they are run.  But this order is quite
counterintuitive when trying to sequence multiple actions in a
ManageHook (as someone was just trying to do in #xmonad today, which
is how I ran across this issue).

I propose to change the Monoid instance for Query so that 

    mappend = liftM2 (flip mappend)

Of course, this has the undesirable side effect of breaking any
configs where the order actually matters.  But it would certainly make
more sense moving forward, IMO.



More information about the xmonad mailing list