code: function give(event, data, that, rs, queue, queuing, current){
    var res, yd, q, listened;
  
    if(data instanceof Object && typeof data.then == 'function'){
  
      yd = Resolver.when(data);
  
      if(!yd.done){
        yd.listen(give, [event, yd, that, rs, queue, queuing, current]);
        return;
      }
  
      if(!yd.accepted) return;
      data = yd.value;
  
    }
  
    if(that[queuing]){
      that[queue].push([event, data]);
      return;
    }
  
    that[queuing] = true;
    that.target[current] = event;
    listened = that.target.listened(event);
  
    res = that.target[rs].get(event);
    if(res){
      that.target[rs].delete(event);
      res.accept(data);
    }
  
    delete that.target[current];
    that[queuing] = false;
  
    if(rs == resolver && typeof event == 'string' && listened && !that.target.listened(event)){
      give(that.target.eventIgnored, event, that, rs, queue, queuing, current);
    }
  
    q = that[queue];
    that[queue] = [];
    for(let [event, data] of q) give(event, data, that, rs, queue, queuing, current);
  
  }
docs: Emitter helpers