using System;
using System.Collections.Generic;
using System.Text;

namespace CategoryTheory
{
    /// <summary>
    /// The arrow of math category theory
    /// </summary>
    public interface ICategoryArrow : IAssociatedObject
    {
        /// <summary>
        /// The source of this arrow
        /// </summary>
        ICategoryObject Source
        {
            get;
            set;
        }

        /// <summary>
        /// The target of this arrow
        /// </summary>
        ICategoryObject Target
        {
            get;
            set;
        }

        /// <summary>
        /// The "is monomorhpism" sign
        /// </summary>
        bool IsMonomorphism
        {
            get;
        }

        /// <summary>
        /// The "is epimorhpism" sign
        /// </summary>
        bool IsEpimorphism
        {
            get;
        }

        /// <summary>
        /// The "is isoomorhpism" sign
        /// </summary>
        bool IsIsomorphism
        {
            get;
        }


        /// <summary>
        /// Composes this arrow "f" with next arrow "g" 
        /// </summary>
        /// <param name="category"> The category of arrow</param>
        /// <param name="next"> The next arrow "g" </param>
        /// <returns>Composition "fg" </returns>
        ICategoryArrow Compose(ICategory category, ICategoryArrow next);

    }

}
