module System.MemInfo.Internal where import qualified Data.ByteString.Char8 as B import Data.Map (Map) import qualified Data.Map as Map import Data.Word import Data.Attoparsec.ByteString.Char8 as A import Control.Applicative type MemInfo = Map B.ByteString (Word64, Maybe B.ByteString) parseKey :: Parser B.ByteString parseKey = A.takeWhile1 (/=':') parseValue :: Parser Word64 parseValue = decimal parseUnits :: Parser B.ByteString parseUnits = A.takeWhile1 isAlpha_ascii parseLine :: Parser (B.ByteString, (Word64, Maybe B.ByteString)) parseLine = do key <- parseKey _ <- char ':' skipSpace value <- parseValue mUnits <- optional (skipWhile (==' ') *> parseUnits) endOfLine return (key, (value, mUnits)) parseFile :: Parser MemInfo parseFile = (Map.fromList <$> many parseLine) <* endOfInput