#!/usr/bin/perl -w

use strict;
use Data::Dumper;

my @fl;
my @in;

my @add;
my %stuff;

my @ds;
#open PR, "<src/data/primitives.txt";
#while(<PR>) {
#    chomp;
#    next unless /\S/;
#    next if /^\s*#/;
#    my @a = split /\s*,\s*/;
#    push @ds, \@a;
#}

print "{- WARNING! Do not edit!!!\n";
print "   This code is autogenerated from src/data/*.txt! -}\n\n";
print "{-# Language NoOverloadedStrings #-}\n";

print "module Name.Prim where\n\n";
print "import Name.Name\n\n";

my %done;

my %rt;

foreach my $d (@ds) {
    my $ctype = $d->[1];
    my $hsname = $d->[0];
    my $sname = $hsname;
    my $rt = $ctype;
    $rt =~ s/^[su]//;
    $rt{$rt}++;
    $sname =~ s/(.*)\.([A-Za-z0-9]+)$/$2/ or die "improper name";
    my $mname = $1;
    next if $done{"tc_$sname"}++;
    next if $done{"dc_$sname"}++;
    print "{-# NOINLINE tc_$sname #-}\n";
    print "{- DO NOT EDIT! -}\n";
    print "tc_$sname = toName TypeConstructor (\"$mname\",\"$sname\")\n";
    print "{-# NOINLINE dc_$sname #-}\n";
    print "{- DO NOT EDIT! -}\n";
    print "dc_$sname = toName DataConstructor \"$sname#\"\n";
}

print "\n";

#foreach my $ort (sort keys %rt) {
#    my $rt = $ort;
#    $rt =~ s/[ <>]/_/g;
#    print "{-# NOINLINE rt_$rt #-}\n";
#    print "rt_$rt = toName RawType \"$ort\"\n";
#
#}

my ($nametype,$leader);
open my $fd, "<src/data/names.txt";
while(<$fd>) {
    chomp;
    next unless /\S/;
    next if /^\s*#/;
    ($nametype,$leader) = ($1,$2),next if /^([A-Za-z]+):([a-z]+):\s*$/;
    /^([_A-Za-z0-9]+)\s+(([0-9_A-Za-z.@]+)\.)?([-0-9*!)(#&|><=\/\+\.\,A-Za-z%:_\[\]]+)\s*$/ or die "unrecognized line $_";
    my ($name,$mod,$var) = ($1,$3,$4);
    $name = $leader . "_" . $name;
    next if $done{$name};
    print "{-# NOINLINE $name #-}\n";
    if (defined $mod) {
        print "$name = toName $nametype (\"$mod\",\"$var\")\n";
    } else {
        print "$name = toName $nametype \"$var\"\n";
    }

}

print "\n\n";
