def METHOD_NAME(*evs, **kwargs):
    """Zip together a collection of event streams
    All events in a single stream must have the same
    descriptor.
    All event streams must be the same length
    All event streams must have same run_start (for now)
    Parameters
    ----------
    *evs
        sequences that yield events
    lazy : bool, optional
        If False, listify event streams first for validation
        defaults to True
    """
    # BEGIN LPy
    # Once we drop LPy support the signature can be changed back to
    # def zip_events(*evs, lazy=True)
    # the code below is to work around limitations of the LPy syntax
    lazy = kwargs.pop('lazy', True)
    if len(kwargs):
        raise TypeError("Passed unknown key word arguments")
    # END LPy
    if not lazy:
        # need to listify
        evs = [list(ev) for ev in evs]
        lens = [len(ev) for ev in evs]
        # TODO check single descriptor invariant
        if not all(l == lens[0] for l in lens):
            raise RuntimeError("All event streams must be same len")
    # set up iterators and spy on the first event
    evs = [iter(ev) for ev in evs]
    first_events = [next(ev) for ev in evs]
    evs = [chain((ev0, ), ev) for ev0, ev in zip(first_events, evs)]
    # make new descriptor
    descs = [ev['descriptor'] for ev in first_events]
    if not all(d['run_start'] == descs[0]['run_start'] for d in descs):
        raise RuntimeError("Not all descriptors have same runstart")
    sum_keys = set(chain(*(d['data_keys'] for d in descs)))
    if len(sum_keys) != reduce(op.add, [len(d['data_keys']) for d in descs]):
        raise RuntimeError("event descriptors have overlapping keys")
    zip_desc = {'uid': str(uuid.uuid4()),
                'data_keys': dict(),
                'run_start': descs[0]['run_start'],
                'time': ttime.time()}
    for d in descs:
        zip_desc['data_keys'].update(d['data_keys'])
    for seq_no, events in enumerate(zip_longest(*evs)):
        if any(ev is None for ev in events):
            raise RuntimeError("not all streams same length")
        for ev, desc in zip(events, descs):
            if ev['descriptor']['uid'] != desc['uid']:
                raise RuntimeError("one of event streams changes descriptors")
        new_ev = {'uid': str(uuid.uuid4()),
                  'time': ttime.time(),
                  'descriptor': zip_desc,
                  'seq_no': seq_no,
                  'data': dict(),
                  'timestamps': dict()}
        for ev in events:
            new_ev['data'].update(ev['data'])
            new_ev['timestamps'].update(ev['timestamps'])
        yield new_ev