# Cache the value of an expression on the file system.
#
# The expression will be evaluated if there is no matching cache file found.
# The cache files will be located in a directory "cache" located in the current
# working directory.
#
# @param name Human readable part of the cache file name.
# @param objects A vector of objects that this expression depends on. The hash
#   of those objects will be used for identifying the cache file.
cached <- function(name, objects, expr) {
    if (!dir.exists("cache")) {
        dir.create("cache")
    }

    id <- rlang::hash(objects)
    cache_file <- sprintf("cache/%s_%s.rda", name, id)

    if (file.exists(cache_file)) {
        # If the cache file exists, we restore the data from it.
        load(cache_file)
    } else {
        # If the cache file doesn't exist, we have to do the computation.
        data <- expr

        # The results are cached for the next run.
        save(data, file = cache_file, compress = "xz")
    }

    data
}

# This is needed to make data.table's symbols available within the package.
#' @import data.table
NULL
