@@ -244,12 +244,14 @@ defmodule Module.Types.Apply do
244244 { :erlang , :tuple_to_list , [ { [ open_tuple ( [ ] ) ] , dynamic ( list ( term ( ) ) ) } ] } ,
245245
246246 ## Map
247+ { :maps , :remove , [ { [ term ( ) , open_map ( ) ] , open_map ( ) } ] } ,
247248 { :maps , :from_keys , [ { [ list ( term ( ) ) , term ( ) ] , open_map ( ) } ] } ,
248249 { :maps , :find ,
249250 [ { [ term ( ) , open_map ( ) ] , tuple ( [ atom ( [ :ok ] ) , term ( ) ] ) |> union ( atom ( [ :error ] ) ) } ] } ,
250251 { :maps , :get , [ { [ term ( ) , open_map ( ) ] , term ( ) } ] } ,
251252 { :maps , :is_key , [ { [ term ( ) , open_map ( ) ] , boolean ( ) } ] } ,
252253 { :maps , :keys , [ { [ open_map ( ) ] , dynamic ( list ( term ( ) ) ) } ] } ,
254+ { :maps , :put , [ { [ term ( ) , term ( ) , open_map ( ) ] , open_map ( ) } ] } ,
253255 { :maps , :take ,
254256 [ { [ term ( ) , open_map ( ) ] , tuple ( [ term ( ) , open_map ( ) ] ) |> union ( atom ( [ :error ] ) ) } ] } ,
255257 { :maps , :to_list , [ { [ open_map ( ) ] , dynamic ( list ( tuple ( [ term ( ) , term ( ) ] ) ) ) } ] } ,
@@ -425,17 +427,11 @@ defmodule Module.Types.Apply do
425427 end
426428 end
427429
428- defp remote_apply ( :maps , :keys , _info , [ map ] , stack ) do
429- case map_to_list ( map , fn key , _value -> key end ) do
430- { :ok , list_type } -> { :ok , return ( list_type , [ map ] , stack ) }
431- :badmap -> { :error , badremote ( :maps , :keys , 1 ) }
432- end
433- end
434-
435- defp remote_apply ( :maps , :values , _info , [ map ] , stack ) do
436- case map_to_list ( map , fn _key , value -> value end ) do
437- { :ok , list_type } -> { :ok , return ( list_type , [ map ] , stack ) }
438- :badmap -> { :error , badremote ( :maps , :keys , 1 ) }
430+ defp remote_apply ( :maps , :remove , _info , [ key , map ] = args_types , stack ) do
431+ case map_update ( map , key , not_set ( ) , false , true ) do
432+ { _value , descr , _errors } -> { :ok , return ( descr , args_types , stack ) }
433+ :badmap -> { :error , badremote ( :maps , :remove , 2 ) }
434+ { :error , _errors } -> { :error , { :badkeydomain , map , key , nil } }
439435 end
440436 end
441437
@@ -461,10 +457,17 @@ defmodule Module.Types.Apply do
461457 end
462458 end
463459
464- defp remote_apply ( :maps , :update , _info , [ key , value , map ] = args_types , stack ) do
465- case map_update ( map , key , value , false , false ) do
460+ defp remote_apply ( :maps , :keys , _info , [ map ] , stack ) do
461+ case map_to_list ( map , fn key , _value -> key end ) do
462+ { :ok , list_type } -> { :ok , return ( list_type , [ map ] , stack ) }
463+ :badmap -> { :error , badremote ( :maps , :keys , 1 ) }
464+ end
465+ end
466+
467+ defp remote_apply ( :maps , :put , _info , [ key , value , map ] = args_types , stack ) do
468+ case map_update ( map , key , value , false , true ) do
466469 { _value , descr , _errors } -> { :ok , return ( descr , args_types , stack ) }
467- :badmap -> { :error , badremote ( :maps , :update , 3 ) }
470+ :badmap -> { :error , badremote ( :maps , :put , 3 ) }
468471 { :error , _errors } -> { :error , { :badkeydomain , map , key , nil } }
469472 end
470473 end
@@ -500,6 +503,21 @@ defmodule Module.Types.Apply do
500503 end
501504 end
502505
506+ defp remote_apply ( :maps , :update , _info , [ key , value , map ] = args_types , stack ) do
507+ case map_update ( map , key , value , false , false ) do
508+ { _value , descr , _errors } -> { :ok , return ( descr , args_types , stack ) }
509+ :badmap -> { :error , badremote ( :maps , :update , 3 ) }
510+ { :error , _errors } -> { :error , { :badkeydomain , map , key , nil } }
511+ end
512+ end
513+
514+ defp remote_apply ( :maps , :values , _info , [ map ] , stack ) do
515+ case map_to_list ( map , fn _key , value -> value end ) do
516+ { :ok , list_type } -> { :ok , return ( list_type , [ map ] , stack ) }
517+ :badmap -> { :error , badremote ( :maps , :keys , 1 ) }
518+ end
519+ end
520+
503521 defp remote_apply ( _mod , _fun , info , args_types , stack ) do
504522 remote_apply ( info , args_types , stack )
505523 end
0 commit comments