* the `self` Path object is assumed to be a directory

        :param filter_fn:
            a `None` object or
            a predicative function `str -> bool` which will be applied on the
            filename/directory in `self` directory.

        :return:
            a tuple of Path objects
            each of which represents a file/directory
            in `self` directory.

            If the filter_fn is not None,
            each item in return tuple whose filename/directory name
            doesn't match the `filter_fn` will filtered.

        e.g:
            - Dir1
                - File.py
                - File.pyi
                - File.pyx
            Dir1.list_dir(lambda path: '.py' in path)
            => [<Path object of File1.py>]

            Dir1.list_dir(lambda path: print(path))
            IO:
              File.py
              File.pyi
              File.pyx
            => []

def list_dir(self, filter_fn=None) -> 'Tuple[Path, ...]':
        """
        * the `self` Path object is assumed to be a directory

        :param filter_fn:
            a `None` object or
            a predicative function `str -> bool` which will be applied on the
            filename/directory in `self` directory.

        :return:
            a tuple of Path objects
            each of which represents a file/directory
            in `self` directory.

            If the filter_fn is not None,
            each item in return tuple whose filename/directory name
            doesn't match the `filter_fn` will filtered.

        e.g:
            - Dir1
                - File.py
                - File.pyi
                - File.pyx
            Dir1.list_dir(lambda path: '.py' in path)
            => [<Path object of File1.py>]

            Dir1.list_dir(lambda path: print(path))
            IO:
              File.py
              File.pyi
              File.pyx
            => []
        """

        path = str(self)
        items = os.listdir(path)
        if filter_fn is not None:
            items = filter(filter_fn, items)

        return tuple(Path(path_join((path, item))) for item in items)