@@ -66,6 +66,103 @@ function list_subtraction(list1, list2) {
6666 return list ;
6767}
6868
69+ function arrayEquals ( left , right ) {
70+ if ( ! Array . isArray ( right ) ) {
71+ return false ;
72+ }
73+
74+ if ( left . length !== right . length ) {
75+ return false ;
76+ }
77+
78+ for ( let i = 0 ; i < left . length ; i ++ ) {
79+ if ( equals ( left [ i ] , right [ i ] ) === false ) {
80+ return false ;
81+ }
82+ }
83+
84+ return true ;
85+ }
86+
87+ function tupleEquals ( left , right ) {
88+ if ( right instanceof ErlangTypes . Tuple === false ) {
89+ return false ;
90+ }
91+
92+ if ( left . length !== right . length ) {
93+ return false ;
94+ }
95+
96+ return arrayEquals ( left . values , right . values ) ;
97+ }
98+
99+ function bitstringEquals ( left , right ) {
100+ if ( right instanceof ErlangTypes . BitString === false ) {
101+ return false ;
102+ }
103+
104+ if ( left . length !== right . length ) {
105+ return false ;
106+ }
107+
108+ return arrayEquals ( left . value , right . value ) ;
109+ }
110+
111+ function pidEquals ( left , right ) {
112+ if ( right instanceof ErlangTypes . PID === false ) {
113+ return false ;
114+ }
115+
116+ return left . id === right . id ;
117+ }
118+
119+ function referenceEquals ( left , right ) {
120+ if ( right instanceof ErlangTypes . Reference === false ) {
121+ return false ;
122+ }
123+
124+ return left . id === right . id ;
125+ }
126+
127+ function mapEquals ( left , right ) {
128+ if ( right instanceof Map === false ) {
129+ return false ;
130+ }
131+
132+ const leftEntries = Array . from ( left . entries ( ) ) ;
133+ const rightEntries = Array . from ( right . entries ( ) ) ;
134+
135+ return arrayEquals ( leftEntries , rightEntries ) ;
136+ }
137+
138+ function equals ( left , right ) {
139+ if ( Array . isArray ( left ) ) {
140+ return arrayEquals ( left , right ) ;
141+ }
142+
143+ if ( left instanceof ErlangTypes . Tuple ) {
144+ return tupleEquals ( left , right ) ;
145+ }
146+
147+ if ( left instanceof ErlangTypes . PID ) {
148+ return pidEquals ( left , right ) ;
149+ }
150+
151+ if ( left instanceof ErlangTypes . BitString ) {
152+ return bitstringEquals ( left , right ) ;
153+ }
154+
155+ if ( left instanceof ErlangTypes . Reference ) {
156+ return referenceEquals ( left , right ) ;
157+ }
158+
159+ if ( left instanceof Map ) {
160+ return mapEquals ( left , right ) ;
161+ }
162+
163+ return left === right ;
164+ }
165+
69166function div ( left , right ) {
70167 return left / right ;
71168}
@@ -473,4 +570,5 @@ export default {
473570 list_to_binary,
474571 nodes,
475572 function_exported,
573+ equals,
476574} ;
0 commit comments