module Stack2nix.Cache ( readCache , appendCache , cacheHits ) where import Control.Exception (catch, SomeException(..)) readCache :: FilePath -> IO [( String -- url , String -- rev , String -- subdir , String -- sha256 , String -- pkgname , String -- nixexpr-path )] readCache f = fmap (toTuple . words) . lines <$> readFile f where toTuple [ url, rev, subdir, sha256, pkgname, exprPath ] = ( url, rev, subdir, sha256, pkgname, exprPath ) appendCache :: FilePath -> String -> String -> String -> String -> String -> String -> IO () appendCache f url rev subdir sha256 pkgname exprPath = do appendFile f $ unwords [ url, rev, subdir, sha256, pkgname, exprPath ] appendFile f "\n" cacheHits :: FilePath -> String -> String -> String -> IO [ (String, String) ] cacheHits f url rev subdir = do cache <- catch' (readCache f) (const (pure [])) return [ ( pkgname, exprPath ) | ( url', rev', subdir', sha256, pkgname, exprPath ) <- cache , url == url' , rev == rev' , subdir == subdir' ] where catch' :: IO a -> (SomeException -> IO a) -> IO a catch' = catch