summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--StackSet.hs17
-rw-r--r--tests/Properties.hs2
2 files changed, 16 insertions, 3 deletions
diff --git a/StackSet.hs b/StackSet.hs
index 619d536..1b258fc 100644
--- a/StackSet.hs
+++ b/StackSet.hs
@@ -76,12 +76,13 @@
module StackSet (
StackSet(..), Workspace(..), Screen(..), Stack(..), RationalRect(..),
new, view, lookupWorkspace, peek, index, integrate, focusUp, focusDown,
- focusWindow, member, findIndex, insertUp, delete, shift,
+ focusWindow, member, findIndex, insertUp, delete, shift, filter,
swapMaster, swapUp, swapDown, modify, float, sink -- needed by users
) where
+import Prelude hiding (filter)
import Data.Maybe (listToMaybe)
-import qualified Data.List as L (delete,find,genericSplitAt)
+import qualified Data.List as L (delete,find,genericSplitAt,filter)
import qualified Data.Map as M (Map,insert,delete,empty)
-- |
@@ -262,6 +263,18 @@ integrate Empty = []
integrate (Node x l r) = reverse l ++ x : r
-- |
+-- /O(n)/. 'filter p s' returns the elements of 's' such that 'p' evaluates to
+-- True. Order is preserved, and focus moves to the next node to the right (if
+-- necessary).
+filter :: (a -> Bool) -> Stack a -> Stack a
+filter p Empty = Empty
+filter p (Node f ls rs) = case L.filter p (f:rs) of
+ (f':rs') -> Node f' (L.filter p ls) rs'
+ [] -> case reverse $ L.filter p ls of
+ [] -> Empty
+ (f':rs') -> Node f' [] rs'
+
+-- |
-- /O(s)/. Extract the stack on the current workspace, as a list.
-- The order of the stack is determined by the master window -- it will be
-- the head of the list. The implementation is given by the natural
diff --git a/tests/Properties.hs b/tests/Properties.hs
index 8a2d712..06e32a5 100644
--- a/tests/Properties.hs
+++ b/tests/Properties.hs
@@ -1,6 +1,6 @@
{-# OPTIONS -fglasgow-exts #-}
-import StackSet
+import StackSet hiding (filter)
import Operations (tile)
import Debug.Trace