packages feed

mem-info-0.4.2.0: exe/MemPids.hs

{- |
Module      : MemPids
Copyright   : (c) 2022 Tim Emiola
Maintainer  : Tim Emiola <adetokunbo@emio.la>
SPDX-License-Identifier: BSD3

An example program that prints the usage of a specified processes.
-}
module Main (main) where

import Data.List.NonEmpty (NonEmpty ((:|)))
import System.Environment (getArgs)
import System.MemInfo (
  defaultRoot,
  mkReportBud,
  printUsage,
  printUsages,
  readForOnePid,
  readMemUsage,
  selfId',
 )
import Text.Read (readEither)


main :: IO ()
main = do
  let readPrintPid p = readForOnePid p >>= ifOkDo printUsage
      readProcID = either (const $ Left "bad pid") Right . readEither
      toProcessID = ifOkDo pure . readProcID
  args <- getArgs
  case args of
    [] -> selfId' >>= readPrintPid
    [x] -> toProcessID x >>= readPrintPid
    xs -> do
      let toEither = maybe (Left "odd: could not make a bud") Right
          mkReportBud' root pids = mkReportBud root pids >>= pure . toEither
      n : ns <- mapM toProcessID xs
      mkReportBud' defaultRoot (n :| ns) >>= ifOkDo readMemUsage >>= ifOkDo printUsages


ifOkDo :: (Show a) => (b -> IO c) -> Either a b -> IO c
ifOkDo =
  let core = "Usage: mem_pids [args]"
      fail' x | show x == "" = fail core
      fail' x = fail $ core ++ ": error: " ++ show x
   in either fail'