"""
Pure Python implementation of some builtins.
This code is not going to be executed anywhere.
These implementations are not always correct, but should work as good as
possible for the auto completion.
"""


def next(iterator, default=None):
    if hasattr("next"):
        return iterator.next()
    else:
        return iterator.__next__()
    return default


def iter(collection, sentinel=None):
    if sentinel:
        yield collection()
    else:
        for c in collection:
            yield c


def range(start, stop=None, step=1):
    return [0]


class xrange():
    # Attention: this function doesn't exist in Py3k (there it is range).
    def __iter__(self):
        yield 1

    def count(self):
        return 1

    def index(self):
        return 1


#--------------------------------------------------------
# descriptors
#--------------------------------------------------------
class property():
    def __init__(self, fget, fset=None, fdel=None, doc=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        self.__doc__ = doc

    def __get__(self, obj, cls):
        return self.fget(obj)

    def __set__(self, obj, value):
        self.fset(obj, value)

    def __delete__(self, obj):
        self.fdel(obj)

    def setter(self, func):
        self.fset = func
        return self

    def getter(self, func):
        self.fget = func
        return self

    def deleter(self, func):
        self.fdel = func
        return self


class staticmethod():
    def __init__(self, func):
        self.__func = func

    def __get__(self, obj, cls):
        return self.__func


class classmethod():
    def __init__(self, func):
        self.__func = func

    def __get__(self, obj, cls):
        def _method(*args, **kwargs):
            return self.__func(cls, *args, **kwargs)
        return _method


#--------------------------------------------------------
# array stuff
#--------------------------------------------------------
class list():
    def __init__(self, iterable=[]):
        self.__iterable = []
        for i in iterable:
            self.__iterable += [i]

    def __iter__(self):
        for i in self.__iterable:
            yield i

    def __getitem__(self, y):
        return self.__iterable[y]

    def pop(self):
        return self.__iterable[-1]


class tuple():
    def __init__(self, iterable=[]):
        self.__iterable = []
        for i in iterable:
            self.__iterable += [i]

    def __iter__(self):
        for i in self.__iterable:
            yield i

    def __getitem__(self, y):
        return self.__iterable[y]

    def index(self):
        return 1

    def count(self):
        return 1


class set():
    def __init__(self, iterable=[]):
        self.__iterable = iterable

    def __iter__(self):
        for i in self.__iterable:
            yield i

    def pop(self):
        return self.__iterable.pop()

    def copy(self):
        return self

    def difference(self, other):
        return self - other

    def intersection(self, other):
        return self & other

    def symmetric_difference(self, other):
        return self ^ other

    def union(self, other):
        return self | other


class frozenset():
    def __init__(self, iterable=[]):
        self.__iterable = iterable

    def __iter__(self):
        for i in self.__iterable:
            yield i

    def copy(self):
        return self


class dict():
    def __init__(self, **elements):
        self.__elements = elements

    def clear(self):
        # has a strange docstr
        pass

    def get(self, k, d=None):
        # TODO implement
        try:
            #return self.__elements[k]
            pass
        except KeyError:
            return d


class reversed():
    def __init__(self, sequence):
        self.__sequence = sequence

    def __iter__(self):
        for i in self.__sequence:
            yield i

    def __next__(self):
        return next(self.__iter__())

    def next(self):
        return self.__next__()


#--------------------------------------------------------
# basic types
#--------------------------------------------------------
class int():
    def __init__(self, x, base=None):
        pass


class str():
    def __init__(self, obj):
        pass

class object():
    def mro():
        """ mro() -> list
        return a type's method resolution order """
        return [object]
