content: {-# LANGUAGE GeneralizedNewtypeDeriving #-}
  
  -- experimental, not expected to work
  
  {- our goal:
  config = do
      add layout Full
      set terminal "urxvt"
      add keys [blah blah blah]
  -}
  
  {-
  ideas:
      composability!
      "only once" features like avoidStruts, ewmhDesktops
  -}
  
  module XMonad.Config.Monad where
  
  import XMonad hiding (terminal, keys)
  import qualified XMonad as X
  import Control.Monad.Writer
  import Data.Monoid
  import Data.Accessor
  import Data.Accessor.Basic hiding (set)
  
  -- Ugly!  To fix this we'll need to change the kind of XConfig.
  newtype LayoutList a = LL [Layout a] deriving Monoid
  
  type W = Dual (Endo (XConfig LayoutList))
  mkW = Dual . Endo
  
  newtype Config a = C (WriterT W IO a)
      deriving (Functor, Monad, MonadWriter W)
  
  -- references:
  layout = fromSetGet (\x c -> c { layoutHook = x }) layoutHook
  terminal = fromSetGet (\x c -> c { X.terminal = x }) X.terminal
  keys = fromSetGet (\x c -> c { X.keys = x }) X.keys
  
  set :: Accessor (XConfig LayoutList) a -> a -> Config ()
  set r x = tell (mkW $ r ^= x)
  add r x = tell (mkW (r ^: mappend x))
  
  --
  example :: Config ()
  example = do
      add layout $ LL [Layout $ Full] -- make this better
      set terminal "urxvt"
  