diff options
-rw-r--r-- | StackSet.hs | 17 | ||||
-rw-r--r-- | tests/Properties.hs | 2 |
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 |