# complete hack to generate stuff.
#
# We have Foo.hs, which generates 
#  - Program/Foo.hs (the Syntax defn)
#  - Definition/Foo.hs (the entries for the dictionary)
#  - Equation/Foo.hs  (the various derived equations)

foreach (@ARGV) {
  local $file = $_;
  open(FILE,"$file");
  $outfile = $file;
  if ($outfile =~ /^Library\/(.*)$/) {
    $outfile = $1;
  }
  open(OUTFILE,">Program/$outfile") || die "can not open Program/$outfile\n";
  local $mode = 0;
  local @defns = ();
  while(<FILE>) {
      if (/^([a-z]\S+)\s+::/) {
	  push(@defns,$1);
      }
      if ($mode == 0 && /^module ([^\s]+)(\s+.*)$/) {
	  $module = $1;
	  $fullmodule = $1;
	  $rest = $2;
	  print OUTFILE "module Program.$module";
	  $mode = 1;
	  if ($rest =~ /where\s*$/) {
	      print OUTFILE "$`where {\n";
	      $mode = 2;
	  } else {
	      print OUTFILE "$rest\n";
	  }
      } elsif ($mode == 1 && /^\s*\)\s*where/) {
	  print OUTFILE " where {";
	  $mode = 2;
      } elsif ($mode == 1 && /where/) {
	  print OUTFILE "$_ {";
	  $mode = 2;
      } elsif ($mode == 2 && (/^import/ || /^\s*$/)) {
	  print OUTFILE "$_;";
      } elsif ($mode == 2) {	  
	  print OUTFILE "import Language.Haskell.TH;\n";
	  print OUTFILE "\n";
	  print OUTFILE "import Language.Haskell.ER.Syntax;\n";
	  print OUTFILE "import Language.Haskell.ER.HaskellRewrite;\n";
	  print OUTFILE "import Language.Haskell.ER.MiscRewrite;\n";
	  print OUTFILE "import Language.Haskell.ER.Utils;\n";
	  print OUTFILE "import Language.Haskell.ER.Frees;\n";

	  $pkg_name = "main";
	  print "$fullmodule\n";
	  if ($fullmodule =~ /^GHC/) {
	  	  $pkg_name = "base";
	  }
	  print OUTFILE "defns = \$(quoteModule \"$pkg_name\" \"$fullmodule\" [d|\n";

	  print OUTFILE "-- automatically included\n\n\n";
	  print OUTFILE "$_";
	  $mode = 3;
      } elsif ($mode == 3) {
	  print OUTFILE "$_";
      } else {
	  print OUTFILE "-- $_";
      }
  }
  print OUTFILE "|])\n}\n\n";
  close(FILE);
  close(OUTFILE);
if (1) {
  open(OUTFILE,">Definition/$file");
  print OUTFILE "module Definition.$fullmodule where\n";
  print OUTFILE "\n";
  
  print OUTFILE "import Language.Haskell.TH\n";

  print OUTFILE "import Language.Haskell.ER.Syntax\n";
  print OUTFILE "import Language.Haskell.ER.HaskellRewrite\n";
  print OUTFILE "import Language.Haskell.ER.MiscRewrite\n";
  print OUTFILE "import Language.Haskell.ER.Utils\n";
  print OUTFILE "import Language.Haskell.ER.Frees\n";
  print OUTFILE "import Program.$fullmodule\n";
  if ($fullmodule !~ /^Prelude/) {
      print OUTFILE "import $fullmodule\n";
  }

  print OUTFILE "\n";
  print OUTFILE "dictionary :: [ UniHaskellRewrite ]\n";
  print OUTFILE "dictionary = map HaskellRewriteExp\n";
  $sep = '[';
  foreach (@defns) {
      print OUTFILE "\t$sep defn_$_\n";
      $sep = ',';
  }
  print OUTFILE "\t]\n\n";

  foreach (@defns) {
      print OUTFILE "defn_$_ :: HaskellRewrite Exp\n";
      if ($fullmodule =~ /^Prelude/) {
	  print OUTFILE "defn_$_ = defn 'Prelude.$_ Program.$fullmodule.defns\n\n"
      } else {
	  print OUTFILE "defn_$_ = defn '$fullmodule.$_ Program.$fullmodule.defns\n\n"
      }
  }
  close(OUTFILE);  
}
}
