prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  ENH: New geoaccessor for GeoSeries to return tuple of coordinates `(x, y)`
  <!--
  Thanks for contributing a pull request!
  
  Please follow these standard acronyms to start the commit message:
  
  - ENH: enhancement
  - BUG: bug fix
  - DOC: documentation
  - TYP: type annotations
  - TST: addition or modification of tests
  - MAINT: maintenance commit (refactoring, typos, etc.)
  - BLD: change related to building
  - REL: related to releasing
  - API: an (incompatible) API change
  - DEP: deprecate something, or remove a deprecated object
  - DEV: development tool or utility
  - REV: revert an earlier commit
  - PERF: performance improvement
  - BOT: always commit via a bot
  - CI: related to CI or CD
  - CLN: Code cleanup
  -->
  
  - [ ] closes #xxxx
  - [x] whatsnew entry
  
  as title
  
  ```python
      >>> import dtoolkit.geoaccessor
      >>> import geopandas as gpd
      >>> from shapely.geometry import Point
      >>> s = geopandas.GeoSeries([Point(1, 1), Point(2, 2), Point(3, 3)])
      >>> s.xy
      0    (1.0, 1.0)
      1    (2.0, 2.0)
      2    (3.0, 3.0)
      dtype: object
  ```
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `dtoolkit/geoaccessor/geoseries/xy.py`
  Content:
  ```
  1 import geopandas as gpd
  2 import pandas as pd
  3 
  4 from dtoolkit.geoaccessor.register import register_geoseries_method
  5 
  6 
  7 @register_geoseries_method
  8 def xy(s: gpd.GeoSeries, /) -> pd.Series:
  9     """
  10     Return the x and y location of Point geometries in a GeoSeries.
  11 
  12     Returns
  13     -------
  14     Series
  15         tuple of x and y coordinates.
  16 
  17     See Also
  18     --------
  19     geopandas.GeoSeries.x
  20     geopandas.GeoSeries.y
  21 
  22     Examples
  23     --------
  24     >>> import dtoolkit.geoaccessor
  25     >>> import geopandas as gpd
  26     >>> from shapely.geometry import Point
  27     >>> s = gpd.GeoSeries([Point(1, 1), Point(2, 2), Point(3, 3)])
  28     >>> s
  29     0    POINT (1.00000 1.00000)
  30     1    POINT (2.00000 2.00000)
  31     2    POINT (3.00000 3.00000)
  32     dtype: geometry
  33     >>> s.xy()
  34     0    (1.0, 1.0)
  35     1    (2.0, 2.0)
  36     2    (3.0, 3.0)
  37     dtype: object
  38     """
  39 
  40     return pd.concat((s.x, s.y), axis=1).apply(tuple, axis=1)
  41
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/dtoolkit/geoaccessor/geoseries/xy.py b/dtoolkit/geoaccessor/geoseries/xy.py
  --- a/dtoolkit/geoaccessor/geoseries/xy.py
  +++ b/dtoolkit/geoaccessor/geoseries/xy.py
  @@ -5,14 +5,19 @@
   
   
   @register_geoseries_method
  -def xy(s: gpd.GeoSeries, /) -> pd.Series:
  +def xy(s: gpd.GeoSeries, /, reverse: bool = False) -> pd.Series:
       """
       Return the x and y location of Point geometries in a GeoSeries.
   
  +    Parameters
  +    ----------
  +    reverse : bool, default False
  +        If True, return (y, x) instead.
  +
       Returns
       -------
       Series
  -        tuple of x and y coordinates.
  +        tuple of coordinate.
   
       See Also
       --------
  @@ -24,17 +29,26 @@
       >>> import dtoolkit.geoaccessor
       >>> import geopandas as gpd
       >>> from shapely.geometry import Point
  -    >>> s = gpd.GeoSeries([Point(1, 1), Point(2, 2), Point(3, 3)])
  +    >>> s = gpd.GeoSeries([Point(0, 1), Point(0, 2), Point(0, 3)])
       >>> s
  -    0    POINT (1.00000 1.00000)
  -    1    POINT (2.00000 2.00000)
  -    2    POINT (3.00000 3.00000)
  +    0    POINT (0.00000 1.00000)
  +    1    POINT (0.00000 2.00000)
  +    2    POINT (0.00000 3.00000)
       dtype: geometry
       >>> s.xy()
  -    0    (1.0, 1.0)
  -    1    (2.0, 2.0)
  -    2    (3.0, 3.0)
  +    0    (0.0, 1.0)
  +    1    (0.0, 2.0)
  +    2    (0.0, 3.0)
  +    dtype: object
  +
  +    Set ``reverse=True`` to return (y, x).
  +
  +    >>> s.xy(True)
  +    0    (1.0, 0.0)
  +    1    (2.0, 0.0)
  +    2    (3.0, 0.0)
       dtype: object
       """
   
  -    return pd.concat((s.x, s.y), axis=1).apply(tuple, axis=1)
  +    coordinates = (s.y, s.x) if reverse else (s.x, s.y)
  +    return pd.concat(coordinates, axis=1).apply(tuple, axis=1)
  
verification_info: {"golden_diff": "diff --git a/dtoolkit/geoaccessor/geoseries/xy.py b/dtoolkit/geoaccessor/geoseries/xy.py\n--- a/dtoolkit/geoaccessor/geoseries/xy.py\n+++ b/dtoolkit/geoaccessor/geoseries/xy.py\n@@ -5,14 +5,19 @@\n \n \n @register_geoseries_method\n-def xy(s: gpd.GeoSeries, /) -> pd.Series:\n+def xy(s: gpd.GeoSeries, /, reverse: bool = False) -> pd.Series:\n     \"\"\"\n     Return the x and y location of Point geometries in a GeoSeries.\n \n+    Parameters\n+    ----------\n+    reverse : bool, default False\n+        If True, return (y, x) instead.\n+\n     Returns\n     -------\n     Series\n-        tuple of x and y coordinates.\n+        tuple of coordinate.\n \n     See Also\n     --------\n@@ -24,17 +29,26 @@\n     >>> import dtoolkit.geoaccessor\n     >>> import geopandas as gpd\n     >>> from shapely.geometry import Point\n-    >>> s = gpd.GeoSeries([Point(1, 1), Point(2, 2), Point(3, 3)])\n+    >>> s = gpd.GeoSeries([Point(0, 1), Point(0, 2), Point(0, 3)])\n     >>> s\n-    0    POINT (1.00000 1.00000)\n-    1    POINT (2.00000 2.00000)\n-    2    POINT (3.00000 3.00000)\n+    0    POINT (0.00000 1.00000)\n+    1    POINT (0.00000 2.00000)\n+    2    POINT (0.00000 3.00000)\n     dtype: geometry\n     >>> s.xy()\n-    0    (1.0, 1.0)\n-    1    (2.0, 2.0)\n-    2    (3.0, 3.0)\n+    0    (0.0, 1.0)\n+    1    (0.0, 2.0)\n+    2    (0.0, 3.0)\n+    dtype: object\n+\n+    Set ``reverse=True`` to return (y, x).\n+\n+    >>> s.xy(True)\n+    0    (1.0, 0.0)\n+    1    (2.0, 0.0)\n+    2    (3.0, 0.0)\n     dtype: object\n     \"\"\"\n \n-    return pd.concat((s.x, s.y), axis=1).apply(tuple, axis=1)\n+    coordinates = (s.y, s.x) if reverse else (s.x, s.y)\n+    return pd.concat(coordinates, axis=1).apply(tuple, axis=1)\n", "issue": "ENH: New geoaccessor for GeoSeries to return tuple of coordinates `(x, y)`\n<!--\r\nThanks for contributing a pull request!\r\n\r\nPlease follow these standard acronyms to start the commit message:\r\n\r\n- ENH: enhancement\r\n- BUG: bug fix\r\n- DOC: documentation\r\n- TYP: type annotations\r\n- TST: addition or modification of tests\r\n- MAINT: maintenance commit (refactoring, typos, etc.)\r\n- BLD: change related to building\r\n- REL: related to releasing\r\n- API: an (incompatible) API change\r\n- DEP: deprecate something, or remove a deprecated object\r\n- DEV: development tool or utility\r\n- REV: revert an earlier commit\r\n- PERF: performance improvement\r\n- BOT: always commit via a bot\r\n- CI: related to CI or CD\r\n- CLN: Code cleanup\r\n-->\r\n\r\n- [ ] closes #xxxx\r\n- [x] whatsnew entry\r\n\r\nas title\r\n\r\n```python\r\n    >>> import dtoolkit.geoaccessor\r\n    >>> import geopandas as gpd\r\n    >>> from shapely.geometry import Point\r\n    >>> s = geopandas.GeoSeries([Point(1, 1), Point(2, 2), Point(3, 3)])\r\n    >>> s.xy\r\n    0    (1.0, 1.0)\r\n    1    (2.0, 2.0)\r\n    2    (3.0, 3.0)\r\n    dtype: object\r\n```\n", "before_files": [{"content": "import geopandas as gpd\nimport pandas as pd\n\nfrom dtoolkit.geoaccessor.register import register_geoseries_method\n\n\n@register_geoseries_method\ndef xy(s: gpd.GeoSeries, /) -> pd.Series:\n    \"\"\"\n    Return the x and y location of Point geometries in a GeoSeries.\n\n    Returns\n    -------\n    Series\n        tuple of x and y coordinates.\n\n    See Also\n    --------\n    geopandas.GeoSeries.x\n    geopandas.GeoSeries.y\n\n    Examples\n    --------\n    >>> import dtoolkit.geoaccessor\n    >>> import geopandas as gpd\n    >>> from shapely.geometry import Point\n    >>> s = gpd.GeoSeries([Point(1, 1), Point(2, 2), Point(3, 3)])\n    >>> s\n    0    POINT (1.00000 1.00000)\n    1    POINT (2.00000 2.00000)\n    2    POINT (3.00000 3.00000)\n    dtype: geometry\n    >>> s.xy()\n    0    (1.0, 1.0)\n    1    (2.0, 2.0)\n    2    (3.0, 3.0)\n    dtype: object\n    \"\"\"\n\n    return pd.concat((s.x, s.y), axis=1).apply(tuple, axis=1)\n", "path": "dtoolkit/geoaccessor/geoseries/xy.py"}], "after_files": [{"content": "import geopandas as gpd\nimport pandas as pd\n\nfrom dtoolkit.geoaccessor.register import register_geoseries_method\n\n\n@register_geoseries_method\ndef xy(s: gpd.GeoSeries, /, reverse: bool = False) -> pd.Series:\n    \"\"\"\n    Return the x and y location of Point geometries in a GeoSeries.\n\n    Parameters\n    ----------\n    reverse : bool, default False\n        If True, return (y, x) instead.\n\n    Returns\n    -------\n    Series\n        tuple of coordinate.\n\n    See Also\n    --------\n    geopandas.GeoSeries.x\n    geopandas.GeoSeries.y\n\n    Examples\n    --------\n    >>> import dtoolkit.geoaccessor\n    >>> import geopandas as gpd\n    >>> from shapely.geometry import Point\n    >>> s = gpd.GeoSeries([Point(0, 1), Point(0, 2), Point(0, 3)])\n    >>> s\n    0    POINT (0.00000 1.00000)\n    1    POINT (0.00000 2.00000)\n    2    POINT (0.00000 3.00000)\n    dtype: geometry\n    >>> s.xy()\n    0    (0.0, 1.0)\n    1    (0.0, 2.0)\n    2    (0.0, 3.0)\n    dtype: object\n\n    Set ``reverse=True`` to return (y, x).\n\n    >>> s.xy(True)\n    0    (1.0, 0.0)\n    1    (2.0, 0.0)\n    2    (3.0, 0.0)\n    dtype: object\n    \"\"\"\n\n    coordinates = (s.y, s.x) if reverse else (s.x, s.y)\n    return pd.concat(coordinates, axis=1).apply(tuple, axis=1)\n", "path": "dtoolkit/geoaccessor/geoseries/xy.py"}]}