Example #1
0
        public IMorphism <TSource, TResult, IMonoid <T> > o <TSource, TMiddle, TResult>(
            IMorphism <TMiddle, TResult, IMonoid <T> > m2, IMorphism <TSource, TMiddle, IMonoid <T> > m1)
        {
            if (!(typeof(T).IsAssignableFrom(typeof(TSource)) && typeof(T).IsAssignableFrom(typeof(TMiddle)) &&
                  typeof(T).IsAssignableFrom(typeof(TResult))))
            {
                throw new InvalidOperationException($"Category {nameof(Monoid<T>)} has only 1 object {nameof(T)}.");
            }

            return(new MonoidMorphism <T>(
                       this,
                       _ => this.Binary(
                           (T)(object)m1.Invoke((TSource)(object)this.Unit),
                           (T)(object)m2.Invoke((TMiddle)(object)this.Unit)))
                   as IMorphism <TSource, TResult, IMonoid <T> >);
        }
Example #2
0
 public IMorphism <TSource, TResult, DotNet> o <TSource, TMiddle, TResult>
     (IMorphism <TMiddle, TResult, DotNet> m2, IMorphism <TSource, TMiddle, DotNet> m1) =>
 new DotNetMorphism <TSource, TResult>(@object => m2.Invoke(m1.Invoke(@object)));