// Copyright 2026 International Digital Economy Academy
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

///|
pub impl[T0 : Eq, T1 : Eq] Eq for (T0, T1) with fn equal(
  self : (T0, T1),
  other : (T0, T1),
) -> Bool {
  self.0 == other.0 && self.1 == other.1
}

///|
pub impl[T0 : Eq, T1 : Eq, T2 : Eq] Eq for (T0, T1, T2) with fn equal(
  self : (T0, T1, T2),
  other : (T0, T1, T2),
) -> Bool {
  self.0 == other.0 && self.1 == other.1 && self.2 == other.2
}

///|
pub impl[T0 : Eq, T1 : Eq, T2 : Eq, T3 : Eq] Eq for (T0, T1, T2, T3) with fn equal(
  self : (T0, T1, T2, T3),
  other : (T0, T1, T2, T3),
) -> Bool {
  self.0 == other.0 &&
  self.1 == other.1 &&
  self.2 == other.2 &&
  self.3 == other.3
}

///|
pub impl[T0 : Eq, T1 : Eq, T2 : Eq, T3 : Eq, T4 : Eq] Eq for (
  T0,
  T1,
  T2,
  T3,
  T4,
) with fn equal(self : (T0, T1, T2, T3, T4), other : (T0, T1, T2, T3, T4)) -> Bool {
  self.0 == other.0 &&
  self.1 == other.1 &&
  self.2 == other.2 &&
  self.3 == other.3 &&
  self.4 == other.4
}

///|
pub impl[T0 : Eq, T1 : Eq, T2 : Eq, T3 : Eq, T4 : Eq, T5 : Eq] Eq for (
  T0,
  T1,
  T2,
  T3,
  T4,
  T5,
) with fn equal(
  self : (T0, T1, T2, T3, T4, T5),
  other : (T0, T1, T2, T3, T4, T5),
) -> Bool {
  self.0 == other.0 &&
  self.1 == other.1 &&
  self.2 == other.2 &&
  self.3 == other.3 &&
  self.4 == other.4 &&
  self.5 == other.5
}

///|
pub impl[T0 : Eq, T1 : Eq, T2 : Eq, T3 : Eq, T4 : Eq, T5 : Eq, T6 : Eq] Eq for (
  T0,
  T1,
  T2,
  T3,
  T4,
  T5,
  T6,
) with fn equal(
  self : (T0, T1, T2, T3, T4, T5, T6),
  other : (T0, T1, T2, T3, T4, T5, T6),
) -> Bool {
  self.0 == other.0 &&
  self.1 == other.1 &&
  self.2 == other.2 &&
  self.3 == other.3 &&
  self.4 == other.4 &&
  self.5 == other.5 &&
  self.6 == other.6
}

///|
pub impl[T0 : Eq, T1 : Eq, T2 : Eq, T3 : Eq, T4 : Eq, T5 : Eq, T6 : Eq, T7 : Eq] Eq for (
  T0,
  T1,
  T2,
  T3,
  T4,
  T5,
  T6,
  T7,
) with fn equal(
  self : (T0, T1, T2, T3, T4, T5, T6, T7),
  other : (T0, T1, T2, T3, T4, T5, T6, T7),
) -> Bool {
  self.0 == other.0 &&
  self.1 == other.1 &&
  self.2 == other.2 &&
  self.3 == other.3 &&
  self.4 == other.4 &&
  self.5 == other.5 &&
  self.6 == other.6 &&
  self.7 == other.7
}

///|
pub impl[
  T0 : Eq,
  T1 : Eq,
  T2 : Eq,
  T3 : Eq,
  T4 : Eq,
  T5 : Eq,
  T6 : Eq,
  T7 : Eq,
  T8 : Eq,
] Eq for (T0, T1, T2, T3, T4, T5, T6, T7, T8) with fn equal(
  self : (T0, T1, T2, T3, T4, T5, T6, T7, T8),
  other : (T0, T1, T2, T3, T4, T5, T6, T7, T8),
) -> Bool {
  self.0 == other.0 &&
  self.1 == other.1 &&
  self.2 == other.2 &&
  self.3 == other.3 &&
  self.4 == other.4 &&
  self.5 == other.5 &&
  self.6 == other.6 &&
  self.7 == other.7 &&
  self.8 == other.8
}

///|
pub impl[
  T0 : Eq,
  T1 : Eq,
  T2 : Eq,
  T3 : Eq,
  T4 : Eq,
  T5 : Eq,
  T6 : Eq,
  T7 : Eq,
  T8 : Eq,
  T9 : Eq,
] Eq for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) with fn equal(
  self : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9),
  other : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9),
) -> Bool {
  self.0 == other.0 &&
  self.1 == other.1 &&
  self.2 == other.2 &&
  self.3 == other.3 &&
  self.4 == other.4 &&
  self.5 == other.5 &&
  self.6 == other.6 &&
  self.7 == other.7 &&
  self.8 == other.8 &&
  self.9 == other.9
}

