""" Package providing type-safe versions of some of python's built-in iterables 

Exported Classes
----------------

- lists equivalents
    - **TypedList_lt** *(light version)*
    - **TypedList** *(complete version)*

- tuples equivalents
    - **TypedTuple_lt** *(light version)*
    - **TypedTuple** *(complete version)*

- sets equivalents
    - **TypedSet_lt** *(light version)*
    - **TypedSet** *(complete version)*

- frozensets equivalents
    - **TypedFrozenset_lt** *(light version)*
    - **TypedFrozneset** *(complete version)*

    
Exported Sub-Modules
--------------------
- **utils**
    utility functions

- **exceptions**
    typediter custom exceptions

- **types**
    type hinting utilities


Difference between 'light' and 'complete'
-----------------------------------------
(i) All exported iterables are available in two different versions

**Light** (classes ending in '_lt')

Guarantees the type safety of the instance's items.

Classes only overriding mutating methods that could insert incompatible items.
All non-mutating methods are handled by the built-in iterable they are based on,
which makes them faster. (except for copy which is overridden)

*Example:*

The addition between a TypedList_lt (light) and a list will return 
a new instance of a non-typed built-in list.
And the operation is not type-restricted.


**Complete**

Guarantees the type safety of the instance's items,
as well as the type safety of the new instances generated by operations.

Classes overriding mutating methods that could insert incompatible items,
as well as all methods that were returning an instance of the same class,
making them return a new typed iterable instance.

*Example:*

The addition between a TypedList (complete) and a list will return 
a new instance of TypedList, and if the operation can introduce an incompatible item 
in the result, it can raise a 'TypeRestrictionError'.
"""

from .classes.light import (
    TypedList_lt,
    TypedTuple_lt,
    TypedSet_lt,
    TypedFrozenset_lt
)

from .classes.complete import (
    TypedList,
    TypedTuple,
    TypedSet,
    TypedFrozenset
)

from . import utils, types, exceptions

__all__ = [
    "TypedList_lt", "TypedList",
    "TypedTuple_lt", "TypedTuple",
    "TypedSet_lt", "TypedSet",
    "TypedFrozenset_lt", "TypedFrozenset",
    "utils", "exceptions", "types"
]