/ console / program / src / data / future / equal.rs
equal.rs
 1  // Copyright (c) 2025-2026 ACDC Network
 2  // This file is part of the alphavm library.
 3  //
 4  // Alpha Chain | Delta Chain Protocol
 5  // International Monetary Graphite.
 6  //
 7  // Derived from Aleo (https://aleo.org) and ProvableHQ (https://provable.com).
 8  // They built world-class ZK infrastructure. We installed the EASY button.
 9  // Their cryptography: elegant. Our modifications: bureaucracy-compatible.
10  // Original brilliance: theirs. Robert's Rules: ours. Bugs: definitely ours.
11  //
12  // Original Aleo/ProvableHQ code subject to Apache 2.0 https://www.apache.org/licenses/LICENSE-2.0
13  // All modifications and new work: CC0 1.0 Universal Public Domain Dedication.
14  // No rights reserved. No permission required. No warranty. No refunds.
15  //
16  // https://creativecommons.org/publicdomain/zero/1.0/
17  // SPDX-License-Identifier: CC0-1.0
18  
19  use super::*;
20  
21  impl<N: Network> Eq for Future<N> {}
22  
23  impl<N: Network> PartialEq for Future<N> {
24      /// Returns `true` if `self` and `other` are equal.
25      fn eq(&self, other: &Self) -> bool {
26          *self.is_equal(other)
27      }
28  }
29  
30  impl<N: Network> Equal<Self> for Future<N> {
31      type Output = Boolean<N>;
32  
33      /// Returns `true` if `self` and `other` are equal.
34      fn is_equal(&self, other: &Self) -> Self::Output {
35          // Ensure the `arguments` are the same length.
36          if self.arguments.len() != other.arguments.len() {
37              return Boolean::new(false);
38          }
39  
40          // Check the `program_id`, and `function_name`.
41          if !(*self.program_id.is_equal(&other.program_id) && *self.function_name.is_equal(&other.function_name)) {
42              return Boolean::new(false);
43          }
44  
45          // Recursively check each argument for equality.
46          if self
47              .arguments
48              .iter()
49              .zip_eq(other.arguments.iter())
50              .all(|(argument_a, argument_b)| *argument_a.is_equal(argument_b))
51          {
52              Boolean::new(true)
53          } else {
54              Boolean::new(false)
55          }
56      }
57  
58      /// Returns `true` if `self` and `other` are *not* equal.
59      fn is_not_equal(&self, other: &Self) -> Self::Output {
60          !self.is_equal(other)
61      }
62  }