@@ -495,4 +495,101 @@ defmodule Module.Types.Helpers do
495495  defp  zip_map_reduce ( [ ] ,  [ ] ,  list ,  acc ,  _fun )  do 
496496    { Enum . reverse ( list ) ,  acc } 
497497  end 
498+ 
499+   def  descr_size ( :term ) ,  do:  1 
500+ 
501+   def  descr_size ( % { }  =  descr )  do 
502+     Enum . reduce ( descr ,  0 ,  fn  { key ,  value } ,  acc  -> 
503+       acc  +  descr_size ( key ,  value ) 
504+     end ) 
505+   end 
506+ 
507+   def  descr_size ( list )  when  is_list ( list )  do 
508+     dnf_size ( list ) 
509+   end 
510+ 
511+   def  dnf_size ( dnf )  do 
512+     Enum . reduce ( dnf ,  0 ,  fn  { _tag ,  pos ,  negs } ,  acc  -> 
513+       negs_size  = 
514+         Enum . reduce ( negs ,  0 ,  fn  { _neg_tag ,  fields } ,  neg_acc  -> 
515+           neg_acc  +  1  +  map_size ( fields ) 
516+         end ) 
517+ 
518+       acc  +  1  +  map_size ( pos )  +  negs_size 
519+     end ) 
520+   end 
521+ 
522+   def  dnf_size_detailed ( dnf )  do 
523+     { total_pos ,  total_negs }  = 
524+       Enum . reduce ( dnf ,  { 0 ,  0 } ,  fn  { _tag ,  pos ,  negs } ,  { pos_acc ,  neg_acc }  -> 
525+         negs_size  = 
526+           Enum . reduce ( negs ,  0 ,  fn  { _neg_tag ,  fields } ,  neg_sum  -> 
527+             neg_sum  +  1  +  map_size ( fields ) 
528+           end ) 
529+ 
530+         { pos_acc  +  map_size ( pos ) ,  neg_acc  +  negs_size } 
531+       end ) 
532+ 
533+     { total_pos ,  total_negs } 
534+   end 
535+ 
536+   def  descr_size ( :tuple ,  dnf ) ,  do:  length ( dnf ) 
537+   def  descr_size ( :fun ,  bdd ) ,  do:  bdd_size ( bdd ) 
538+ 
539+   def  descr_size ( :map ,  dnf )  do 
540+     Enum . reduce ( dnf ,  0 ,  fn  { _tag ,  _pos ,  negs } ,  acc  -> 
541+       acc  +  1  +  length ( negs ) 
542+     end ) 
543+   end 
544+ 
545+   def  descr_size ( :list ,  dnf )  do 
546+     Enum . reduce ( dnf ,  0 ,  fn  { _ ,  _last ,  negs } ,  acc  -> 
547+       acc  +  1  +  length ( negs ) 
548+     end ) 
549+   end 
550+ 
551+   def  descr_size ( _ ,  _ ) ,  do:  1 
552+ 
553+   def  bdd_size ( { _fun ,  l ,  r } )  do 
554+     bdd_size ( l )  +  bdd_size ( r )  +  1 
555+   end 
556+ 
557+   def  bdd_size ( _bdd ) ,  do:  0 
558+ 
559+   def  list_dnf_size ( dnf )  do 
560+     Enum . reduce ( dnf ,  0 ,  fn  { _ ,  _ ,  negs } ,  _acc  -> 
561+       1  +  length ( negs ) 
562+     end ) 
563+   end 
564+ 
565+   # defp map_difference_check_sizes(dnf1, dnf2) do 
566+   #   {pos1, neg1} = Module.Types.Helpers.dnf_size_detailed(dnf1) 
567+   #   {pos2, neg2} = Module.Types.Helpers.dnf_size_detailed(dnf2) 
568+   #   IO.inspect({length(dnf1), pos1, neg1}, label: "dnf1 (clauses, pos, neg)") 
569+   #   IO.inspect({length(dnf2), pos2, neg2}, label: "dnf2 (clauses, pos, neg)") 
570+ 
571+   #   IO.puts("dnf1 breakdown:") 
572+ 
573+   #   Enum.with_index(dnf1, fn {tag, pos, negs}, idx -> 
574+   #     negs_size = 
575+   #       Enum.reduce(negs, 0, fn {_neg_tag, fields}, acc -> 
576+   #         acc + 1 + map_size(fields) 
577+   #       end) 
578+ 
579+   #     IO.inspect({idx, tag, map_size(pos), negs_size}, label: "  clause") 
580+   #     IO.puts(Module.Types.Descr.to_quoted_string(%{map: [{tag, pos, negs}]})) 
581+   #   end) 
582+ 
583+   #   IO.puts("dnf2 breakdown:") 
584+ 
585+   #   Enum.with_index(dnf2, fn {tag, pos, negs}, idx -> 
586+   #     negs_size = 
587+   #       Enum.reduce(negs, 0, fn {_neg_tag, fields}, acc -> 
588+   #         acc + 1 + map_size(fields) 
589+   #       end) 
590+ 
591+   #     IO.inspect({idx, tag, map_size(pos), negs_size}, label: "  clause") 
592+   #     IO.puts(Module.Types.Descr.to_quoted_string(%{map: [{tag, pos, negs}]})) 
593+   #   end) 
594+   # end 
498595end 
0 commit comments