module Cache ( cached, cachedMaybe, ) where -- TODO Reduce cached data size -- -- Right now we are caching complete `Issue` instances, which -- contain the full issue title and description. For a fast -- lookup it may already be enough to only store the issue's -- -- \* filename -- \* start position -- \* end position -- -- With this information we can use git to quickly look up the -- complete issue text and parse it. -- -- @topic caching -- @backlog import Backend qualified import Data.Binary (Binary, decodeFileOrFail, encodeFile) import Data.Text qualified as T import System.Directory (createDirectoryIfMissing, doesFileExist) import System.FilePath (()) cached :: Binary a => T.Text -> IO a -> IO a cached key func = do root <- Backend.getRootDir createDirectoryIfMissing True (root ".anissue") let file = (root ".anissue" T.unpack key) doesFileExist file >>= \case True -> decodeFileOrFail file >>= \case Left _ -> generate file Right blob -> pure blob False -> generate file where generate file = do blob <- func encodeFile file blob pure blob cachedMaybe :: Binary a => Maybe T.Text -> IO a -> IO a cachedMaybe Nothing func = func cachedMaybe (Just key) func = cached key func