diff options
author | tv <tv@shackspace.de> | 2014-07-28 04:00:51 +0200 |
---|---|---|
committer | tv <tv@shackspace.de> | 2014-07-28 04:00:51 +0200 |
commit | 1985060171be23c6188ead52341b0970923e7ddb (patch) | |
tree | 03e1df12efcd0da374120907e804a5004539a039 | |
parent | e5e693b69e523bac9eff3a76b901e25ab8897e09 (diff) |
getCommand: use VT instead of IO monad
-rw-r--r-- | Main.hs | 44 |
1 files changed, 29 insertions, 15 deletions
@@ -70,9 +70,23 @@ dateThread delay modeRef lock = forever $ do threadDelay delay +uiThread :: IORef Mode -> MVar Buffer -> IO () uiThread modeRef lock = do m <- readIORef modeRef - c <- getCommand m + b <- readMVar lock + let cf = VTConfig + { + } + st = VTState + { mode = m + , buffer = b + } + ((eCmd, _), _) <- runVT cf st (getCommand m) + + let c = case eCmd of + Left _ -> undefined + Right cmd -> cmd + m' <- modifyMVar lock $ \ buf -> do let cf = VTConfig { @@ -393,33 +407,33 @@ instance Show Mode where show VerbatimMode = "verbatim" -getCommand :: Mode -> IO Command +getCommand :: Mode -> VT Command getCommand InsertMode = getCommandXXX imap InsertString getCommand NormalMode = getCommandXXX nmap AlertBadInput getCommand VerbatimMode = verbatimKeymap -- TODO refactor me please^_^ -getCommandXXX :: Keymap -> (String -> Command) -> IO Command +getCommandXXX :: Keymap -> (String -> Command) -> VT Command getCommandXXX keymap defCmd = do -- wait for the first character - c <- hLookAhead stdin + c <- liftIO $ hLookAhead stdin - bufRef <- newIORef "" - candRef <- newIORef Nothing - cmdRef <- newEmptyMVar -- :: MVar (Maybe (String -> Command)) + bufRef <- liftIO $ newIORef "" + candRef <- liftIO $ newIORef Nothing + cmdRef <- liftIO $ newEmptyMVar -- :: MVar (Maybe (String -> Command)) -- TODO ensure that this thread dies eventually --forkIO $ rec "" keymap cmdRef candRef getCharThreadId <- --forkFinally (rec keymap cmdRef candRef bufRef) -- (\_ -> putStrLn "input terminated") - forkIO $ do + liftIO $ forkIO $ do rec keymap cmdRef candRef bufRef watchDogThreadId <- - forkIO $ do + liftIO $ forkIO $ do --putStrLn "watchdog activated" threadDelay $ 1000 * 50 -- 50ms --putStrLn "watchdog timeout" @@ -427,19 +441,19 @@ getCommandXXX keymap defCmd = do --putStrLn "watchdog killed getCharThread" putMVar cmdRef Nothing -- continue main thread - mbCmd <- takeMVar cmdRef + mbCmd <- liftIO $ takeMVar cmdRef - killThread watchDogThreadId + liftIO $ killThread watchDogThreadId cmd <- case mbCmd of Just cmd -> return cmd Nothing -> do - mbCmd2 <- readIORef candRef + mbCmd2 <- liftIO $ readIORef candRef case mbCmd2 of Just cmd2 -> return cmd2 Nothing -> return defCmd - s <- readIORef bufRef + s <- liftIO $ readIORef bufRef --clearLine --putStrLn $ "\x1b[35;1m" ++ (show s) ++ " -> " ++ (show $ cmd s) ++ "\x1b[m" @@ -495,9 +509,9 @@ getCommandXXX keymap defCmd = do -verbatimKeymap :: IO Command +verbatimKeymap :: VT Command verbatimKeymap = do - c <- getChar + c <- liftIO getChar return $ InsertString [c] <> ChangeMode InsertMode |