module Yi.Keymap.Vim.Ex.Eval
( exEvalE
, exEvalY
) where
import Control.Monad (void)
import Data.Monoid ((<>))
import qualified Data.Text as T (unpack)
import Yi.Editor (EditorM, MonadEditor (withEditor), withCurrentBuffer)
import Yi.Keymap (Action (BufferA, EditorA, YiA), YiM)
import Yi.Keymap.Vim.Common (EventString (_unEv))
import Yi.Keymap.Vim.Ex.Types (ExCommand (cmdAction), evStringToExCommand)
exEvalE :: [EventString -> Maybe ExCommand] -> EventString -> EditorM ()
exEvalE cmds cmdString = evalHelper id (const $ error msg) cmds cmdString
where msg = T.unpack . _unEv $ "exEvalE got impure command" <> cmdString
exEvalY :: [EventString -> Maybe ExCommand] -> EventString -> YiM ()
exEvalY = evalHelper withEditor id
evalHelper :: MonadEditor m =>
(EditorM () -> m ()) -> (YiM () -> m ()) ->
[EventString -> Maybe ExCommand] -> EventString -> m ()
evalHelper pureHandler impureHandler cmds cmdString =
case evStringToExCommand cmds cmdString of
Just cmd -> case cmdAction cmd of
BufferA actionB -> pureHandler $ withCurrentBuffer (void actionB)
EditorA actionE -> pureHandler (void actionE)
YiA actionY -> impureHandler (void actionY)
_ -> return ()