from typing import Any
from typing import Mapping
from typing import Collection


def is_arraylike(obj: Any) -> bool:
    """Determine if the provided object is an non-mapping generic container type such as an array,\
     tuple or set.

    Example:
        >>> from collectionish.utils import is_arraylike
        >>>
        >>> is_arraylike([1, 2, 3])
        True
        >>> is_arraylike(set([1, 2, 3]))
        True
        >>> is_arraylike(tuple([1, 2, 3]))
        True
        >>> is_arraylike({'a': 1, 'b': 2})
        False
        >>> is_arraylike('a string')
        False
    """
    exclude = (Mapping, str, bytes, bytearray, range, memoryview)
    return isinstance(obj, Collection) and not isinstance(obj, exclude)