packages feed

ddci-core-0.2.0.1: DDCI/Core/Command/Set.hs

-- | Display and toggle active interpreter modes.
module DDCI.Core.Command.Set
        ( Mode(..)
        , cmdSet)
where
import DDCI.Core.State
import DDCI.Core.Transform
import DDCI.Core.Mode
import DDCI.Core.IO
import DDC.Base.Pretty
import Data.Char
import qualified Data.Set       as Set


cmdSet ::  State -> String -> IO State

-- Display the active modes.
cmdSet state []
 = do   outDocLn state
         $  text "mode  = " 
         <> text (show   $ Set.toList 
                         $ stateModes state)
        
        outDocLn state
         $  text "trans = "
         <> ppr (stateTransform state)

        return state

-- Toggle active modes.
cmdSet state cmd
 | "trans" : rest      <- words cmd
 = do   case parseTransform (concat rest) of
         Just spec       
          -> do putStrLn "ok"
                return $ state { stateTransform = spec }

         Nothing
          -> do putStrLn "transform spec parse error"
                return state

 | otherwise
 = case parseModeChanges cmd of
        Just changes
         -> do  let state'  = foldr (uncurry adjustMode) state changes
                putStrLn "ok"
                return state'
        
        Nothing
         -> do  putStrLn "mode parse error"
                return state


-- | Parse a string of mode changes.
parseModeChanges :: String -> Maybe [(Bool, Mode)]
parseModeChanges str
        = sequence $ map parseModeChange $ words str


-- | Parse a mode change setting.
--   "Mode" or "+Mode" to enable. "-Mode" to disable.
parseModeChange  :: String -> Maybe (Bool, Mode)
parseModeChange str
 = case str of
        ('+' : strMode)
         | Just mode    <- parseMode strMode
         -> Just (True, mode)
        
        ('-' : strMode)
         | Just mode    <- parseMode strMode
         -> Just (False, mode)

        (c : strMode)
         | isUpper c 
         , Just mode    <- parseMode (c : strMode)
         -> Just (True, mode)

        _ -> Nothing