ifclass F0
static <A> A pcallF_typed(F0<A> f) {
  pcall { ret f?!; } null;
}
endif

ifclass F1
static <A, B> B pcallF_typed(F1<A, B> f, A a) {
  pcall { ret f?.get(a); } null;
}
endif

ifclass VF1
static <A> void pcallF_typed(VF1<A> f, A a) {
  pcall {
    f?.get(a);
  }
}
endif

static <A> void pcallF_typed(IVF1<A> f, A a) {
  pcall {
    f?.get(a);
  }
}

static <A, B> void pcallF_typed(IVF2<A, B> f, A a, B b) {
  pcall {
    f?.get(a, b);
  }
}

sO pcallF_typed(Runnable r) {
  pcall { r?.run(); } null;
}

static <A> A pcallF_typed(IF0<A> f) {
  pcall { ret f?!; } null;
}

static <A, B> B pcallF_typed(IF1<A, B> f, A a) {
  pcall { ret f?.get(a); } null;
}