    -----------------------------------------------------------------------------
    -- |
    -- Module      :  XMonad.Actions.PerWorkspaceKeys
    -- Copyright   :  (c) Roman Cheplyaka, 2008
    -- License     :  BSD3-style (see LICENSE)
    --
    -- Maintainer  :  Roman Cheplyaka <roma@ro-che.info>
    -- Stability   :  unstable
    -- Portability :  unportable
    --
    -- Define key-bindings on per-workspace basis.
    --
    -----------------------------------------------------------------------------

    module XMonad.Actions.PerWorkspaceKeys (
                                     -- * Usage
                                     -- $usage
                                     chooseAction,
                                     bindOn
                                    ) where

    import XMonad
    import XMonad.StackSet as S

    -- $usage
    --
    -- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:
    --
    -- >  import XMonad.Actions.PerWorkspaceKeys
    --
    -- >   ,((0, xK_F2), bindOn [("1", spawn "rxvt"), ("2", spawn "xeyes"), ("", spawn "xmessage hello")])
    --
    -- For detailed instructions on editing your key bindings, see
    -- "XMonad.Doc.Extending#Editing_key_bindings".

    -- | Uses supplied function to decide which action to run depending on current workspace name.
    chooseAction :: (String->X()) -> X()
    chooseAction :: (String -> X ()) -> X ()
    chooseAction f :: String -> X ()
    f = (WindowSet -> X ()) -> X ()
    forall a. (WindowSet -> X a) -> X a
    withWindowSet (String -> X ()
    f (String -> X ()) -> (WindowSet -> String) -> WindowSet -> X ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . WindowSet -> String
    forall i l a s sd. StackSet i l a s sd -> i
    S.currentTag)

    -- | If current workspace is listed, run appropriate action (only the first match counts!)
    -- If it isn't listed, then run default action (marked with empty string, \"\"), or do nothing if default isn't supplied.
    bindOn :: [(String, X())] -> X()
    bindOn :: [(String, X ())] -> X ()
    bindOn bindings :: [(String, X ())]
    bindings = (String -> X ()) -> X ()
    chooseAction String -> X ()
    chooser where
        chooser :: String -> X ()
    chooser ws :: String
    ws = case String -> [(String, X ())] -> Maybe (X ())
    forall a b. Eq a => a -> [(a, b)] -> Maybe b
    lookup String
    ws [(String, X ())]
    bindings of
            Just action :: X ()
    action -> X ()
    action
            Nothing -> case String -> [(String, X ())] -> Maybe (X ())
    forall a b. Eq a => a -> [(a, b)] -> Maybe b
    lookup "" [(String, X ())]
    bindings of
                Just action :: X ()
    action -> X ()
    action
                Nothing -> () -> X ()
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()