From 10ed6c7c73ac455b3dbfbbae2dd522f1581e68dc Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Thu, 9 Mar 2017 14:13:44 +0100 Subject: Cleanup adjmix --- adjmix/Adjmix.hs | 129 ++++++++++++++++++++++++++----------------------------- 1 file changed, 60 insertions(+), 69 deletions(-) diff --git a/adjmix/Adjmix.hs b/adjmix/Adjmix.hs index c2f7fee..bc04a50 100644 --- a/adjmix/Adjmix.hs +++ b/adjmix/Adjmix.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE RecordWildCards, ApplicativeDo #-} import Options.Applicative @@ -7,90 +7,81 @@ import System.FileLock import Data.Char import Data.Monoid +import Data.List import Trivmix.Types + data Options = Options { baseDirectory :: FilePath , targetDirectory :: FilePath , levelFile :: FilePath , adjustment :: Adjustment Level } + + optionParser :: Parser Options -optionParser = Options - <$> strOption ( long "base" - <> metavar "DIRECTORY" - <> value "/dev/shm/mix" - <> showDefault - <> help "Base directory" - ) - <*> strOption ( long "target" - <> short 't' - <> metavar "DIRECTORY" - <> help "Directory relative to ‘--base’ containing the level file" - ) - <*> strOption ( long "level" - <> metavar "FILENAME" - <> value "level" - <> help "Filename of the level file" - <> showDefault - ) - <*> ( ( Set <$> option auto ( long "set" - <> short 'o' - <> metavar "LEVEL" - <> help "Overwrite the current level" - ) - ) - <|> ( Add <$> option auto ( long "add" - <> short 'a' - <> metavar "LEVEL" - <> help "Add to the current level" - ) - ) - <|> ( Sub <$> option auto ( long "sub" - <> short 's' - <> metavar "LEVEL" - <> help "Subtract from the current level" - ) - ) - <|> ( ($) <$> ( flag' Add ( long "inc" - <> short 'i' - <> help "Increase level by a preset amount (see ‘--by’)" - ) - <|> flag' Sub ( long "dec" - <> short 'd' - <> help "Decrease level by a preset amount (see ‘--by’)" - ) - ) - <*> ( option auto ( long "by" - <> metavar "LEVEL" - <> value (read "5dB") - <> showDefault - <> help "Value to decrease/increase level by when using ‘--inc’ or ‘--dec’" - ) - ) - ) - ) +optionParser = do + baseDirectory <- strOption $ mconcat + [ long "base", metavar "DIRECTORY", showDefault + , value "/dev/shm/mix" + , help "Base directory" + ] + levelFile <- strOption $ mconcat + [ long "level", metavar "FILENAME", showDefault + , value "level" + , help "Filename of the level file" + ] + targetDirectory <- strArgument $ mconcat + [ metavar "DIRECTORY" + , help "Directory relative to ‘--base’ containing the level file" + ] + adjustment <- getAlt . mconcat $ map Alt + [ Set <$> option auto (mconcat + [ long "set", short 'o', metavar "LEVEL" + , help "Overwrite the current level" + ]) + , Add <$> option auto (mconcat + [ long "add", short 'a', metavar "LEVEL" + , help "Add to the current level" + ]) + , Sub <$> option auto (mconcat + [ long "sub", short 's', metavar "LEVEL" + , help "Subtract from the current level" + ]) + , let + adjMode = getAlt . mconcat $ map Alt + [ flag' Add (mconcat + [ long "inc", short 'i' + , help "Increase level by a preset amount (see ‘--by’)" + ]) + , flag' Sub (mconcat + [ long "dec", short 'd' + , help "Decrease level by a preset amount (see ‘--by’)" + ]) + ] + adjBy = option auto (mconcat + [ long "by", short 'b', metavar "LEVEL", value (read "5dB"), showDefault + , help "Value to increase/decrease level by when using ‘--inc’ or ‘--dec’" + ]) + in ($) <$> adjMode <*> adjBy + ] + return Options{..} main :: IO () main = execParser opts >>= adjmix where - opts = info (helper <*> optionParser) - ( fullDesc - <> progDesc "Adjust the level file of a trivmix" - <> header "Adjmix — A trivial interface to a trivial mixer" - ) + opts = info (helper <*> optionParser) $ mconcat + [ progDesc "Adjust the level file of a trivmix" + , header "Adjmix — A trivial interface to a trivial mixer" + , fullDesc + ] adjmix :: Options -> IO () -adjmix Options{..} = withFileLock levelFile' Exclusive $ const $ do +adjmix Options{..} = withFileLock levelFile' Exclusive . const $ do oldLevel <- readFile levelFile' >>= readIO . stripSpace - let - newLevel = oldLevel `doAdjustment` adjustment - writeFile levelFile' (show newLevel ++ "\n") + let newLevel = oldLevel `doAdjustment` adjustment + writeFile levelFile' $ show newLevel ++ "\n" where levelFile' = baseDirectory targetDirectory levelFile - stripSpace = reverse . stripSpace' . reverse . stripSpace' - stripSpace' [] = [] - stripSpace' l@(x:xs) = if isSpace x - then stripSpace' xs - else l + stripSpace = dropWhile isSpace . dropWhileEnd isSpace -- cgit v1.2.3