hbro-1.2.0.0: library/Hbro/Keys/Monadic.hs
module Hbro.Keys.Monadic where
-- {{{ Imports
import Hbro.Keys
import qualified Hbro.Keys.Model as Keys
import Hbro.Prelude
import Control.Lens.Type
import Control.Monad.Reader
-- import Data.List.NonEmpty as NE
-- import Data.Map as M
-- import Data.Set (Set)
-- }}}
modify :: (MonadReader r m, BaseIO m, HasHooks n r) => Lens' (Hooks n) (TVar a) -> (a -> a) -> m ()
modify l f = io . atomically . (`modifyTVar` f) =<< askL (_hooks.l)
bind' :: (HasHooks n r, ToNonEmpty KeyStroke s, BaseIO m, MonadReader r m)
=> Mode -> s -> n () -> m ()
bind' mode strokes action = modify statusL $ Keys.bind' mode strokes action
bind :: (HasHooks n r, ToNonEmpty KeyStroke s, BaseIO m, MonadReader r m)
=> s -> n () -> m ()
bind strokes action = modify statusL $ Keys.bind strokes action
-- setMode :: mode -> Status stroke mode action -> Status stroke mode action
-- setMode newMode = set _mode newMode . set _strokes []
-- press :: (Ord mode, Ord stroke) => stroke -> Status stroke mode action -> Status stroke mode action
-- press stroke status = set _strokes newStrokes status
-- where
-- newStrokes = maybe [stroke] (const chainedStrokes) $ walk (NE.fromList chainedStrokes) =<< bindings
-- chainedStrokes = status^._strokes ++ [stroke]
-- bindings = M.lookup (status^._mode) (status^._bindings)
-- getBoundFunction :: (Ord mode, Ord stroke) => Status stroke mode action -> Maybe action
-- getBoundFunction status = do
-- theStrokes <- nonEmpty $ status^._strokes
-- theBindings <- M.lookup (status^._mode) (status^._bindings)
-- lookup theStrokes theBindings
-- resetStrokes :: Status stroke mode action -> Status stroke mode action
-- resetStrokes = set _strokes []