public string Format(Lst <X> list) => "[" + string.Join(",", list.Stream()) + "]";
public static Lst <Z> SelectMany <X, Y, Z>(this Lst <X> list, Func <X, Lst <Y> > lift, Func <X, Y, Z> project) => Lst.make(from x in list.Stream() from y in lift(x).Stream() select project(x, y));
public static Lst <X> Where <X>(this Lst <X> list, Func <X, bool> predicate) => Lst.make(from x in list.Stream() where predicate(x) select x);
public static Lst <Y> Select <X, Y>(this Lst <X> list, Func <X, Y> selector) => Lst.make(from x in list.Stream() select selector(x));