#' Compute Z-Score
#'
#' Computes Z-Score from an input count matrix using the formula
#' ((x-mean(x))/sd(x)) for each gene across all cells. The input count matrix
#' can either be a base matrix, dgCMatrix or a DelayedMatrix. Computations are
#' performed using DelayedMatrixStats package to efficiently compute the
#' Z-Score matrix.
#' @param counts matrix (base matrix, dgCMatrix or DelayedMatrix)
#' @return z-score computed counts matrix (DelayedMatrix)
#' @export
#' @examples
#' data(sce_chcl, package = "scds")
#' assay(sce_chcl, "countsZScore") <- computeZScore(assay(sce_chcl, "counts"))
computeZScore <- function(counts) {
    if (!methods::is(counts, "DelayedArray")) {
        counts <- DelayedArray::DelayedArray(counts)
    }
    counts <- (counts - DelayedMatrixStats::rowMeans2(counts)) / DelayedMatrixStats::rowSds(counts)
    counts[base::is.nan(counts)] <- 0
    return(counts)
}