@@ -7,12 +7,62 @@ const ERROR = Symbol.for('error');
77const BADMAP = Symbol . for ( 'badmap' ) ;
88const BADKEY = Symbol . for ( 'badkey' ) ;
99
10+ function is_non_primitive ( key ) {
11+ return (
12+ erlang . is_list ( key ) ||
13+ erlang . is_map ( key ) ||
14+ erlang . is_pid ( key ) ||
15+ erlang . is_reference ( key ) ||
16+ erlang . is_bitstring ( key )
17+ ) ;
18+ }
19+
20+ function __has ( map , key ) {
21+ if ( is_non_primitive ( key ) ) {
22+ for ( const map_key of map . keys ( ) ) {
23+ if ( erlang . equals ( map_key , key ) ) {
24+ return true ;
25+ }
26+ }
27+
28+ return false ;
29+ }
30+
31+ return map . has ( key ) ;
32+ }
33+
34+ function __get ( map , key ) {
35+ if ( is_non_primitive ( key ) ) {
36+ for ( const map_key of map . keys ( ) ) {
37+ if ( erlang . equals ( map_key , key ) ) {
38+ return map . get ( map_key ) ;
39+ }
40+ }
41+
42+ return null ;
43+ }
44+
45+ return map . get ( key ) ;
46+ }
47+
48+ function __delete ( map , key ) {
49+ if ( is_non_primitive ( key ) ) {
50+ for ( const map_key of map . keys ( ) ) {
51+ if ( erlang . equals ( map_key , key ) ) {
52+ map . delete ( map_key ) ;
53+ }
54+ }
55+ } else {
56+ map . delete ( key ) ;
57+ }
58+ }
59+
1060function find ( key , map ) {
1161 if ( erlang . is_map ( map ) === false ) {
1262 return new ErlangTypes . Tuple ( BADMAP , map ) ;
1363 }
1464
15- const value = map . get ( key ) ;
65+ const value = __get ( map , key ) ;
1666
1767 if ( typeof value !== 'undefined' ) {
1868 return new ErlangTypes . Tuple ( OK , value ) ;
@@ -38,7 +88,7 @@ function remove(key, map1) {
3888
3989 const map2 = new Map ( map1 ) ;
4090
41- map2 . delete ( key ) ;
91+ __delete ( map2 , key ) ;
4292
4393 return map2 ;
4494}
@@ -83,7 +133,7 @@ function values(map) {
83133}
84134
85135function is_key ( key , map ) {
86- return map . has ( key ) ;
136+ return __has ( map , key ) ;
87137}
88138
89139function put ( key , value , map1 ) {
@@ -130,7 +180,7 @@ function get(...args) {
130180 }
131181
132182 if ( is_key ( key ) ) {
133- return map . get ( key ) ;
183+ return __get ( map , key ) ;
134184 }
135185
136186 if ( args . length === 3 ) {
@@ -149,9 +199,9 @@ function take(key, map1) {
149199 return ERROR ;
150200 }
151201
152- const value = map1 . get ( key ) ;
202+ const value = __get ( map1 , key ) ;
153203 const map2 = new Map ( map1 ) ;
154- map2 . delete ( key ) ;
204+ __delete ( map2 , key ) ;
155205
156206 return new ErlangTypes . Tuple ( value , map2 ) ;
157207}
@@ -170,4 +220,5 @@ export default {
170220 update,
171221 get,
172222 take,
223+ __has,
173224} ;
0 commit comments