public abstract class Operator { }
public abstract class Operator<AType, BType, CType, ACalc, BCalc, CCalc> : Operator
{
public abstract CCalc Operate(ACalc a, BCalc b);
public abstract CType Combine(CCalc[] separated);
public abstract CCalc[] Separate(CType combined);
}
public abstract class IntComposedOperator<ABCType> : Operator<ABCType, ABCType, ABCType, int, int, int>
{
public class Add : IntComposedOperator<ABCType> { public override int Operate(int a, int b) => a + b; }
public class Subtract : IntComposedOperator<ABCType> { public override int Operate(int a, int b) => a - b; }
public override ABCType Combine(int[] separated) => default;
public override int[] Separate(ABCType combined) => default;
}
public abstract class Vector3IntOperator : IntComposedOperator<Vector3Int>
{
public override Vector3Int Combine(int[] separated) => new Vector3Int(separated[0], separated[1], separated[2]);
public override int[] Separate(Vector3Int combined) => new int[] { combined.x, combined.y, combined.z };
}
public abstract class Operator { }
public abstract class Operator<AType, BType, CType, ACalc, BCalc, CCalc> : Operator
{
public abstract CCalc Operate(ACalc a, BCalc b);
public abstract CType Combine(CCalc[] separated);
public abstract CCalc[] Separate(CType combined);
}
public abstract class IntComposedOperator<ABCType> : Operator<ABCType, ABCType, ABCType, int, int, int>
{
public class Add : IntComposedOperator<ABCType> { public override int Operate(int a, int b) => a + b; }
public class Subtract : IntComposedOperator<ABCType> { public override int Operate(int a, int b) => a - b; }
public override ABCType Combine(int[] separated) => default;
public override int[] Separate(ABCType combined) => default;
}
public abstract class Vector3IntOperator : IntComposedOperator<Vector3Int>
{
public override Vector3Int Combine(int[] separated) => new Vector3Int(separated[0], separated[1], separated[2]);
public override int[] Separate(Vector3Int combined) => new int[] { combined.x, combined.y, combined.z };
}