
Hi Brandon,
For what it's worth, you normally get the XConf via `ask` (Control.Monad.Reader) instead of passing it around. The primary exception is in ManageHooks, which have a different Reader on top and you must use `liftX` first to get at the other one.
Thanks for the clarification. I think it'll take me a bit more work (after finishing the "wikibook" about Haskell I started yesterday) to truly understand all this. I mean, I still don't understand how one goes from `X ()` to bunch of other -- more specific -- subtypes, but at this point I have a feeling that a few more (tens of) hours of study will get me there.
Your own actions would not normally be part of the XConf or XConfig, but a separate type which you would pass around.
Yeah, another kind soul at SO pointed out my folly: https://stackoverflow.com/a/61019840/1177128 and basically told me how to convert my (apparently "bonkers") solution into something that's more understandable (and ~matches what you said): ```haskell -- details at the abovementioned link defaultActions :: X [(String, X ())] windowMenu' :: [(String, X ())] -> X () windowMenu :: X () windowMenu = defaultActions >>= windowMenu' ```
Compare something like XMonad.Prompt and its `XPConfig` type.
Thanks for the pointer. :-) Cheers, Michal