anchor.diff:    Option<A> minimum(Order<A> oa) => concatenateO(new MinSemigroup<A>(oa));
   
     Option<A> maximum(Order<A> oa) => concatenateO(new MaxSemigroup<A>(oa));
  +
  +  A intercalate(Monoid<A> mi, A a) => foldRight(none, (A ca, Option oa) => some(mi.append(ca, oa.fold(mi.zero, mi.appendC(a))))) | mi.zero();
  +
  +  collapse(ApplicativePlus ap) => foldLeft(ap.empty(), (p, a) => ap.plus(p, ap.pure(a)));
   }
   
   class FoldableOpsFoldable<F extends FoldableOps> extends Foldable<F> {
  
positive.code:   Option minimum(Order oa, F fa) => concatenateO(new MinSemigroup(oa), fa);
  
    Option maximum(Order oa, F fa) => concatenateO(new MaxSemigroup(oa), fa);
  }
  
  abstract class FoldableOps<F, A> {
  
negative.code: 
    foldMapO(Semigroup si, f(A a)) => foldMap(new OptionMonoid(si), composeF(some, f));
  
    A concatenate(Monoid<A> mi) => foldMap(mi, id);
  
    Option<A> concatenateO(Semigroup<A> si) => foldMapO(si, id);
  
    int length() => foldLeft(0, (a, b) => a+1);
  
  