PE Haskell after part 3
Program Evolution of the Haskell program after, part 3.
In the past two posts we created the skeleton, added parallel polling threads, set up tests and cleaned up the code using hlint.
Adding --version support
After installation you want the user to be able to see get the version of the program for when bugs are reported. This version is set in the .cabal file, but you want it compiled in with the program.
For this cabal generates a module you can use:
import Paths_after (version)
import Data.Version (showVersion)
main :: IO ()
main = putStrLn ("after " ++ showVersion version)
All that was left was to add an option to make sure the code is included at the right moment.
Add --pid support
In an earlier commit, we changed the default behavior of after to selecting the pid of any process with the command line in the beginning:
pidHasPartialCommand :: String -> String -> IO Bool
pidHasPartialCommand needle pid = do
cmd <- psCmdLine pid
return $ isInfixOf needle cmd
pidsWithPartialCommand :: String -> IO [String]
pidsWithPartialCommand cmdLine = do
listing <- psListing
filterM (pidHasPartialCommand cmdLine) listing
Which means that you can run sleep 3m in one console and after "sleep 3m" in another to have after exit after the sleep command exits.
If you still want to use a PID to wait for, we now add support for --pid=1235,31235 to wait for both 1235 and 31235.
To accept multiple arguments with options,
we add an optionType_list using defineOptions:
data MainOptions = MainOptions
{ optVersion :: Bool,
optPid :: [Int]
}
instance Options MainOptions where
defineOptions = pure MainOptions
<*> simpleOption "version" False
"Show the program version"
<*> defineOption (optionType_list ',' optionType_int) (\o -> o
{
optionLongFlags = ["pid"],
optionShortFlags = ['p']
})
In the above code the optionType_int and type of optPid are linked, s the first defines the type of the list element and optPid has to be defined as a list of that same type.
That is it, we are now at commit 6153a009bf3500998fdf89e8d06b4fad809ab59e.
Next post I'll have to look at adding more tests and splitting the package up into a library and executable for testability.