packages feed

cgen-0.0.1: src/Options.hs

module Options(handleInterfaceFile,
  processor)
where

import Control.Monad.State

handleInterfaceFile :: FilePath -> b -> (String -> State b (a -> a)) -> a -> IO a
handleInterfaceFile inputFile initState fun oldopts 
  | null inputFile = return oldopts
  | otherwise = do
    contents <- readFile inputFile
    let ls = lines contents
    return $ flip evalState initState (parseInterfaceFile fun ls oldopts)

parseInterfaceFile :: (String -> State b (a -> a)) -> [String] -> a -> State b a
parseInterfaceFile _   []     opts = return opts
parseInterfaceFile fun (l:ls) opts = do
    ofun <- fun l
    parseInterfaceFile fun ls (ofun opts)

processor :: (Eq b) => b -> [(b, (String -> a -> a))] -> [(String, b)] -> String -> State b (a -> a)
processor none actions labels l = do
  case l of
      ('#':_) -> return id            -- comment
      ""      -> return id
      ('~':_) -> put none >> return id
      txt     -> case lookup l labels of
                   Just lb -> put lb >> return id
                   Nothing -> do
                     lb <- get
                     return $ case lookup lb actions of
                       Just act -> act txt
                       Nothing  -> id