Dynamically creates a thread-safe class which exposes the same API as
    the provided thread-unsafe class, but for which all public methods now:
    - accept an iterable of inputs,
    - parallelize processing of this iterable on a pool of workers.

    The resulting class's __init__ method optionally accepts: %s

def concurrent_class_factory(concurrent_class_name, thread_unsafe_class):
    '''
    Dynamically creates a thread-safe class which exposes the same API as
    the provided thread-unsafe class, but for which all public methods now:
    - accept an iterable of inputs,
    - parallelize processing of this iterable on a pool of workers.

    The resulting class's __init__ method optionally accepts: %s
    '''
    concurrent_class = _create_blank_concurrent_class(concurrent_class_name, thread_unsafe_class)
    for method_name, method in getmembers(thread_unsafe_class, lambda x: ismethod(x) or isfunction(x)):
        if not method_name.startswith('_'):
            setattr(concurrent_class, method_name, _mapper_for(method, method_name))
    return concurrent_class