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

namespace CategoryTheory
{
    /// <summary>
    /// The math category functor 
    /// </summary>
    public interface IFunctor : ICategoryArrow, ICategoryObject
    {

        /// <summary>
        /// Calculates arrow 
        /// </summary>
        /// <param name="arrow">The source arrow</param>
        /// <returns>The target arrow</returns>
        ICategoryArrow CalculateArrow(ICategoryArrow arrow);

        /// <summary>
        /// Calculates an arrow
        /// </summary>
        /// <param name="source">The source of the source arrow</param>
        /// <param name="target">The target of the source arrow</param>
        /// <param name="arrow">The source arrow</param>
        /// <returns>The target arrow</returns>
        ICategoryArrow CalculateArrow(ICategoryObject source,
            ICategoryObject target, ICategoryArrow arrow);

        /// <summary>
        /// Calculates an object
        /// </summary>
        /// <param name="obj">The source object</param>
        /// <returns>The target object</returns>
        ICategoryObject CalculateObject(ICategoryObject obj);

        /// <summary>
        /// The "is covariant" sign
        /// </summary>
        bool IsCovariant
        {
            get;
        }
    }

}