///|
pub impl[
  T0 : Eq,
  T1 : Eq,
  T2 : Eq,
  T3 : Eq,
  T4 : Eq,
  T5 : Eq,
  T6 : Eq,
  T7 : Eq,
  T8 : Eq,
  T9 : Eq,
  T10 : Eq,
] Eq for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) with fn equal(
  self : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10),
  other : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10),
) -> Bool {
  self.0 == other.0 &&
  self.1 == other.1 &&
  self.2 == other.2 &&
  self.3 == other.3 &&
  self.4 == other.4 &&
  self.5 == other.5 &&
  self.6 == other.6 &&
  self.7 == other.7 &&
  self.8 == other.8 &&
  self.9 == other.9 &&
  self.10 == other.10
}

///|
pub impl[
  T0 : Eq,
  T1 : Eq,
  T2 : Eq,
  T3 : Eq,
  T4 : Eq,
  T5 : Eq,
  T6 : Eq,
  T7 : Eq,
  T8 : Eq,
  T9 : Eq,
  T10 : Eq,
  T11 : Eq,
] Eq for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) with fn equal(
  self : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11),
  other : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11),
) -> Bool {
  self.0 == other.0 &&
  self.1 == other.1 &&
  self.2 == other.2 &&
  self.3 == other.3 &&
  self.4 == other.4 &&
  self.5 == other.5 &&
  self.6 == other.6 &&
  self.7 == other.7 &&
  self.8 == other.8 &&
  self.9 == other.9 &&
  self.10 == other.10 &&
  self.11 == other.11
}

///|
pub impl[
  T0 : Eq,
  T1 : Eq,
  T2 : Eq,
  T3 : Eq,
  T4 : Eq,
  T5 : Eq,
  T6 : Eq,
  T7 : Eq,
  T8 : Eq,
  T9 : Eq,
  T10 : Eq,
  T11 : Eq,
  T12 : Eq,
] Eq for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) with fn equal(
  self : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12),
  other : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12),
) -> Bool {
  self.0 == other.0 &&
  self.1 == other.1 &&
  self.2 == other.2 &&
  self.3 == other.3 &&
  self.4 == other.4 &&
  self.5 == other.5 &&
  self.6 == other.6 &&
  self.7 == other.7 &&
  self.8 == other.8 &&
  self.9 == other.9 &&
  self.10 == other.10 &&
  self.11 == other.11 &&
  self.12 == other.12
}

///|
pub impl[
  T0 : Eq,
  T1 : Eq,
  T2 : Eq,
  T3 : Eq,
  T4 : Eq,
  T5 : Eq,
  T6 : Eq,
  T7 : Eq,
  T8 : Eq,
  T9 : Eq,
  T10 : Eq,
  T11 : Eq,
  T12 : Eq,
  T13 : Eq,
] Eq for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) with fn equal(
  self : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13),
  other : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13),
) -> Bool {
  self.0 == other.0 &&
  self.1 == other.1 &&
  self.2 == other.2 &&
  self.3 == other.3 &&
  self.4 == other.4 &&
  self.5 == other.5 &&
  self.6 == other.6 &&
  self.7 == other.7 &&
  self.8 == other.8 &&
  self.9 == other.9 &&
  self.10 == other.10 &&
  self.11 == other.11 &&
  self.12 == other.12 &&
  self.13 == other.13
}

///|
pub impl[
  T0 : Eq,
  T1 : Eq,
  T2 : Eq,
  T3 : Eq,
  T4 : Eq,
  T5 : Eq,
  T6 : Eq,
  T7 : Eq,
  T8 : Eq,
  T9 : Eq,
  T10 : Eq,
  T11 : Eq,
  T12 : Eq,
  T13 : Eq,
  T14 : Eq,
] Eq for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) with fn equal(
  self : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14),
  other : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14),
) -> Bool {
  self.0 == other.0 &&
  self.1 == other.1 &&
  self.2 == other.2 &&
  self.3 == other.3 &&
  self.4 == other.4 &&
  self.5 == other.5 &&
  self.6 == other.6 &&
  self.7 == other.7 &&
  self.8 == other.8 &&
  self.9 == other.9 &&
  self.10 == other.10 &&
  self.11 == other.11 &&
  self.12 == other.12 &&
  self.13 == other.13 &&
  self.14 == other.14
}

///|
pub impl[
  T0 : Eq,
  T1 : Eq,
  T2 : Eq,
  T3 : Eq,
  T4 : Eq,
  T5 : Eq,
  T6 : Eq,
  T7 : Eq,
  T8 : Eq,
  T9 : Eq,
  T10 : Eq,
  T11 : Eq,
  T12 : Eq,
  T13 : Eq,
  T14 : Eq,
  T15 : Eq,
] Eq for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) with fn equal(
  self : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15),
  other : (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15),
) -> Bool {
  self.0 == other.0 &&
  self.1 == other.1 &&
  self.2 == other.2 &&
  self.3 == other.3 &&
  self.4 == other.4 &&
  self.5 == other.5 &&
  self.6 == other.6 &&
  self.7 == other.7 &&
  self.8 == other.8 &&
  self.9 == other.9 &&
  self.10 == other.10 &&
  self.11 == other.11 &&
  self.12 == other.12 &&
  self.13 == other.13 &&
  self.14 == other.14 &&
  self.15 == other.15
}