- In BioC 3.18-3.20: migrate from SparseArraySeed objects to SparseArray
  objects for handling of sparse data. 7 steps:

  1. The new location for the extract_sparse_array() generic is in the
     SparseArray package. However SparseArray::extract_sparse_array()
     behaves differently compared to the traditional extract_sparse_array()
     generic defined in DelayedArray (it returns a SparseArray object instead
     of a SparseArraySeed object). So, before we can import the SparseArray
     package, we must get the extract_sparse_array() generic and methods
     defined in DelayedArray out of the way by renaming them to something
     else, say OLD_extract_sparse_array(). All the extract_sparse_array()
     methods in DelayedArray's rev deps must also be renamed.
     ---
     THIS STEP WAS COMPLETED ON MAY 3, 2023. The following rev deps were
     modified accordingly: HDF5Array, beachmat, DelayedRandomArray,
     TileDBArray, alabaster.matrix, and SCArray.

  2. Depend and import SparseArray.
     ---
     THIS STEP WAS COMPLETED ON MAY 3, 2023.

  3. Get rid of R/sparseMatrix-utils.R and src/sparseMatrix_utils.c (this is
     now in SparseArray).
     ---
     THIS STEP WAS COMPLETED ON MAY 3, 2023.

  4. Prepare for the switch from .OLD_read_block() to .NEW_read_block() (see
     S4Arrays/R/read_block.R) by implementing:

       (a) SparseArray::extract_sparse_array() methods: one for each
           OLD_extract_sparse_array() method defined in DelayedArray
           and its revdeps;
           ---
           THIS STEP WAS COMPLETED ON JULY 1, 2024.

       (b) SparseArray::read_block_as_sparse() methods: one for each
           read_sparse_block() method defined in DelayedArray and its revdeps.

  5. Switch from .OLD_read_block() to .NEW_read_block() in S4Arrays.
     Also coerce to SparseArray instead of SparseArraySeed in the default
     realize() method (and update man page).
     ---
     THIS STEP WAS COMPLETED ON JULY 2, 2024.

  6. Then, the OLD_extract_sparse_array() and read_sparse_block() generics
     can be deprecated.
     ---
     THIS STEP WAS COMPLETED ON JULY 2, 2024.

  7. Finally (in BioC 3.20), SparseArraySeed objects can be deprecated too.
     ---
     THIS STEP WAS COMPLETED ON JULY 2, 2024.

- Change 'as.sparse' default from FALSE to NA in blockApply() and
  blockReduce(). Consistent with S4Arrays::read_block().

- Add unit tests for DelayedOp subclasses DelayedSubassign and DelayedAbind.

- Backend classes (e.g. HDF5Array) should be defined as:
    setClass("HDF5Array",
        contains="DelayedArray",
        representation(seed="HDF5ArraySeed")
    )
  This would avoid the need for a validity method.
  This change was made for RleArray, HDF5Array and TENxMatrix between Dec 2018
  and Jan 2019.
  Still need to be done for DelayedArray backends implemented in other
  packages.

- In 02-Implementing_a_backend.Rmd, add a "Other optional (but highly
  recommended) methods" subsection after "The seed contract" subsection.
  The optional methods are "chunkdim", "path", "path<-". See HDF5ArraySeed
  and TENxMatrixSeed for examples.

- Subsetting:

  - A[A == 1] should work on a 1D DelayedArray object (and return a 1D
    DelayedArray object).

  - If A and B are conformable DelayedArray objects, and type(B) is logical,
    it should be possible to compute A[B] by walking simultaneously on A
    and B. Right now we first do i <- which(B) and then A[i] so we complete
    the walk on B before we walk on A.

  - Support subsetting an arbitrary object by a DelayedArray or
    DelayedMatrix of type logical?

- Add unit tests for all the DelayedOp types.

- Add man page and unit tests for statistical methods defined in
  DelayedArray-stats.R

- Make DelayedArray contain Annotated from S4Vectors?

- Add more examples to the man pages (using the toy dataset).

- Add unit tests for round() and signif() (Math2 group).

- Explore DelayedAtomicVector. Could be used in situations where
  1D DelayedArray objects are currently used (e.g. VariantExperiment
  package). Then reconsider what subsetting does when 'drop' is TRUE.
  Should it return the result as an ordinary vector instead of a 1D
  DelayedArray object? We're not doing this right now because it would
  be inconvenient for people using 1D DelayedArray objects (it triggers
  realization when the user probably doesn't want it). But if people
  switch to DelayedAtomicVector objects then maybe it's ok to make this
  change.

- Support more matrix- and array-like operations.

- How well supported are DelayedArray of type "character"?

- Add more unit tests.


