module Marks where import qualified Data.IntMap as M import qualified Data.ByteString.Char8 as BS import System.Directory( removeFile ) type Marks = M.IntMap BS.ByteString emptyMarks = M.empty lastMark m = if M.null m then 0 else fst $ M.findMax m getMark marks key = M.lookup key marks addMark marks key value = M.insert key value marks listMarks = M.assocs readMarks :: FilePath -> IO Marks readMarks p = do lines <- BS.split '\n' `fmap` BS.readFile p return $ foldl merge M.empty lines `catch` \_ -> return emptyMarks where merge set line = case (BS.split ':' line) of [id, hash] -> M.insert (read $ BS.unpack id) (BS.dropWhile (== ' ') hash) set _ -> set -- ignore, although it is maybe not such a great idea... writeMarks :: FilePath -> Marks -> IO () writeMarks fp m = do removeFile fp `catch` \_ -> return () -- unlink BS.writeFile fp marks where marks = BS.concat $ map format $ listMarks m format (k, s) = BS.concat [BS.pack $ show k, BS.pack ": ", s, BS.pack "\n"]