From faabea241a4df52a360255f76ce70bf8014eebdb Mon Sep 17 00:00:00 2001 From: Spencer Janssen Date: Wed, 17 Sep 2008 10:18:38 +0200 Subject: Sketch of XMonad.Config.Monad darcs-hash:20080917081838-25a6b-de782d7b8398c109500fefc89ad0cf5cde825fb2.gz --- XMonad/Config/Monad.hs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 XMonad/Config/Monad.hs (limited to 'XMonad/Config/Monad.hs') diff --git a/XMonad/Config/Monad.hs b/XMonad/Config/Monad.hs new file mode 100644 index 0000000..db29097 --- /dev/null +++ b/XMonad/Config/Monad.hs @@ -0,0 +1,49 @@ +{-# 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" -- cgit v1.2.3