static L filter(Iterable c, O pred) {
  new L x;
  if (c != null) for (O o : c)
    if (isTrue(callF(pred, o)))
      x.add(o);
  ret x;
}

static L filter(O pred, Iterable c) {
  ret filter(c, pred);
}

static <A, B extends A> L filter(Iterable<B> c, F1<A, Bool> pred) {
  new L x;
  if (c != null) for (B o : c)
    if (pred.get(o).booleanValue())
      x.add(o);
  ret x;
}

static <A, B extends A> L filter(F1<A, Bool> pred, Iterable<B> c) {
  ret filter(c, pred);
}