public int getWidth() {
      class MyProcecure implements TObjectProcedure<PsiType> {
        int width = 0;

        public boolean execute(PsiType type) {
          if (substitute(type) != null) width++;
          return true;
        }

        public int getWidth() {
          return width;
        }
      }

      MyProcecure procedure = new MyProcecure();
      myBindings.forEachValue(procedure);
      return procedure.getWidth();
    }
 private void scheduleTimeoutCheck() {
   final Ref<Long> nextTime = Ref.create(Long.MAX_VALUE);
   synchronized (myLock) {
     if (myTimeoutHandlers.isEmpty()) return;
     myTimeoutHandlers.forEachValue(
         new TObjectProcedure<TimeoutHandler>() {
           public boolean execute(TimeoutHandler handler) {
             nextTime.set(Math.min(nextTime.get(), handler.myLastTime));
             return true;
           }
         });
   }
   final int delay = (int) (nextTime.get() - System.currentTimeMillis() + 100);
   LOG.debug("schedule timeout check in " + delay + "ms");
   if (delay > 10) {
     myTimeoutAlarm.cancelAllRequests();
     myTimeoutAlarm.addRequest(() -> checkTimeout(), delay);
   } else {
     checkTimeout();
   }
 }