@@ -119,6 +119,11 @@ defmodule Module.Types.Apply do
119119 |> union ( tuple ( [ fun ( ) , args_or_arity ] ) )
120120 )
121121
122+ not_signature =
123+ for bool <- [ true , false ] do
124+ { [ atom ( [ bool ] ) ] , atom ( [ not bool ] ) }
125+ end
126+
122127 and_signature =
123128 for left <- [ true , false ] , right <- [ true , false ] do
124129 { [ atom ( [ left ] ) , atom ( [ right ] ) ] , atom ( [ left and right ] ) }
@@ -206,7 +211,7 @@ defmodule Module.Types.Apply do
206211 { :erlang , :map_size , [ { [ open_map ( ) ] , integer ( ) } ] } ,
207212 { :erlang , :node , [ { [ ] , atom ( ) } ] } ,
208213 { :erlang , :node , [ { [ pid ( ) |> union ( reference ( ) ) |> union ( port ( ) ) ] , atom ( ) } ] } ,
209- { :erlang , :not , [ { [ atom ( [ false ] ) ] , atom ( [ true ] ) } , { [ atom ( [ true ] ) ] , atom ( [ false ] ) } ] } ,
214+ { :erlang , :not , not_signature } ,
210215 { :erlang , :or , or_signature } ,
211216 { :erlang , :raise , [ { [ atom ( [ :error , :exit , :throw ] ) , term ( ) , raise_stacktrace ] , none ( ) } ] } ,
212217 { :erlang , :rem , [ { [ integer ( ) , integer ( ) ] , integer ( ) } ] } ,
@@ -263,14 +268,14 @@ defmodule Module.Types.Apply do
263268 [ { [ term ( ) , open_map ( ) ] , tuple ( [ atom ( [ :ok ] ) , term ( ) ] ) |> union ( atom ( [ :error ] ) ) } ] } ,
264269 { :maps , :get , [ { [ term ( ) , open_map ( ) ] , term ( ) } ] } ,
265270 { :maps , :is_key , [ { [ term ( ) , open_map ( ) ] , boolean ( ) } ] } ,
266- { :maps , :keys , [ { [ open_map ( ) ] , dynamic ( list ( term ( ) ) ) } ] } ,
271+ { :maps , :keys , [ { [ open_map ( ) ] , list ( term ( ) ) } ] } ,
267272 { :maps , :put , [ { [ term ( ) , term ( ) , open_map ( ) ] , open_map ( ) } ] } ,
268273 { :maps , :remove , [ { [ term ( ) , open_map ( ) ] , open_map ( ) } ] } ,
269274 { :maps , :take ,
270275 [ { [ term ( ) , open_map ( ) ] , tuple ( [ term ( ) , open_map ( ) ] ) |> union ( atom ( [ :error ] ) ) } ] } ,
271- { :maps , :to_list , [ { [ open_map ( ) ] , dynamic ( list ( tuple ( [ term ( ) , term ( ) ] ) ) ) } ] } ,
276+ { :maps , :to_list , [ { [ open_map ( ) ] , list ( tuple ( [ term ( ) , term ( ) ] ) ) } ] } ,
272277 { :maps , :update , [ { [ term ( ) , term ( ) , open_map ( ) ] , open_map ( ) } ] } ,
273- { :maps , :values , [ { [ open_map ( ) ] , dynamic ( list ( term ( ) ) ) } ] }
278+ { :maps , :values , [ { [ open_map ( ) ] , list ( term ( ) ) } ] }
274279 ] do
275280 [ arity ] = Enum . map ( clauses , fn { args , _return } -> length ( args ) end ) |> Enum . uniq ( )
276281
@@ -320,6 +325,20 @@ defmodule Module.Types.Apply do
320325 { :none , Enum . map ( args , fn _ -> term ( ) end ) , context }
321326 end
322327
328+ @ is_function_info { :strong , nil , [ { [ term ( ) , integer ( ) ] , boolean ( ) } ] }
329+
330+ def remote_domain ( :erlang , :is_function , [ _ , arity ] , expected , _meta , _stack , context )
331+ when is_integer ( arity ) and arity >= 0 do
332+ arg =
333+ case booleaness ( expected ) do
334+ :always_true -> fun ( arity )
335+ :always_false -> negation ( fun ( arity ) )
336+ :undefined -> term ( )
337+ end
338+
339+ { @ is_function_info , [ arg , integer ( ) ] , context }
340+ end
341+
323342 def remote_domain ( :erlang , :element , [ index , _ ] , expected , _meta , _stack , context )
324343 when is_integer ( index ) do
325344 tuple = open_tuple ( List . duplicate ( term ( ) , max ( index - 1 , 0 ) ) ++ [ expected ] )
0 commit comments