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()

```

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)

{"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"}]}