diff options
Diffstat (limited to 'src/Rahm/Desktop/Keys')
| -rw-r--r-- | src/Rahm/Desktop/Keys/KeyFeed.hs | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/Rahm/Desktop/Keys/KeyFeed.hs b/src/Rahm/Desktop/Keys/KeyFeed.hs index c7b08e1..46a2520 100644 --- a/src/Rahm/Desktop/Keys/KeyFeed.hs +++ b/src/Rahm/Desktop/Keys/KeyFeed.hs @@ -7,6 +7,7 @@ import Control.Monad (void, when) import Control.Monad.State (MonadTrans (lift), StateT, evalStateT, modify') import Control.Monad.Trans.Maybe (MaybeT (MaybeT, runMaybeT)) import Data.List.Safe (head, last) +import Linear.V (reifyDim) import Rahm.Desktop.Common (Xish (..)) import Rahm.Desktop.Submap (mapNextStringWithKeysym) import Rahm.Desktop.XMobarLog.PendingBuffer (addStringToPendingBuffer, pushAddPendingBuffer, pushPendingBuffer) @@ -71,6 +72,9 @@ readNextKey fn = KeyFeed $ do upMaybe :: Maybe a -> StateT KeyStream (MaybeT X) a upMaybe m = lift $ MaybeT (return m) +skipKey :: KeyFeed () +skipKey = KeyFeed $ modify' tail + -- Lifts a Maybe int o a KeyFeed. hoistMaybe :: Maybe a -> KeyFeed a hoistMaybe = KeyFeed . lift . MaybeT . return @@ -104,6 +108,19 @@ pushKeys ks = KeyFeed $ modify' (map return ks ++) pushKey :: (KeyMask, KeySym, String) -> KeyFeed () pushKey = pushKeys . (: []) +-- Reads the next key, but does not consume it from the read buffer. +peekKey :: ((KeyMask, KeySym, String) -> KeyFeed a) -> KeyFeed a +peekKey fn = KeyFeed $ do + keyList <- get + nextKeyFn <- lift . MaybeT . return $ head keyList + nextKey@(_, sym, str) <- lift nextKeyFn + modify' ((return nextKey :) . tail) + let (KeyFeed r) = fn nextKey in r + +-- reifiedKey <- lift nextKeyFn +-- modify' (\l -> reifiedKey : tail l) +-- return reifiedKey + -- Converts a string of keys to a stream of keys. toKeyStream :: KeyString -> KeyStream toKeyStream = map return |