    -----------------------------------------------------------------------------
    -- |
    -- Module       : XMonad.Actions.WithAll
    -- License      : BSD3-style (see LICENSE)
    -- Stability    : unstable
    -- Portability  : unportable
    --
    -- Provides functions for performing a given action on all windows of
    -- the current workspace.
    -----------------------------------------------------------------------------

    module XMonad.Actions.WithAll (
        -- * Usage
        -- $usage
        sinkAll, withAll,
        withAll', killAll) where

    import Data.Foldable hiding (foldr)

    import XMonad
    import XMonad.StackSet

    -- $usage
    --
    -- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:
    --
    -- > import XMonad.Actions.WithAll
    --
    -- then add a keybinding; for example:
    --
    --     , ((modm .|. shiftMask, xK_t), sinkAll)
    --
    -- For detailed instructions on editing your key bindings, see
    -- "XMonad.Doc.Extending#Editing_key_bindings".

    -- | Un-float all floating windows on the current workspace.
    sinkAll :: X ()
    sinkAll = withAll' sink

    -- | Apply a function to all windows on the current workspace.
    withAll' :: (Window -> WindowSet -> WindowSet) -> X ()
    withAll' f = windows $ \ws -> let all' = integrate' . stack . workspace . current $ ws
                                  in foldr f ws all'

    -- | Execute an 'X' action for each window on the current workspace.
    withAll :: (Window -> X ()) -> X()
    withAll f = withWindowSet $ \ws -> let all' = integrate' . stack . workspace . current $ ws
                                       in forM_ all' f

    -- | Kill all the windows on the current workspace.
    killAll :: X()
    killAll = withAll killWindow