xref: /plugin/combo/vendor/antlr/antlr4-php-runtime/src/Comparison/Equality.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
1*37748cd8SNickeau<?php
2*37748cd8SNickeau
3*37748cd8SNickeaudeclare(strict_types=1);
4*37748cd8SNickeau
5*37748cd8SNickeaunamespace Antlr\Antlr4\Runtime\Comparison;
6*37748cd8SNickeau
7*37748cd8SNickeaufinal class Equality
8*37748cd8SNickeau{
9*37748cd8SNickeau    private function __construct()
10*37748cd8SNickeau    {
11*37748cd8SNickeau    }
12*37748cd8SNickeau
13*37748cd8SNickeau    /**
14*37748cd8SNickeau     * @param mixed $left
15*37748cd8SNickeau     * @param mixed $right
16*37748cd8SNickeau     */
17*37748cd8SNickeau    public static function equals($left, $right) : bool
18*37748cd8SNickeau    {
19*37748cd8SNickeau        if ($left instanceof Equatable && $right instanceof Equatable) {
20*37748cd8SNickeau            return $left->equals($right);
21*37748cd8SNickeau        }
22*37748cd8SNickeau
23*37748cd8SNickeau        if (\is_array($left) && \is_array($right)) {
24*37748cd8SNickeau            return self::deeplyEquals($left, $right);
25*37748cd8SNickeau        }
26*37748cd8SNickeau
27*37748cd8SNickeau        return $left === $right;
28*37748cd8SNickeau    }
29*37748cd8SNickeau
30*37748cd8SNickeau    /**
31*37748cd8SNickeau     * @param array<mixed> $left
32*37748cd8SNickeau     * @param array<mixed> $right
33*37748cd8SNickeau     */
34*37748cd8SNickeau    private static function deeplyEquals(array $left, array $right) : bool
35*37748cd8SNickeau    {
36*37748cd8SNickeau        if ($left === $right) {
37*37748cd8SNickeau            return true;
38*37748cd8SNickeau        }
39*37748cd8SNickeau
40*37748cd8SNickeau        if (\count($left) !== \count($right)) {
41*37748cd8SNickeau            return false;
42*37748cd8SNickeau        }
43*37748cd8SNickeau
44*37748cd8SNickeau        foreach ($left as $key => $value) {
45*37748cd8SNickeau            if (!isset($right[$key])) {
46*37748cd8SNickeau                return false;
47*37748cd8SNickeau            }
48*37748cd8SNickeau
49*37748cd8SNickeau            if (!self::equals($value, $right[$key])) {
50*37748cd8SNickeau                return false;
51*37748cd8SNickeau            }
52*37748cd8SNickeau        }
53*37748cd8SNickeau
54*37748cd8SNickeau        return true;
55*37748cd8SNickeau    }
56*37748cd8SNickeau}
57