@@ -464,6 +464,26 @@ defmodule Module.Types.Descr do
464
464
465
465
defp iterator_difference_static ( :none , map ) , do: map
466
466
467
+ defp empty_difference_static? ( left , :term ) , do: not Map . has_key? ( left , :optional )
468
+
469
+ defp empty_difference_static? ( left , right ) do
470
+ iterator_empty_difference_static? ( :maps . next ( :maps . iterator ( unfold ( left ) ) ) , unfold ( right ) )
471
+ end
472
+
473
+ defp iterator_empty_difference_static? ( { key , v1 , iterator } , map ) do
474
+ case map do
475
+ % { ^ key => v2 } ->
476
+ value = difference ( key , v1 , v2 )
477
+ value in @ empty_difference or empty_key? ( key , value )
478
+
479
+ % { } ->
480
+ empty_key? ( key , v1 )
481
+ end and
482
+ iterator_empty_difference_static? ( :maps . next ( iterator ) , map )
483
+ end
484
+
485
+ defp iterator_empty_difference_static? ( :none , _map ) , do: true
486
+
467
487
# Returning 0 from the callback is taken as none() for that subtype.
468
488
defp difference ( :atom , v1 , v2 ) , do: atom_difference ( v1 , v2 )
469
489
defp difference ( :bitmap , v1 , v2 ) , do: v1 - ( v1 &&& v2 )
@@ -491,7 +511,7 @@ defmodule Module.Types.Descr do
491
511
def empty? ( :term ) , do: false
492
512
493
513
def empty? ( % { } = descr ) do
494
- case :maps . get ( :dynamic , descr , _default = descr ) do
514
+ case :maps . get ( :dynamic , descr , descr ) do
495
515
:term ->
496
516
false
497
517
@@ -511,9 +531,11 @@ defmodule Module.Types.Descr do
511
531
512
532
# For atom, bitmap, and optional, if the key is present,
513
533
# then they are not empty,
534
+ defp empty_key? ( :fun , value ) , do: fun_empty? ( value )
514
535
defp empty_key? ( :map , value ) , do: map_empty? ( value )
515
536
defp empty_key? ( :list , value ) , do: list_empty? ( value )
516
537
defp empty_key? ( :tuple , value ) , do: tuple_empty? ( value )
538
+ defp empty_key? ( :dynamic , value ) , do: empty? ( value )
517
539
defp empty_key? ( _ , _value ) , do: false
518
540
519
541
@ doc """
@@ -640,7 +662,7 @@ defmodule Module.Types.Descr do
640
662
end
641
663
642
664
defp subtype_static? ( same , same ) , do: true
643
- defp subtype_static? ( left , right ) , do: empty? ( difference_static ( left , right ) )
665
+ defp subtype_static? ( left , right ) , do: empty_difference_static? ( left , right )
644
666
645
667
@ doc """
646
668
Check if a type is equal to another.
0 commit comments