@@ -623,69 +623,15 @@ defmodule Protocol do
623623 protocol_def = change_protocol ( protocol_def , types )
624624 impl_for = change_impl_for ( impl_for , protocol , types )
625625 struct_impl_for = change_struct_impl_for ( struct_impl_for , protocol , types , structs )
626- new_signatures = new_signatures ( definitions , protocol_funs , protocol , types )
627626
628627 definitions = [ protocol_def , impl_for , impl_for! , struct_impl_for ] ++ definitions
629- signatures = Enum . into ( new_signatures , signatures )
630628 { :ok , definitions , signatures }
631629
632630 nil ->
633631 { :error , :not_a_protocol }
634632 end
635633 end
636634
637- defp new_signatures ( definitions , protocol_funs , protocol , types ) do
638- alias Module.Types.Descr
639-
640- clauses =
641- types
642- |> List . delete ( Any )
643- |> Enum . map ( fn impl ->
644- { [ Module.Types.Of . impl ( impl ) ] , Descr . atom ( [ __concat__ ( protocol , impl ) ] ) }
645- end )
646-
647- { domain , impl_for , impl_for! } =
648- case clauses do
649- [ ] ->
650- if Any in types do
651- clauses = [ { [ Descr . term ( ) ] , Descr . atom ( [ __concat__ ( protocol , Any ) ] ) } ]
652- { Descr . term ( ) , clauses , clauses }
653- else
654- { Descr . none ( ) , [ { [ Descr . term ( ) ] , Descr . atom ( [ nil ] ) } ] ,
655- [ { [ Descr . none ( ) ] , Descr . none ( ) } ] }
656- end
657-
658- _ ->
659- domain =
660- clauses
661- |> Enum . map ( fn { [ domain ] , _ } -> domain end )
662- |> Enum . reduce ( & Descr . union / 2 )
663-
664- not_domain = Descr . negation ( domain )
665-
666- if Any in types do
667- clauses =
668- clauses ++ [ { [ not_domain ] , Descr . atom ( [ __concat__ ( protocol , Any ) ] ) } ]
669-
670- { Descr . term ( ) , clauses , clauses }
671- else
672- { domain , clauses ++ [ { [ not_domain ] , Descr . atom ( [ nil ] ) } ] , clauses }
673- end
674- end
675-
676- new_signatures =
677- for { { _fun , arity } = fun_arity , :def , _ , _ } <- definitions ,
678- fun_arity in protocol_funs do
679- rest = List . duplicate ( Descr . term ( ) , arity - 1 )
680- { fun_arity , { :strong , nil , [ { [ domain | rest ] , Descr . dynamic ( ) } ] } }
681- end
682-
683- [
684- { { :impl_for , 1 } , { :strong , [ Descr . term ( ) ] , impl_for } } ,
685- { { :impl_for! , 1 } , { :strong , [ domain ] , impl_for! } }
686- ] ++ new_signatures
687- end
688-
689635 defp get_protocol_functions ( { _name , _kind , _meta , clauses } ) do
690636 Enum . find_value ( clauses , fn
691637 { _meta , [ :functions ] , [ ] , clauses } -> clauses
0 commit comments