diff options
Diffstat (limited to 'src/Wetterhorn/StackSet.hs')
-rw-r--r-- | src/Wetterhorn/StackSet.hs | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/Wetterhorn/StackSet.hs b/src/Wetterhorn/StackSet.hs index f6379eb..22005a4 100644 --- a/src/Wetterhorn/StackSet.hs +++ b/src/Wetterhorn/StackSet.hs @@ -2,7 +2,7 @@ module Wetterhorn.StackSet where import Control.Monad.Identity import Control.Monad.Writer (First (..), MonadWriter (tell), execWriter) -import Data.Maybe (isJust) +import Data.Maybe (isJust, mapMaybe) -- | The root datastructure for holding the state of the windows. data StackSet s sd t l a = StackSet @@ -13,7 +13,7 @@ data StackSet s sd t l a = StackSet -- | Workspaces that exist, but are not on a screen. hidden :: [Workspace t l a] } - deriving (Read, Show, Eq, Ord) + deriving (Read, Show, Eq, Ord, Functor) class TraverseWorkspace f where traverseWorkspaces :: @@ -189,3 +189,19 @@ onCurrentStack fn (StackSet cur vis hid) = where cur' (Screen s sd ws) = Screen s sd <$> ws' ws ws' (Workspace t l s) = Workspace t l <$> fn s + +catMaybes :: StackSet s sd t l (Maybe a) -> StackSet s sd t l a +catMaybes (StackSet cur hidden visible) = + StackSet (catMaybesS cur) (map catMaybesS hidden) (map catMaybesW visible) + where + catMaybesS (Screen a b ws) = Screen a b $ catMaybesW ws + catMaybesW (Workspace a b st) = Workspace a b $ catMaybesSt st + catMaybesSt (Stack up down) = + Stack (mapMaybe sequenceA up) (mapMaybe sequenceA down) + +filter :: (a -> Bool) -> StackSet s sd t l a -> StackSet s sd t l a +filter ffn = + Wetterhorn.StackSet.catMaybes . fmap (\a -> if ffn a then Just a else Nothing) + +delete :: (Eq a) => a -> StackSet s sd t l a -> StackSet s sd t l a +delete win = Wetterhorn.StackSet.filter (/=win) |