@@ -913,57 +913,40 @@ defmodule Module.Types.Descr do
913913 # an empty list of atoms. It is simplified to `0` in set operations, and the key
914914 # is removed from the map.
915915
916- @ false_or_nil_atoms [
917- :sets . from_list ( [ false , nil ] , version: 2 ) ,
918- :sets . from_list ( [ nil ] , version: 2 ) ,
919- :sets . from_list ( [ false ] , version: 2 )
920- ]
921-
922- @ false_atoms :sets . from_list ( [ false ] , version: 2 )
923- @ true_atoms :sets . from_list ( [ true ] , version: 2 )
924-
925- @ doc """
926- Returns true if the type can never be true.
927- """
928- def never_true? ( :term ) , do: false
929-
930- def never_true? ( % { } = descr ) do
931- descr = Map . get ( descr , :dynamic , descr )
932-
933- case descr do
934- :term -> false
935- % { atom: { :union , % { true => _ } } } -> false
936- % { atom: { :union , _ } } -> true
937- % { atom: { :negation , % { true => _ } } } -> true
938- % { atom: { :negation , _ } } -> false
939- _ -> true
940- end
941- end
942-
943916 @ doc """
944917 Compute the booleaness of an element.
945918
946- It is either :undefined, :always_true, or :always_false.
919+ It is either `:none`, `:maybe_true` (therefore never false),
920+ `:maybe_false` (therefore never true), or `:maybe_both`.
921+
922+ This is an optimization against checking if a term is
923+ not disjoint on either true or false.
947924 """
948- def booleaness ( :term ) , do: :undefined
925+ def booleaness ( :term ) , do: :maybe_both
949926
950927 def booleaness ( % { } = descr ) do
951928 descr = Map . get ( descr , :dynamic , descr )
952929
953930 case descr do
954- % { atom: { :union , set } }
955- when map_size ( descr ) == 1 and set == @ false_atoms ->
956- :always_false
957-
958- % { atom: { :union , set } }
959- when map_size ( descr ) == 1 and set == @ true_atoms ->
960- :always_true
961-
962- _ ->
963- :undefined
931+ :term -> :maybe_both
932+ % { atom: { :union , % { true: _ , false: _ } } } -> :maybe_both
933+ % { atom: { :union , % { true: _ } } } -> :maybe_true
934+ % { atom: { :union , % { false: _ } } } -> :maybe_false
935+ % { atom: { :union , _ } } -> :none
936+ % { atom: { :negation , % { true: _ , false: _ } } } -> :none
937+ % { atom: { :negation , % { true: _ } } } -> :maybe_false
938+ % { atom: { :negation , % { false: _ } } } -> :maybe_true
939+ % { atom: { :negation , _ } } -> :maybe_both
940+ _ -> :none
964941 end
965942 end
966943
944+ @ false_or_nil_atoms [
945+ :sets . from_list ( [ false , nil ] , version: 2 ) ,
946+ :sets . from_list ( [ nil ] , version: 2 ) ,
947+ :sets . from_list ( [ false ] , version: 2 )
948+ ]
949+
967950 @ doc """
968951 Compute the truthiness of an element.
969952
0 commit comments