""" Module defining the 2 sub modules each defining a flavour of typed iterable classes

Light
-----
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.

(more detailed explanation in the 'light' module docstring)

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 will raise a 'TypeRestrictionError'.

(more detailed explanation in the 'complete' module docstring)
"""
from ._base import (
    _FrozenTypedIter, 
    _MutableTypedIter,
    Item_T,
)

from . import light, complete

__all__ = [
    "light", "complete"
]