module Hob.Context.CommandMatcher ( createMatcherForPrefix, createMatcherForCommand, createMatcherForKeyBinding, ) where import Hob.Context.Types createMatcherForPrefix :: String -> (String -> CommandHandler) -> CommandMatcher createMatcherForPrefix prefix handler = CommandMatcher (const Nothing) (matchHandler prefix) where matchHandler :: String -> String -> Maybe CommandHandler matchHandler (p:xs) (t:xt) = if p == t then matchHandler xs xt else Nothing matchHandler "" params = Just $ handler params matchHandler _ "" = Nothing createMatcherForCommand :: String -> CommandHandler -> CommandMatcher createMatcherForCommand command handler = CommandMatcher (const Nothing) (matchHandler command) where matchHandler :: String -> String -> Maybe CommandHandler matchHandler (p:xs) (t:xt) = if p == t then matchHandler xs xt else Nothing matchHandler "" "" = Just handler matchHandler _ "" = Nothing matchHandler "" _ = Nothing createMatcherForKeyBinding :: KeyboardBinding -> CommandHandler -> CommandMatcher createMatcherForKeyBinding keyBinding handler = CommandMatcher (matchHandler keyBinding) (const Nothing) where matchHandler :: KeyboardBinding -> KeyboardBinding -> Maybe CommandHandler matchHandler boundKey matchedKey = if boundKey == matchedKey then Just handler else Nothing