@@ -12,39 +12,44 @@ defmodule Module.Types.Pattern do
1212 Returns the initial value for previous clause information.
1313 """
1414 def init_previous do
15- { [ ] , none ( ) }
15+ [ ]
1616 end
1717
18- defp empty_previous? ( { list , _descr } ) , do: list == [ ]
18+ defp empty_previous? ( [ ] ) , do: true
19+ defp empty_previous? ( [ _ | _ ] ) , do: false
1920
20- defp previous_subtype? ( _ , { [ ] , _ } ) , do: false
21+ defp previous_subtype? ( _ , [ ] ) , do: false
2122 defp previous_subtype? ( [ ] , _ ) , do: true
22- defp previous_subtype? ( [ type ] , { _ , descr } ) , do: subtype? ( type , descr )
23- defp previous_subtype? ( args , { _ , descr } ) , do: subtype? ( args_to_domain ( args ) , descr )
23+
24+ defp previous_subtype? ( [ type ] , previous ) ,
25+ do: subtype? ( type , Enum . reduce ( previous , none ( ) , & union ( & 2 , hd ( & 1 ) ) ) )
26+
27+ defp previous_subtype? ( args , previous ) do
28+ subtype? (
29+ args_to_domain ( args ) ,
30+ Enum . reduce ( previous , none ( ) , & union ( & 2 , args_to_domain ( & 1 ) ) )
31+ )
32+ end
2433
2534 defp concat_previous ( [ ] , previous ) ,
2635 do: previous
2736
28- defp concat_previous ( [ type ] , { list , descr } ) ,
29- do: { [ [ type ] | list ] , union ( type , descr ) }
30-
31- defp concat_previous ( types , { list , descr } ) ,
32- do: { [ types | list ] , union ( args_to_domain ( types ) , descr ) }
37+ defp concat_previous ( types , previous ) ,
38+ do: [ types | previous ]
3339
34- defp of_pattern_previous ( types , { [ ] , _ } , _trees , _pattern_info , _tag , _stack , _context ) do
40+ defp of_pattern_previous ( types , [ ] , _trees , _pattern_info , _tag , _stack , _context ) do
3541 { :ok , types }
3642 end
3743
38- defp of_pattern_previous ( types , { _ , descr } , trees , pattern_info , tag , stack , context ) do
44+ defp of_pattern_previous ( types , previous , trees , pattern_info , tag , stack , context ) do
3945 types =
4046 case types do
4147 [ type ] ->
42- [ difference ( type , descr ) ]
48+ [ Enum . reduce ( previous , type , & difference ( & 2 , hd ( & 1 ) ) ) ]
4349
4450 [ _ | _ ] ->
45- types
46- |> args_to_domain ( )
47- |> difference ( descr )
51+ previous
52+ |> Enum . reduce ( args_to_domain ( types ) , & difference ( & 2 , args_to_domain ( & 1 ) ) )
4853 |> domain_to_flat_args ( types )
4954 end
5055
@@ -57,7 +62,7 @@ defmodule Module.Types.Pattern do
5762 end
5863 end
5964
60- defp previous_to_string ( { previous , _ } ) do
65+ defp previous_to_string ( previous ) do
6166 Enum . map_join ( previous , "\n " , fn types ->
6267 types
6368 |> Enum . map_join ( ", " , & to_quoted_string / 1 )
0 commit comments