prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  DEPR: deprecate SparseList
  
  
  </issue>
  <code>
  [start of pandas/sparse/list.py]
  1 import numpy as np
  2 from pandas.core.base import PandasObject
  3 from pandas.formats.printing import pprint_thing
  4 
  5 from pandas.types.common import is_scalar
  6 from pandas.sparse.array import SparseArray
  7 import pandas._sparse as splib
  8 
  9 
  10 class SparseList(PandasObject):
  11 
  12     """
  13     Data structure for accumulating data to be converted into a
  14     SparseArray. Has similar API to the standard Python list
  15 
  16     Parameters
  17     ----------
  18     data : scalar or array-like
  19     fill_value : scalar, default NaN
  20     """
  21 
  22     def __init__(self, data=None, fill_value=np.nan):
  23         self.fill_value = fill_value
  24         self._chunks = []
  25 
  26         if data is not None:
  27             self.append(data)
  28 
  29     def __unicode__(self):
  30         contents = '\n'.join(repr(c) for c in self._chunks)
  31         return '%s\n%s' % (object.__repr__(self), pprint_thing(contents))
  32 
  33     def __len__(self):
  34         return sum(len(c) for c in self._chunks)
  35 
  36     def __getitem__(self, i):
  37         if i < 0:
  38             if i + len(self) < 0:  # pragma: no cover
  39                 raise ValueError('%d out of range' % i)
  40             i += len(self)
  41 
  42         passed = 0
  43         j = 0
  44         while i >= passed + len(self._chunks[j]):
  45             passed += len(self._chunks[j])
  46             j += 1
  47         return self._chunks[j][i - passed]
  48 
  49     def __setitem__(self, i, value):
  50         raise NotImplementedError
  51 
  52     @property
  53     def nchunks(self):
  54         return len(self._chunks)
  55 
  56     @property
  57     def is_consolidated(self):
  58         return self.nchunks == 1
  59 
  60     def consolidate(self, inplace=True):
  61         """
  62         Internally consolidate chunks of data
  63 
  64         Parameters
  65         ----------
  66         inplace : boolean, default True
  67             Modify the calling object instead of constructing a new one
  68 
  69         Returns
  70         -------
  71         splist : SparseList
  72             If inplace=False, new object, otherwise reference to existing
  73             object
  74         """
  75         if not inplace:
  76             result = self.copy()
  77         else:
  78             result = self
  79 
  80         if result.is_consolidated:
  81             return result
  82 
  83         result._consolidate_inplace()
  84         return result
  85 
  86     def _consolidate_inplace(self):
  87         new_values = np.concatenate([c.sp_values for c in self._chunks])
  88         new_index = _concat_sparse_indexes([c.sp_index for c in self._chunks])
  89         new_arr = SparseArray(new_values, sparse_index=new_index,
  90                               fill_value=self.fill_value)
  91         self._chunks = [new_arr]
  92 
  93     def copy(self):
  94         """
  95         Return copy of the list
  96 
  97         Returns
  98         -------
  99         new_list : SparseList
  100         """
  101         new_splist = SparseList(fill_value=self.fill_value)
  102         new_splist._chunks = list(self._chunks)
  103         return new_splist
  104 
  105     def to_array(self):
  106         """
  107         Return SparseArray from data stored in the SparseList
  108 
  109         Returns
  110         -------
  111         sparr : SparseArray
  112         """
  113         self.consolidate(inplace=True)
  114         return self._chunks[0]
  115 
  116     def append(self, value):
  117         """
  118         Append element or array-like chunk of data to the SparseList
  119 
  120         Parameters
  121         ----------
  122         value: scalar or array-like
  123         """
  124         if is_scalar(value):
  125             value = [value]
  126 
  127         sparr = SparseArray(value, fill_value=self.fill_value)
  128         self._chunks.append(sparr)
  129         self._consolidated = False
  130 
  131 
  132 def _concat_sparse_indexes(indexes):
  133     all_indices = []
  134     total_length = 0
  135 
  136     for index in indexes:
  137         # increment by offset
  138         inds = index.to_int_index().indices + total_length
  139 
  140         all_indices.append(inds)
  141         total_length += index.length
  142 
  143     return splib.IntIndex(total_length, np.concatenate(all_indices))
  144
  [end of pandas/sparse/list.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/pandas/sparse/list.py b/pandas/sparse/list.py
  --- a/pandas/sparse/list.py
  +++ b/pandas/sparse/list.py
  @@ -1,3 +1,4 @@
  +import warnings
   import numpy as np
   from pandas.core.base import PandasObject
   from pandas.formats.printing import pprint_thing
  @@ -20,6 +21,11 @@
       """
   
       def __init__(self, data=None, fill_value=np.nan):
  +
  +        # see gh-13784
  +        warnings.warn("SparseList is deprecated and will be removed "
  +                      "in a future version", FutureWarning, stacklevel=2)
  +
           self.fill_value = fill_value
           self._chunks = []
  
verification_info: {"golden_diff": "diff --git a/pandas/sparse/list.py b/pandas/sparse/list.py\n--- a/pandas/sparse/list.py\n+++ b/pandas/sparse/list.py\n@@ -1,3 +1,4 @@\n+import warnings\n import numpy as np\n from pandas.core.base import PandasObject\n from pandas.formats.printing import pprint_thing\n@@ -20,6 +21,11 @@\n     \"\"\"\n \n     def __init__(self, data=None, fill_value=np.nan):\n+\n+        # see gh-13784\n+        warnings.warn(\"SparseList is deprecated and will be removed \"\n+                      \"in a future version\", FutureWarning, stacklevel=2)\n+\n         self.fill_value = fill_value\n         self._chunks = []\n", "issue": "DEPR: deprecate SparseList\n\n", "before_files": [{"content": "import numpy as np\nfrom pandas.core.base import PandasObject\nfrom pandas.formats.printing import pprint_thing\n\nfrom pandas.types.common import is_scalar\nfrom pandas.sparse.array import SparseArray\nimport pandas._sparse as splib\n\n\nclass SparseList(PandasObject):\n\n    \"\"\"\n    Data structure for accumulating data to be converted into a\n    SparseArray. Has similar API to the standard Python list\n\n    Parameters\n    ----------\n    data : scalar or array-like\n    fill_value : scalar, default NaN\n    \"\"\"\n\n    def __init__(self, data=None, fill_value=np.nan):\n        self.fill_value = fill_value\n        self._chunks = []\n\n        if data is not None:\n            self.append(data)\n\n    def __unicode__(self):\n        contents = '\\n'.join(repr(c) for c in self._chunks)\n        return '%s\\n%s' % (object.__repr__(self), pprint_thing(contents))\n\n    def __len__(self):\n        return sum(len(c) for c in self._chunks)\n\n    def __getitem__(self, i):\n        if i < 0:\n            if i + len(self) < 0:  # pragma: no cover\n                raise ValueError('%d out of range' % i)\n            i += len(self)\n\n        passed = 0\n        j = 0\n        while i >= passed + len(self._chunks[j]):\n            passed += len(self._chunks[j])\n            j += 1\n        return self._chunks[j][i - passed]\n\n    def __setitem__(self, i, value):\n        raise NotImplementedError\n\n    @property\n    def nchunks(self):\n        return len(self._chunks)\n\n    @property\n    def is_consolidated(self):\n        return self.nchunks == 1\n\n    def consolidate(self, inplace=True):\n        \"\"\"\n        Internally consolidate chunks of data\n\n        Parameters\n        ----------\n        inplace : boolean, default True\n            Modify the calling object instead of constructing a new one\n\n        Returns\n        -------\n        splist : SparseList\n            If inplace=False, new object, otherwise reference to existing\n            object\n        \"\"\"\n        if not inplace:\n            result = self.copy()\n        else:\n            result = self\n\n        if result.is_consolidated:\n            return result\n\n        result._consolidate_inplace()\n        return result\n\n    def _consolidate_inplace(self):\n        new_values = np.concatenate([c.sp_values for c in self._chunks])\n        new_index = _concat_sparse_indexes([c.sp_index for c in self._chunks])\n        new_arr = SparseArray(new_values, sparse_index=new_index,\n                              fill_value=self.fill_value)\n        self._chunks = [new_arr]\n\n    def copy(self):\n        \"\"\"\n        Return copy of the list\n\n        Returns\n        -------\n        new_list : SparseList\n        \"\"\"\n        new_splist = SparseList(fill_value=self.fill_value)\n        new_splist._chunks = list(self._chunks)\n        return new_splist\n\n    def to_array(self):\n        \"\"\"\n        Return SparseArray from data stored in the SparseList\n\n        Returns\n        -------\n        sparr : SparseArray\n        \"\"\"\n        self.consolidate(inplace=True)\n        return self._chunks[0]\n\n    def append(self, value):\n        \"\"\"\n        Append element or array-like chunk of data to the SparseList\n\n        Parameters\n        ----------\n        value: scalar or array-like\n        \"\"\"\n        if is_scalar(value):\n            value = [value]\n\n        sparr = SparseArray(value, fill_value=self.fill_value)\n        self._chunks.append(sparr)\n        self._consolidated = False\n\n\ndef _concat_sparse_indexes(indexes):\n    all_indices = []\n    total_length = 0\n\n    for index in indexes:\n        # increment by offset\n        inds = index.to_int_index().indices + total_length\n\n        all_indices.append(inds)\n        total_length += index.length\n\n    return splib.IntIndex(total_length, np.concatenate(all_indices))\n", "path": "pandas/sparse/list.py"}]}