module Glyph.Key.Trigger where ---------------------------------------------------------------------------------------------------- import qualified Data.Char as Char import qualified Data.List as List import qualified Data.Maybe as Maybe import qualified Data.Set as Set import Glyph.Class.Stringable ( Stringable (..) ) import Glyph.Config.Dhall.Action ( Action (..) ) import Glyph.Key.Chord ( Chord (..) ) import Glyph.Key.Count ( Count (..) ) import qualified Glyph.Key.Count as Count import Glyph.Key.Trie ( Captured (..) , KeyTrie (..) , Step (..) ) import qualified Glyph.Key.Trie as Trie import Glyph.State.Input ( InputState (..) ) import Graphics.Vty.Input.Events ( Key (..) ) ---------------------------------------------------------------------------------------------------- data Triggered = Cancelled | DeadEnded | Waiting InputState | Fire Action Natural (List Captured) deriving (Eq, Show) feedChord :: KeyTrie Chord -> Count -> List Chord -> Chord -> Triggered feedChord keytrie count previous pressed | Set.null pressed.modifiers, pressed.key == KEsc = Cancelled | otherwise = case Trie.resolve (previous <> [pressed]) keytrie of DeadEnd -> if Set.null pressed.modifiers `and` Count.canCount count previous pressed.key then Count.pushDigit pressed.key count |> \c -> ChordInput c [] |> Waiting else DeadEnded Pending _ -> ChordInput NoCount (previous <> [pressed]) |> Waiting Found action captured -> Fire action (Count.settle count) captured feedModal :: KeyTrie Key -> List Char -> Key -> Triggered feedModal _ previous (KChar c) = if Char.isPrint c then ModalInput (previous <> [c]) |> Waiting else DeadEnded feedModal _ _ KEsc = Cancelled feedModal _ previous KBS = case List.unsnoc previous of Just (head, _) -> ModalInput head |> Waiting Nothing -> Cancelled feedModal keytrie previous KEnter = case Trie.resolve (fmap KChar previous <> [KEnter]) keytrie of DeadEnd -> DeadEnded Pending _ -> ModalInput previous |> Waiting Found action captured -> Fire action 1 captured feedModal _ _ _ = DeadEnded