code: func (s *scheduler) signal(e *edge) {
  	s.muQ.Lock()
  	if _, ok := s.waitq[e]; !ok {
  		d := &dispatcher{e: e}
  		if s.last == nil {
  			s.next = d
  		} else {
  			s.last.next = d
  		}
  		s.last = d
  		s.waitq[e] = struct{}{}
  		s.cond.Signal()
  	}
  	s.muQ.Unlock()
  }
docs: // signal notifies that an edge needs to be processed again