using System;
using System.Collections.Generic;
using System.Text;
namespace CategoryTheory
{
/// <summary>
/// Bifunctor
/// </summary>
public interface IBifunctor : ICategoryArrow, ICategoryObject
{
/// <summary>
/// Calculates arrow
/// </summary>
/// <param name="arrow1">Arrow 1</param>
/// <param name="arrow2">Arrow 2</param>
/// <returns>Result arrow</returns>
ICategoryArrow CalculateArrow(ICategoryArrow arrow1, ICategoryArrow arrow2);
/// <summary>
/// Calculates arrow
/// </summary>
/// <param name="source">Source object</param>
/// <param name="target">Target object</param>
/// <param name="arrow1">Arrow 1</param>
/// <param name="arrow2">Arrow 2</param>
/// <returns>Result arrou</returns>
ICategoryArrow CalculateArrow(ICategoryObject source,
ICategoryObject target,
ICategoryArrow arrow1, ICategoryArrow arrow2);
/// <summary>
/// Calculates object
/// </summary>
/// <param name="obj1">Object 1</param>
/// <param name="obj2">Object 2</param>
/// <returns>Result object</returns>
ICategoryObject CalculateObject(ICategoryObject obj1, ICategoryObject obj2);
/// <summary>
/// The "is covariant" sign
/// </summary>
/// <param name="n">Number of argument</param>
/// <returns>Thue if it is covariant by n - th argument and false othewise</returns>
bool IsCovariant(int n);
}
}