public static Ord Compare <type, mark>(this ROrder <type, mark> that, type l, type r) { SSemigroup <type, Infimum <mark> > semi = that; var inf = semi.Inf(l, r); return(CreateOrd(that.Equal(r, inf).Not(), that.Equal(l, inf).Not())); }
public static type Add <type>(this SSemigroup <type, Additive <Unit> > semi, type l, type r) => semi.Op(l, r);
public static type Inf <type, mark>(this SSemigroup <type, Infimum <mark> > that, type l, type r) => that.Op(l, r);
public static type Sup <type, mark>(this SSemigroup <type, Supremum <mark> > that, type l, type r) => that.Op(l, r);
public static type Mul <type, mark>(this SSemigroup <type, Multiplicative <mark> > neu, type l, type r) => neu.Op(l, r);
public static type Op <type, mark>(this SSemigroup <type, mark> semi, type l, type r) => semi.BinOp(l, r);
public AOptMonoid(SSemigroup <val, mark> semi) { _semi = semi; }
/// <summary> /// Tuple_2 monadic join (requires Item1 type to be an additive semigrop) /// </summary> public static Tuple <left, right> Flatten <left, right>(this Tuple <left, Tuple <left, right> > that, SSemigroup <left, Additive <Unit> > semi) => // todo resolve semi that.ToPair().Map(ToPair).Flatten(semi).ToTuple();
/// <summary> /// Pair monadic join (requires left to be an additive semigrop) /// </summary> public static Pair <left, right> Flatten <left, right>(this Pair <left, Pair <left, right> > that, SSemigroup <left, Additive <Unit> > semi) => // todo resolve semi Pair(semi.BinOp(that.Left(), that.Right().Left()), that.Right().Right());