aboutsummaryrefslogtreecommitdiff
path: root/src/Wetterhorn/StackSet.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Wetterhorn/StackSet.hs')
-rw-r--r--src/Wetterhorn/StackSet.hs20
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)